

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 6: Erstellen von Dateien
<a name="cookbooks-101-basics-files"></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).

Nachdem Sie Verzeichnisse erstellt haben, müssen diese meist mit Konfigurationsdateien, Datendateien usw. gefüllt werden. In diesem Thema werden zwei Möglichkeiten vorgestellt, mit denen Sie Dateien auf einer Instance installieren können.

**Topics**
+ [Installieren einer Datei mithilfe eines Rezeptbuchs](#cookbooks-101-basics-files-cookbook_file)
+ [Erstellen einer Datei mithilfe einer Vorlage](#cookbooks-101-basics-files-template)

## Installieren einer Datei mithilfe eines Rezeptbuchs
<a name="cookbooks-101-basics-files-cookbook_file"></a>

Die einfachste Möglichkeit zum Installieren einer Datei auf einer Instance bietet eine [https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file)-Ressource, mit der eine Datei aus dem Rezeptbuch kopiert und am angegebenen Speicherort auf der Instance eingefügt wird (dies gilt für Linux- und Windows-Systeme). In diesem Beispiel wird das in [Beispiel 3: Erstellen von Verzeichnissen](cookbooks-101-basics-directories.md) verwendete Rezept erweitert, um nach der Verzeichniserstellung eine Datendatei `/srv/www/shared` hinzuzufügen. Hier ist zu Referenzzwecken das ursprüngliche Rezept.

```
directory "/srv/www/shared" do
  mode 0755
  owner 'root'
  group 'root'
  recursive true
  action :create
end
```

**So richten Sie das Rezeptbuch ein**

1. Erstellen Sie ein Verzeichnis in `opsworks_cookbooks` namens `createfile` und öffnen Sie es.

1. Fügen Sie eine Datei `metadata.rb` zu `createfile` mit dem folgenden Inhalt hinzu:

   ```
   name "createfile"
   version "0.1.0"
   ```

1. Initialisieren und konfigurieren Sie Test Kitchen wie unter [Beispiel 1: Installieren von Paketen](cookbooks-101-basics-packages.md) beschrieben und entfernen Sie CentOS aus der Liste `platforms`.

1. Fügen Sie ein Unterverzeichnis `recipes` zu `createfile` hinzu.

Die zu installierende Datei enthält folgende JSON-Daten.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true
}
```

**So richten Sie die Datendatei ein**

1. Fügen Sie ein Unterverzeichnis `files` zu `createfile` und ein Unterverzeichnis `default` zu `files` hinzu. Alle Dateien, die Sie mit `cookbook_file` installieren, müssen in einem Unterverzeichnis von `files` sein – in diesem Beispiel in `files/default`. 
**Anmerkung**  
Falls Sie unterschiedliche Dateien für verschiedene Systeme angeben möchten, können Sie die einzelnen systemspezifischen Dateien in einem Unterordner platzieren, der nach dem jeweiligen System benannt ist (z. B. `files/ubuntu`). Von der `cookbook_file`-Ressource wird dann die geeignete systemspezifische Datei kopiert, sofern vorhanden. Andernfalls wird die Datei `default` verwendet. Weitere Informationen finden Sie unter [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file).

1. Erstellen Sie eine Datei `example_data.json` mit dem JSON-Objekt aus dem vorigen Beispiel und fügen Sie sie zu Verzeichnis `files/default` hinzu.

Mit folgendem Rezept wird `example_data.json` an einen angegebenen Speicherort kopiert. 

```
directory "/srv/www/shared" do
  mode 0755
  owner 'root'
  group 'root'
  recursive true
  action :create
end

cookbook_file "/srv/www/shared/example_data.json" do
  source "example_data.json"
  mode 0644
  action :create_if_missing
end
```

Nachdem von der Verzeichnisressource das Verzeichnis `/srv/www/shared` erstellt wurde, kopiert die Ressource `cookbook_file` die Datei `example_data.json` in das Verzeichnis und legt zudem den Benutzer, die Gruppe und den Modus für die Datei fest. 

**Anmerkung**  
Mit der `cookbook_file`-Ressource wird eine neue Aktion eingeführt: `create_if_missing`. Sie könnten auch eine `create`-Aktion verwenden, aber diese würde eine vorhandene Datei überschreiben. Falls nichts überschrieben werden soll, verwenden Sie `create_if_missing`. Damit wird die Datei `example_data.json` nur installiert, wenn sie nicht bereits vorhanden ist.

**So führen Sie das Rezept aus**

1. Führen Sie `kitchen destroy` aus, damit Sie mit einer neuen Instance beginnen können.

1. Erstellen Sie die Datei `default.rb`, die das vorherige Rezept enthält, und speichern Sie diese in `recipes`.

1. Führen Sie `kitchen converge` aus und melden Sie sich anschließend an der Instance an, um zu prüfen, ob die Datei `/srv/www/shared` in `example_data.json` vorhanden ist.

## Erstellen einer Datei mithilfe einer Vorlage
<a name="cookbooks-101-basics-files-template"></a>

Die `cookbook_file`-Ressource ist für einige Zwecke sehr gut geeignet, jedoch werden von ihr alle im Rezeptbuch vorhandenen Dateien installiert. Eine [https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template)-Ressource bietet eine flexiblere Methode, um eine Datei auf einem Windows- oder Linux-System zu installieren, da die Datei dynamisch aus einer Vorlage erstellt wird. Somit können Sie die Inhalte der Datei zur Laufzeit bestimmen und bei Bedarf ändern. Beispielsweise können Sie beim Start einer Instance eine bestimmte Einstellung in der Konfigurationsdatei vorgeben und diese später ändern, wenn Sie weitere Instances zum Stack hinzufügen.

Im Beispiel wird das Rezeptbuch `createfile` so angepasst, dass mit einer `template`-Ressource eine leicht abgewandelte Version von `example_data.json` installiert wird.

So sieht die installierte Datei aus.

```
{
  "my_name" : "myname",
  "your_name" : "yourname",
  "a_number" : 42,
  "a_boolean" : true,
  "a_string" : "some string",
  "platform" : "ubuntu"
}
```

"template"-Ressourcen werden in der Regel in Verbindung mit Attributdateien verwendet, daher wird auch in diesem Beispiel eine zur Definition der folgenden Werte genutzt.

```
default['createfile']['my_name'] = 'myname'
default['createfile']['your_name'] = 'yourname'
default['createfile']['install_file'] = true
```

**So richten Sie das Rezeptbuch ein**

1. Löschen Sie das Verzeichnis `createfile` und dessen Inhalte aus dem Rezeptbuch `files`.

1. Fügen Sie das Unterverzeichnis `attributes` zu `createfile` hinzu. Fügen Sie außerdem die Datei `default.rb` mit den vorherigen Attributdefinitionen zu `attributes` hinzu.

Bei einer Vorlage handelt es sich um eine `.erb`-Datei, die im Grunde genommen eine Kopie der letzten Datei ist, in der einige Inhalte durch Platzhalter dargestellt werden. Bei der Dateierstellung mithilfe der `template`-Ressource werden die Vorlageninhalte in die angegebene Datei kopiert und die Platzhalter mit den zugewiesenen Werten überschrieben. Hier ist die Vorlage für `example_data.json`.

```
{
  "my_name" : "<%= node['createfile']['my_name'] %>",
  "your_name" : "<%= node['createfile']['your_name'] %>",
  "a_number" : 42,
  "a_boolean" : <%= @a_boolean_var %>,
  "a_string" : "<%= @a_string_var %>",
  "platform" : "<%= node['platform'] %>"
}
```

Die Werte `<%=...%>` sind die Platzhalter.
+ `<%=node[...]%>` stellt den Wert eines Knotenattributs dar.

  In diesem Beispiel ist der Wert "your\$1name" ein Platzhalter für einen Attributwert aus der Attributdatei des Rezeptbuchs.
+ `<%=@...%>` stellt den Wert einer Variable dar, die in der "template"-Ressource definiert ist (wird später erläutert).

**So erstellen Sie die Vorlagendatei**

1. Fügen Sie ein Unterverzeichnis `templates` zu dem Rezeptbuch `createfile` und ein Unterverzeichnis `default` zu `templates` hinzu.
**Anmerkung**  
Das Verzeichnis `templates` funktioniert auf die gleiche Weise wie das Verzeichnis `files`. Sie können systemspezifische Vorlagen in einem Unterverzeichnis, das z. B. wie `ubuntu` nach dem jeweiligen System benannt ist, speichern. Von der `template`-Ressource wird dann die geeignete systemspezifische Datei genutzt, sofern vorhanden. Andernfalls wird die Vorlage `default` verwendet.

1. Erstellen Sie eine Datei namens `example_data.json.erb` und legen Sie sie in das Verzeichnis `templates/default`. Der Vorlagenname ist beliebig wählbar, wird aber durch die Dateinamenerweiterung `.erb` (einschließlich anderer Erweiterungen) gekennzeichnet. 

Das folgende Rezept verwendet eine `template`-Ressource, um `/srv/www/shared/example_data.json` zu erstellen. 

```
directory "/srv/www/shared" do
  mode 0755
  owner 'root'
  group 'root'
  recursive true
  action :create
end

template "/srv/www/shared/example_data.json" do
  source "example_data.json.erb"
  mode 0644
  variables(
    :a_boolean_var => true,
    :a_string_var => "some string"
  )
  only_if {node['createfile']['install_file']}
end
```

Von der `template`-Ressource wird mithilfe einer Vorlage die Datei `example_data.json` erstellt und in `/srv/www/shared` installiert.
+ Der Vorlagenname `/srv/www/shared/example_data.json` gibt den Pfad und den Namen der installierten Datei an.
+ Das `source`-Attribut gibt die Vorlage an, mit der die Datei erstellt wurde.
+ Das `mode`-Attribut gibt den Modus der installierten Datei an.
+ Die Ressource definiert die beiden Variablen `a_boolean_var` und `a_string_var`. 

  Wenn die Datei `example_data.json` von der Ressource erstellt wird, werden die Variablenplatzhalter in der Vorlage mit den entsprechenden Werten aus der Ressource überschrieben. 
+ Mit dem `only_if` *-Wächterattribut* wird die Ressource angewiesen, die Datei nur zu erstellen, sofern `['createfile']['install_file']` auf den Wert `true` gesetzt ist.

**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 vorherige Beispiel.

1. Führen Sie `kitchen converge` aus und melden Sie sich anschließend an der Instance an, um zu prüfen, ob die Datei in `/srv/www/shared` mit dem korrekten Inhalt vorhanden ist.

Wenn Sie fertig sind, führen Sie `kitchen destroy` aus und fahren damit die Instance herunter. Im nächsten Abschnitt wird ein neues Rezeptbuch verwendet.