

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Exemple 6 : Création de fichiers
<a name="cookbooks-101-basics-files"></a>

**Important**  
Le AWS OpsWorks Stacks service a pris fin le 26 mai 2024 et a été désactivé tant pour les nouveaux clients que pour les clients existants. Nous recommandons vivement aux clients de migrer leurs charges de travail vers d'autres solutions dès que possible. Si vous avez des questions sur la migration, contactez l' AWS Support équipe sur [AWS Re:Post](https://repost.aws/) ou via le [AWS Support](https://aws.amazon.com/support) Premium.

Une fois que vous avez créé des répertoires, vous devez souvent le remplir avec les fichiers de configuration, les fichiers de données, etc. Cette rubrique présente deux façons d'installer les fichiers sur une instance.

**Topics**
+ [Installation d'un fichier à partir d'un livre de recettes](#cookbooks-101-basics-files-cookbook_file)
+ [Création d'un fichier à partir d'un modèle](#cookbooks-101-basics-files-template)

## Installation d'un fichier à partir d'un livre de recettes
<a name="cookbooks-101-basics-files-cookbook_file"></a>

La façon la plus simple d'installer un fichier sur une instance est d'utiliser une ressource [https://docs.chef.io/chef/resources.html#cookbook-file](https://docs.chef.io/chef/resources.html#cookbook-file) qui copie un fichier du livre de recettes dans un emplacement spécifié sur l'instance pour les systèmes Linux et Windows. Cet exemple étend la recette de [Exemple 3 : Création de répertoires](cookbooks-101-basics-directories.md) pour ajouter un fichier de données à `/srv/www/shared` après la création du répertoire. A titre de référence, voici la recette d'origine.

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

**Pour configurer le livre de recettes**

1. Dans le répertoire `opsworks_cookbooks`, créez un répertoire nommé `createfile` et accédez à celui-ci.

1. Ajoutez un fichier `metadata.rb` à `createfile` avec le contenu suivant.

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

1. Initialisez et configurez Test Kitchen, comme décrit dans [Exemple 1 : Installation des packages](cookbooks-101-basics-packages.md)et supprimez CentOS de la liste `platforms`.

1. Ajoutez un sous-répertoire `recipes` à `createfile`.

Le fichier à installer contient les données JSON suivantes.

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

**Pour configurer le fichier de données**

1. Ajoutez un sous-répertoire `files` à `createfile` et un sous-répertoire `default` à `files`. N'importe quel fichier installé avec `cookbook_file` doit être dans un sous-répertoire de `files`, par exemple `files/default` dans cet exemple. 
**Note**  
Si vous souhaitez spécifier des fichiers différents pour différents systèmes, vous pouvez mettre chaque fichier propre au système dans un sous-dossier nommé pour le système, par exemple `files/ubuntu`. La ressource `cookbook_file` copie le fichier propre au système approprié, s'il existe, et utilise le fichier `default` dans le cas contraire. Pour plus d'informations, consultez [cookbook\$1file](https://docs.chef.io/chef/resources.html#cookbook-file).

1. Créez un fichier nommé `example_data.json` avec le JSON de l'exemple précédent et ajoutez-le dans `files/default`.

La recette suivante copie `example_data.json` dans un emplacement spécifié. 

```
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
```

Une fois que la ressource du répertoire a créé `/srv/www/shared`, la ressource `cookbook_file` copie `example_data.json` dans ce répertoire et définit également l'utilisateur, le groupe et le mode du fichier. 

**Note**  
La ressource `cookbook_file` présente une nouvelle action : `create_if_missing`. Vous pouvez également utiliser une action `create`, mais elle remplace un fichier existant. Si vous ne souhaitez pas remplacer quoi que ce soit, utilisez `create_if_missing`, qui installe `example_data.json` uniquement s'il n'existe pas déjà.

**Pour exécuter la recette**

1. Exécutez `kitchen destroy` pour commencer avec une instance propre.

1. Créez un fichier `default.rb` qui contient la recette précédente et enregistrez-le dans `recipes`.

1. Exécutez `kitchen converge`, puis connectez-vous à l'instance pour vérifier que `/srv/www/shared` contient le fichier `example_data.json`.

## Création d'un fichier à partir d'un modèle
<a name="cookbooks-101-basics-files-template"></a>

La ressource `cookbook_file` est utile dans certains cas, mais elle installe simplement les fichiers qui se trouvent dans le livre de recettes. Une ressource [https://docs.chef.io/chef/resources.html#template](https://docs.chef.io/chef/resources.html#template) offre un moyen plus souple d'installer un fichier sur une instance Windows ou Linux en le créant dynamiquement à partir d'un modèle. Vous pouvez ensuite déterminer les détails du contenu du fichier lors de l'exécution et les modifier en fonction des besoins. Par exemple, vous pouvez faire en sorte qu'un fichier de configuration ait un paramètre spécifique lorsque vous démarrez l'instance, puis modifier ce paramètre plus tard lorsque vous ajoutez des instances à la pile.

Cet exemple modifie le livre de recettes `createfile` de façon à utiliser une ressource `template` pour installer une version légèrement modifiée de `example_data.json`.

Voici à quoi ressemblera le fichier installé.

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

Les ressources de modèle sont généralement utilisés conjointement aux fichiers d'attributs, c'est pourquoi l'exemple en utilise un pour définir les valeurs suivantes.

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

**Pour configurer le livre de recettes**

1. Supprimez le répertoire `createfile` du livre de recettes `files` et son contenu.

1. Ajoutez un sous-répertoire `attributes` à `createfile` et ajoutez un fichier `default.rb` à `attributes` avec les définitions d'attributs précédentes.

Un modèle est un fichier `.erb` qui est globalement une copie du fichier final, avec une partie du contenu représenté par les espaces réservés. Lorsque la ressource `template` crée le fichier, elle copie le contenu du modèle dans le fichier spécifié et remplace les espaces réservés par leurs valeurs attribuées. Voici le modèle pour `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'] %>"
}
```

Les valeurs `<%=...%>` sont des espaces réservés.
+ `<%=node[...]%>` représente une valeur d'attribut de nœud.

  Pour cet exemple, la valeur « your\$1name » est un espace réservé qui représente une des valeurs d'attributs du fichier d'attribut du livre de recettes.
+ `<%=@...%>` représente la valeur d'une variable qui est définie dans le modèle de ressource, comme nous le verrons bientôt.

**Pour créer le modèle de fichier**

1. Ajoutez un sous-répertoire `templates` au livre de recettes `createfile` et un sous-répertoire `default` à `templates`.
**Note**  
Le répertoire `templates` fonctionne globalement comme le répertoire `files`. Vous pouvez mettre des modèles propres au système dans un sous-répertoire comme `ubuntu` qui est nommé pour le système. La ressource `template` utilise le modèle propre au système approprié s'il existe et elle utilise le modèle `default` s'il n'existe pas.

1. Créez un fichier appelé `example_data.json.erb` et placez-le dans le répertoire `templates/default`. Le nom du modèle est arbitraire, mais vous le créez généralement en ajoutant `.erb` au nom du fichier, avec les extensions. 

La recette suivante utilise une ressource `template` pour créer `/srv/www/shared/example_data.json`. 

```
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
```

La ressource `template` crée `example_data.json` à partir d'un modèle et l'installe dans `/srv/www/shared`.
+ Le nom du modèle, `/srv/www/shared/example_data.json`, spécifie le chemin et le nom du fichier installé.
+ L'attribut `source` spécifie le modèle utilisé pour créer le fichier.
+ L'attribut `mode` spécifie le mode du fichier installé.
+ La ressource définit deux variables, `a_boolean_var` et `a_string_var`. 

  Lorsque la ressource crée `example_data.json`, elle remplace les espaces réservés des variables du modèle par les valeurs correspondantes issues de la ressource. 
+ L'attribut `only_if` *de protection* demande à la ressource de créer le fichier uniquement si `['createfile']['install_file']` est défini sur `true`.

**Pour exécuter la recette**

1. Exécutez `kitchen destroy` pour commencer avec une instance propre.

1. Remplacez le code de `recipes/default.rb` par l'exemple précédent.

1. Exécutez `kitchen converge`, puis connectez-vous à l'instance pour vérifier que le fichier se trouve dans `/srv/www/shared` et a le contenu correct.

Lorsque vous avez terminé, exécutez `kitchen destroy` pour arrêter l'instance. La section suivante utilise un nouveau livre de recettes.