Beispiel 5: Verwenden von Attributen - AWS OpsWorks

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispiel 5: Verwenden von Attributen

Wichtig

Der AWS OpsWorks Stacks Dienst hat am 26. Mai 2024 das Ende seiner Lebensdauer erreicht und wurde sowohl für neue als auch für bestehende Kunden deaktiviert. Wir empfehlen Kunden dringend, ihre Workloads so bald wie möglich auf andere Lösungen zu migrieren. Wenn Sie Fragen zur Migration haben, wenden Sie sich an das AWS Support Team auf AWS re:POST oder über den AWS Premium-Support.

Für die Rezepte in den vorherigen Abschnitten wurden stets fest programmierte Werte verwendet, außer für die Plattform. Diese Methode kann ungünstig sein, z. B. wenn Sie denselben Wert in mehreren Rezepten verwenden möchten. Sie können Werte getrennt von Rezepten definieren, indem Sie eine Attributdatei in das Rezeptbuch einbinden.

Eine Attributdatei ist eine Ruby-Anwendung, mit der Werte für ein oder mehrere Attribute zugewiesen werden. Die Datei muss im Rezeptbuch-Ordner attributes sein. Chef bindet die Attribute in das Knotenobjekt ein, sodass alle Rezepte diese Attributwerte durch Referenzierung des Attributs verwenden können. In diesem Thema wird gezeigt, wie Sie das Rezept aus Iteration für die Nutzung von Attributen anpassen. Hier ist zu Referenzzwecken das ursprüngliche Rezept.

[ "/srv/www/config", "/srv/www/shared" ].each do |path| directory path do mode 0755 owner 'root' group 'root' recursive true action :create end end

Nachfolgend werden Attribute für Unterverzeichnisnamen, Modus, Besitzer und Gruppenwerte definiert.

default['createdir']['shared_dir'] = 'shared' default['createdir']['config_dir'] = 'config' default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'

Beachten Sie Folgendes:

  • Jede Definition beginnt mit einem Attributtyp.

    Wenn ein Attribut mehr als einmal definiert ist — vielleicht in verschiedenen Attributdateien — gibt der Attributtyp die Priorität des Attributs an, die bestimmt, welche Definition in das Knotenobjekt aufgenommen wird. Weitere Informationen finden Sie unter Priorität von Attributen. Alle Definitionen in diesem Beispiel weisen den Attributtyp default auf, der üblicherweise für diesen Zweck verwendet wird.

  • Die Attribute haben verschachtelte Namen.

    Das Knotenobjekt ist im Wesentlichen eine Hash-Tabelle, die beliebig tief verschachtelt werden kann. Daher lassen sich auch Attributnamen verschachteln, was gängige Praxis ist. Diese Attributdatei folgt der Standardvorgehensweise und verwendet eine verschachtelte Datei mit dem Rezeptbuch-Namen createdir als erstes Element.

Hier wird "createdir" als erstes Element verwendet, weil bei der Chef-Ausführung die Attribute aus allen Rezeptbüchern in das Knotenobjekt eingebunden werden. Bei AWS OpsWorks Stacks enthält das Knotenobjekt zusätzlich zu allen von Ihnen definierten Attributen eine große Anzahl von Attributen aus den integrierten Kochbüchern. Durch das Einbeziehen des Rezeptbuch-Namens in den Attributnamen werden Namenskonflikte mit Attributen aus anderen Rezeptbüchern vermieden. Dies gilt besonders für Attributnamen wie port oder user. Vergeben Sie keine Attributnamen wie z. B. [:apache2][:user], außer Sie möchten den Attributwert überschreiben. Weitere Informationen finden Sie unter Verwenden von benutzerdefinierten Rezeptbuchattributen.

Im folgenden Beispiel wird das ursprüngliche Rezept mit Attributen anstelle von fest programmierten Werten gezeigt.

[ "/srv/www/#{node['createdir']['shared_dir']}", "/srv/www/#{node['createdir']['config_dir']}" ].each do |path| directory path do mode node['createdir']['mode'] owner node['createdir']['owner'] group node['createdir']['group'] recursive true action :create end end
Anmerkung

