Exemple 5 : Utilisation d'attributs - 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 5 : Utilisation d'attributs

Important

Le AWS OpsWorks Stacks service a atteint sa fin de vie le 26 mai 2024 et a été désactivé pour les nouveaux clients et 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.

Les recettes des sections précédentes ont utilisé des valeurs codées en dur pour tout ce qui n'était pas la plateforme. Cette approche peut être gênante si, par exemple, vous souhaitez utiliser la même valeur dans plusieurs recettes. Vous pouvez définir des valeurs séparément à partir des recettes en incluant un fichier d'attribut dans votre livre de recettes.

Un fichier d'attribut est une application Ruby qui attribue des valeurs à un ou plusieurs attributs. Il doit se trouver dans le dossier attributes du livre de recettes. Chef intègre les attributs dans l'objet de nœud et n'importe quelle recette peut utiliser les valeurs d'attribut en référençant ce dernier. Cette rubrique montre comment modifier la recette de Itération afin d'utiliser les attributs. Voici la recette d'origine à titre de référence.

[ "/srv/www/config", "/srv/www/shared" ].each do |path| directory path do mode 0755 owner 'root' group 'root' recursive true action :create end end

Ce qui suit définit les attributs pour le nom du sous-répertoire, le mode, le propriétaire et les valeurs de groupe.

default['createdir']['shared_dir'] = 'shared' default['createdir']['config_dir'] = 'config' default['createdir']['mode'] = 0755 default['createdir']['owner'] = 'root' default['createdir']['group'] = 'root'

Notez ce qui suit :

  • Chaque définition commence par un type d'attribut.

    Si un attribut est défini plusieurs fois, par exemple dans différents fichiers d'attributs, le type d'attribut indique la priorité de l'attribut, qui détermine la définition incorporée dans l'objet nœud. Pour plus d’informations, consultez Priorité des attributs. Toutes les définitions de cet exemple ont le type d'attribut default, qui est le type habituel pour ces cas de figure.

  • Les attributs ont des noms imbriqués.

    L'objet de nœud est en fait une table de hachage qui peut s'imbriquer profondément de façon arbitraire, afin que les noms d'attributs puissent être imbriqués et le soient souvent. Ce fichier d'attribut suit une pratique standard d'utilisation d'un nom imbriqué avec le nom du livre de recettes, createdir, comme premier élément.

Vous utiliserez généralement createdir comme premier élément de l'attribut car, lors de l'exécution de Chef, ce dernier intègre ainsi les attributs de chaque livre de recettes dans l'objet de nœud. Avec AWS OpsWorks Stacks, l'objet node inclut un grand nombre d'attributs issus des livres de recettes intégrés, en plus de tous les attributs que vous définissez. Le fait d'inclure le nom du livre de recettes dans le nom d'attribut réduit le risque de conflits de noms avec les attributs d'un autre livre de recettes, surtout si votre attribut a un nom tel que port ou user. Ne nommez pas un attribut de la façon suivante [:apache2][:user], par exemple, sauf si vous voulez remplacer cette valeur d'attribut. Pour plus d’informations, consultez Utilisation d'attributs personnalisés de livres de recettes.

L'exemple suivant montre la recette originale qui utilise des attributs au lieu des valeurs codées en dur.

[ "/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
Note

Si vous souhaitez intégrer une valeur d'attribut dans une chaîne, encapsulez-la avec #{}. Dans l'exemple précédent, #{node['createdir']['shared_dir']} ajoute « shared » à « /srv/www/ ».

Pour exécuter la recette
  1. Exécutez kitchen destroy pour commencer avec une instance propre.

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

  3. Créez un sous-répertoire de createdir nommé attributes et ajoutez un fichier nommé default.rb qui contient les définitions d'attribut.

  4. Modifiez .kitchen.yml pour supprimer CentOS de la liste des plateformes.

  5. Exécutez kitchen converge, puis connectez-vous aux instances et vérifiez que les répertoires /srv/www/shared et /srv/www/config sont là.

Note

Avec AWS OpsWorks Stacks, définir des valeurs sous forme d'attributs offre un avantage supplémentaire ; vous pouvez utiliser du JSON personnalisé pour remplacer ces valeurs par pile ou même par déploiement. Cela peut être utile pour différents objectifs, notamment les suivants :

  • Vous pouvez personnaliser le comportement de vos recettes, par exemple les paramètres de configuration ou les noms d'utilisateur, sans devoir modifier le livre de recettes.

    Vous pouvez, par exemple, utiliser le même livre de recettes pour différentes piles et le JSON personnalisé pour spécifier les paramètres de configuration clés pour une pile particulière. Cela vous permet d'économiser du temps et des efforts nécessaires pour modifier le livre de recettes ou d'utiliser un autre livre de recettes pour chaque pile.

  • Vous n'avez pas à mettre les informations potentiellement sensibles telles que les mots de passe de base de données dans votre référentiel de livres de recettes.

    Vous pouvez en revanche utiliser un attribut pour définir une valeur par défaut, puis utiliser le JSON personnalisé pour remplacer cette valeur par la valeur réelle.

Pour plus d'informations sur l'utilisation du JSON personnalisé pour remplacer les attributs, consultez Remplacement des attributs.

Le fichier d'attribut est nommé default.rb parce que c'est une application Ruby, malgré sa simplicité. Cela signifie que vous pouvez, par exemple, utiliser la logique conditionnelle pour spécifier des valeurs d'attributs basées sur le système d'exploitation. Dans Logique conditionnelle, vous avez spécifié un nom de sous-répertoire différents pour différentes familles de Linux dans la recette. Avec un fichier d'attribut, vous pouvez plutôt mettre la logique conditionnelle dans le fichier d'attribut.

Le fichier d'attribut suivant utilise value_for_platform pour spécifier une autre valeur d'attribut ['shared_dir'] en fonction du système d'exploitation. Pour d'autres conditions, vous pouvez utiliser la logique if-elsif-else ou une instruction case de Ruby.

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'
Pour exécuter la recette
  1. Exécutez kitchen destroy pour commencer avec une instance propre.

  2. Remplacez le code de attributes/default.rb par l'exemple précédent.

  3. Modifiez .kitchen.yml pour ajouter une plateforme CentOS à la section des plateformes, comme décrit dans Logique conditionnelle.

  4. Exécutez kitchen converge, puis connectez-vous aux instances afin de vérifier que les répertoires sont là.

Une fois que vous avez terminé, exécutez kitchen destroy pour résilier l'instance. L'exemple suivant utilise un nouveau livre de recettes.