

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
<a name="cookbooks-101-basics-attributes"></a>

**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](https://repost.aws/) oder über den [AWS Premium-Support](https://aws.amazon.com/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](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-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](workingcookbook-attributes-precedence.md). 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 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](https://github.com/aws/opsworks-cookbooks). 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]`](attributes-recipes-apache.md#attributes-recipes-apache-user), außer Sie möchten den Attributwert überschreiben. Weitere Informationen finden Sie unter [Verwenden von benutzerdefinierten Rezeptbuchattributen](workingcookbook-cookbook-attributes.md).

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.

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

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

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

1. 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 OpsWorks Stacks bietet die Definition von Werten als Attribute einen zusätzlichen Vorteil. Sie können [benutzerdefiniertes JSON](workingstacks-json.md) 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](workingcookbook-attributes.md).

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](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional) 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.

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

1. Bearbeiten Sie `.kitchen.yml` und fügen Sie wie unter [Bedingungslogik](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional) beschrieben eine CentOS-Plattform zum Abschnitt mit den Plattformen hinzu.

1. 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.