Wenn Sie einen Attributwert in eine Zeichenfolge einbinden möchten, umschließen Sie diesen mit #{}. Im vorigen Beispiel wird "shared" mit #{node['createdir']['shared_dir']} zu "/srv/www/" hinzugefügt.

So führen Sie das Rezept aus
  1. Führen Sie kitchen destroy aus, damit Sie mit einer neuen Instance beginnen können.

  2. Ersetzen Sie den Code in recipes/default.rb durch das vorige Rezeptbeispiel.

  3. Erstellen Sie für createdir das Unterverzeichnis attributes und fügen Sie die Datei default.rb mit den Attributdefinitionen hinzu.

  4. Bearbeiten Sie .kitchen.yml, um CentOS aus der Liste der Plattformen zu entfernen.

  5. Führen Sie kitchen converge aus und melden Sie sich anschließend an der Instance an, um zu prüfen, ob /srv/www/shared und /srv/www/config vorhanden sind.

Anmerkung

Bei AWS OpsWorks Stacks bietet die Definition von Werten als Attribute einen zusätzlichen Vorteil. Sie können benutzerdefiniertes JSON verwenden, um diese Werte pro Stack oder sogar pro Bereitstellung zu überschreiben. Dies kann in vielen Fällen sinnvoll sein, z. B. in den folgenden:

  • Sie können das Verhalten Ihrer Rezepte anpassen, wie z. B. die Konfigurationseinstellungen oder Benutzernamen, ohne das Rezeptbuch zu verändern.

    Beispielsweise können Sie dasselbe Rezeptbuch für unterschiedliche Stacks einsetzen und die wichtigsten Konfigurationseinstellungen für einen bestimmten Stack mit den benutzerdefinierten JSON-Daten angeben. Auf diese Weise müssen Sie weder die Zeit noch den Aufwand für eine Anpassung des Rezeptbuchs aufbringen noch für jeden Stack ein anderes Rezeptbuch verwenden.

  • Es ist nicht nötig, potenziell vertrauliche Informationen (wie z. B. Datenbank-Passwörter) im Rezeptbuch-Repository zu hinterlegen.

    Stattdessen können Sie mittels eines Attributs einen Standardwert festlegen und dann mit den benutzerdefinierten JSON-Daten diesen Wert mit dem echten Wert überschreiben.

Weitere Informationen zur Verwendung der benutzerdefinierten JSON-Daten zum Überschreiben von Attributen finden Sie unter Überschreiben der Attribute.

Die Attributdatei hat den Namen default.rb, da es sich um eine (wenn auch sehr einfache) Ruby-Anwendung handelt. Das heißt, Sie können beispielsweise mithilfe der Bedingungslogik die Attributwerte auf Basis des Betriebssystems angeben. Unter Bedingungslogik haben Sie einen anderen Unterverzeichnisnamen für die verschiedenen Linux-Familien im Rezept angegeben. Wenn Sie eine Attributdatei nutzen, können Sie stattdessen die Bedingungslogik in die Attributdatei einbinden.

In der folgenden Attributdatei wird mit value_for_platform ein anderer ['shared_dir']-Attributwert auf Basis des Betriebssystems angegeben. Für andere Bedingungen können Sie die if-elsif-else-Logik von Ruby oder eine case-Anweisung verwenden.

data_dir = value_for_platform( "centos" => { "default" => "shared" }, "ubuntu" => { "default" => "data" }, "default" => "user_data" ) default['createdir']['shared_dir'] = data_dir default['createdir']['config_dir'] = "config" default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'
So führen Sie das Rezept aus
  1. Führen Sie kitchen destroy aus, damit Sie mit einer neuen Instance beginnen können.

  2. Ersetzen Sie den Code in attributes/default.rb durch das vorherige Beispiel.

  3. Bearbeiten Sie .kitchen.yml und fügen Sie wie unter Bedingungslogik beschrieben eine CentOS-Plattform zum Abschnitt mit den Plattformen hinzu.

  4. Führen Sie kitchen converge aus und melden Sie sich anschließend an den Instances an, um zu prüfen, ob die Verzeichnisse vorhanden sind.

Wenn Sie fertig sind, führen Sie kitchen destroy aus, um die Instance zu beenden. Im nächsten Beispiel wird ein neues Rezeptbuch verwendet.