Chef - Wie berechnet man Attribute aus knotenspezifischen Werten?

7

Angenommen, ich habe ein Kochbuch, das einen magischen Deamon konfiguriert und installiert:

magisch-deamon / rezepte / default.rb:

template "/etc/magical-deamon/magical.conf" do
    source "magical.conf"
    mode 0644
    notifies :restart, resources(:service => "magical-deamon")
end

magisch-deamon / attribute / default.rb:

default['magical-deamon']['memory'] = 1024

magic-deamon / templates / default / magic.conf.erb:

memory = <%= node['magical-deamon']['memory'] %>

Wie ich Chef verstanden habe, würde ich entweder die Knotenattribute verwenden, um den Speicherwert wie folgt festzulegen:

{
    "normal": {
        "tags": [],
        "magical-deamon": {
            "memory": 256
        }
    },
    "name": "server.example.com",
    "chef_environment": "production",
    "run_list": [
        "role[base]"
    ]
}

Oder durch eine Rolle:

{
    "name": "base",
    "default_attributes": {
        "magical-deamon": {
                "memory": 756
            }
    },
    "json_class": "Chef::Role",
    "env_run_lists": {
    },
    "run_list": [
    ],
    "description": "base role applied to all nodes",
    "chef_type": "role",
    "override_attributes": {
    },
  }
}

Oder eine Umgebung:

{
  "name": "production",
  "default_attributes": {
    "magical-deamon": {
        "memory": 756
    }
  },
  "json_class": "Chef::Environment",
  "description": "",
  "cookbook_versions": {
  },
  "override_attributes": {
  },
  "chef_type": "environment"
}

So weit, ist es gut...

Jetzt hatte ich die dumme Idee, 'Speicher' auf einen knotenspezifischen dynamischen Wert zu setzen.

Nehmen wir an, unser magischer Deamon sollte 75% des gesamten Speichers des Knotens verbrauchen.

value = total_memory * 0.75

Ich komme aus einem Programmierer-Hintergrund und lasse dieses Wissen gerne aus dem Kochbuch heraus, weil ich mein Kochbuch mag, das für andere Leute wiederverwendbar ist.

Ich dachte, der richtige Ort wäre irgendwo, wo Attribute gesetzt werden. Eine solche Berechnung in json oder ruby ​​dsl ist jedoch nicht möglich.

Meine Fragen sind also:

  • Ist mein allgemeiner Ansatz (value = total_memory * 0.75) eine dumme Idee?
  • Wie würden Sie diese Art von Attribut einstellen? Denken Sie daran: Es wird mehr als einen Wert und einen Knoten geben :) Und es kann eine Berechnung mit MB -> KB und Rundung usw. geben. Jedes Attribut fest in das Rezept einzubinden, sollte keine Option sein;)
Alexander Jäger
quelle

Antworten:

10

Ich bin nicht so begeistert von der Idee von total_memory, dass es sich um eine indirekte Größe handelt. Vielleicht macht es im Zusammenhang mit dem magischen Dämon mehr Sinn.

Bei einstellbaren Attributen wie dem Gesamtspeicher würde ich so ziemlich das tun, was Sie in der Frage dargelegt haben, indem ich Attribute / default.rb einen sinnvollen Standardwert hinzufügt (reduziert Support-Fragen, wenn jemand vergisst, einen Wert explizit festzulegen) und überschreibe mit ggf. umgebungs-, rollen- oder knotenspezifische Werte.

Es ist möglich, innerhalb der ERB-Datei wie folgt zu rechnen:

memory = <%= (node['memory']['total'][0..-3].to_i / 1024) * 
             node['magical-daemon']['memory'] %>

Ohai stellt die Statistik von free (1) zur Verfügung, die den Gesamtspeicher in kB enthält. Knoten ['Speicher'] ['Gesamt'] = '12312432kB' auf meiner Workstation.

Ich versuche auch, Attribute mit der niedrigsten Priorität so weit wie möglich zu verwenden, dh ich bevorzuge Standard gegenüber normalen Attributen und normale Attribute gegenüber Überschreibungsattributen. Damit,

  • Wählen Sie nach Möglichkeit eine sinnvolle Rezeptvorgabe
  • Verwenden Sie ein Standardumgebungsattribut (im Beispiel verwenden Sie ein Überschreibungsattribut).
  • Verwenden Sie ein Rollenattribut für Gruppen von Knoten (wieder verwenden Sie ein Überschreibungsattribut).
  • und schließlich Standardknotenattribut

Die Reihenfolge, in der sich die Attribute gegenseitig überschreiben, finden Sie unter dem Link zur Priorität von Attributen im Chef-Wiki.

Wenn Sie nach Möglichkeit die Standardattribute mit der niedrigsten Priorität verwenden, können Sie den Attributwert abhängig von der Umgebung, der Rolle und dem Knoten festlegen. Die oberen Prioritätsebenen werden jedoch freigegeben, wenn Sie etwas Schwieriges tun müssen.

Tim Potter
quelle
1. Danke, dass du die Reihenfolge der Attribute geklärt hast! Das hat sehr geholfen! 2. Der magische Deamon kann ein Memcached oder ein Mysqld sein, bei dem ich den Wert entsprechend den Ressourcen festlegen möchte. 3. Wenn ich Ihren "ERB-Ansatz" verwende, binde ich das Kochbuch an meine Konfigration, was die Wiederverwendbarkeit beeinträchtigt. 4. Aber ich denke, Sie haben mit dem "ERB-Ansatz" einen gültigen Punkt erreicht, da ich ein Ruby Noob bin. Gibt es eine Möglichkeit, Helfer in den ERB aufzunehmen? Dann könnte ich so etwas wie 'function (total_memory * 75)' setzen und den Helfer zum Berechnen verwenden.
Alexander Jäger
1
Guter Punkt über Memcached und MySQL. Es ist sehr sinnvoll, den gesamten Speicher des Knotens zu nutzen. Mir ist klar, dass ich nicht so denke, weil ich hauptsächlich an Rezepten auf Systemebene (Netzwerk und Authentifizierung) arbeite und die Anwendungsmitarbeiter die Dinge auf Service-Ebene erledigen.
Tim Potter
Tim hat dort die Antwort, denke ich. Sie können auch sehen, wie Elasticsearch dasselbe tut: github.com/elasticsearch/cookbook-elasticsearch/blob/master/…
jonathanserafini