Exemple 3 : Création de répertoires - AWS OpsWorks

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

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 ou via le AWS 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 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.

  2. Initialisez et configurez Test Kitchen, comme décrit dans Exemple 1 : Installation des packages et ajoutez un répertoire recipes dans createdir.

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

  4. Exécutez kitchen converge pour exécuter la recette.

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

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

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

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

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