

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 3 : Création de répertoires
<a name="cookbooks-101-basics-directories"></a>

**Important**  
Le AWS OpsWorks Stacks service a atteint sa fin de vie 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.

Lorsque vous installez un package sur une instance, vous devez souvent créer des fichiers de configuration et les placer dans les répertoires appropriés. Toutefois, ces répertoires peuvent ne pas exister à ce stade. De plus, vous devrez parfois créer des répertoires pour les données, les fichiers journaux, etc. Par exemple, vous démarrez d'abord le système Ubuntu que vous utilisez pour la plupart des exemples, le `/srv` répertoire ne contient aucun sous-répertoire. Si vous installez un serveur d'applications, vous aurez probablement besoin d'un répertoire `/srv/www/`, voire de quelques sous-répertoires pour les fichiers de données, les journaux, etc. La recette suivante crée `/srv/www/` sur une instance.

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

Vous utilisez une [ressource `directory`](https://docs.chef.io/chef/resources.html#directory) pour créer et configurer des répertoires sur les systèmes Linux et Windows, bien que certains attributs soient utilisés différemment. Le nom de la ressource est la valeur par défaut de l'attribut `path` de la ressource. L'exemple crée donc `/srv/www/` et spécifie ses propriétés `mode`, `owner` et `group`.

**Pour exécuter la recette**

1. Créez un répertoire dans `opsworks_cookbooks`, nommé `createdir` et accédez à celui-ci.

1. Initialisez et configurez Test Kitchen, comme décrit dans [Exemple 1 : Installation des packages](cookbooks-101-basics-packages.md) et ajoutez un répertoire `recipes` dans `createdir`.

1.  Ajoutez un fichier `default.rb` avec le code de recette dans le sous-répertoire `recipes` du livre de recettes. 

1. Exécutez `kitchen converge` pour exécuter la recette.

1. Exécutez `kitchen login`, accédez à `/srv` et vérifiez qu'il possède un sous-répertoire `www`.

1. Exécutez `exit` pour revenir à votre poste de travail, mais n'interrompez pas l'exécution de l'instance.

**Note**  
Pour créer un répertoire relatif à votre répertoire de base sur l'instance, utilisez `#{ENV['HOME']}` pour représenter le répertoire de base. Par exemple, ce qui suit crée le répertoire `~/shared`.  

```
directory "#{ENV['HOME']}/shared" do
  ...
end
```

Supposons que vous souhaitiez créer un répertoire plus imbriqué, par exemple `/srv/www/shared`. Vous pouvez modifier la recette précédente comme suit.

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

**Pour exécuter la recette**

1.  Remplacez le code de `default.rb` par la recette précédente. 

1. Exécutez `kitchen converge` à partir du répertoire `createdir`.

1. Pour vérifier que le répertoire a bien été créé, exécutez `kitchen login`, accédez à `/srv/www` et vérifiez qu'il contient un sous-répertoire `shared`. 

1. Exécutez `kitchen destroy` pour arrêter l'instance.

Vous remarquerez que la commande `kitchen converge` a été exécutée nettement plus rapidement. En effet, l'instance est déjà en cours d'exécution et il n'est donc pas nécessaire de la démarrer, d'installer Chef, etc. Test Kitchen se contente de copier le livre de recettes mis à jour sur l'instance et démarre une exécution de Chef.

Exécutez maintenant `kitchen converge` à nouveau afin d'exécuter la recette sur une nouvelle instance. Vous voyez maintenant le résultat suivant.

```
Chef Client failed. 0 resources updated in 1.908125788 seconds       
[2014-06-20T20:54:26+00:00] ERROR: directory[/srv/www/shared] (createdir::default line 1) had an error: Chef::Exceptions::EnclosingDirectoryDoesNotExist: Parent directory /srv/www does not exist, cannot create /srv/www/shared       
[2014-06-20T20:54:26+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)       
>>>>>> Converge failed on instance <default-ubuntu-1204>.
>>>>>> Please see .kitchen/logs/default-ubuntu-1204.log for more details
>>>>>> ------Exception-------
>>>>>> Class: Kitchen::ActionFailed
>>>>>> Message: SSH exited (1) for command: [sudo -E chef-solo --config /tmp/kitchen/solo.rb --json-attributes /tmp/kitchen/dna.json  --log_level info]
>>>>>> ----------------------
```

Que s’est-il passé ? Le problème est que, par défaut, une ressource `directory` peut créer un seul répertoire à la fois ; elle ne peut pas créer de chaîne de répertoires. La raison pour laquelle la recette a fonctionné plus tôt est que la première recette que vous avez exécutée sur l'instance a déjà créé `/srv/www`, c'est pourquoi la création de `/srv/www/shared` a créé un seul sous-répertoire.

**Note**  
Lorsque vous exécutez `kitchen converge`, veillez à savoir si vous exécutez vos recettes sur une nouvelle instance ou sur une instance existante. Vous obtiendrez peut-être des résultats différents.

Pour créer une chaîne de sous-répertoires, ajoutez un attribut `recursive` à `directory` et définissez-le sur `true`. La recette suivante crée `/srv/www/shared` directement sur une instance propre.

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