

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
<a name="cookbooks-101-basics-attributes"></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.

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](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-iteration) 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 de plus amples informations, veuillez consulter [Priorité des attributs](workingcookbook-attributes-precedence.md). 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 OpsWorks Stacks, l'objet node inclut un grand nombre d'attributs issus des [livres de recettes intégrés](https://github.com/aws/opsworks-cookbooks), en plus des 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]`](attributes-recipes-apache.md#attributes-recipes-apache-user), par exemple, sauf si vous voulez remplacer cette valeur d'attribut. Pour de plus amples informations, veuillez consulter [Utilisation d'attributs personnalisés de livres de recettes](workingcookbook-cookbook-attributes.md).

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.

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

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

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

1. 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 OpsWorks Stacks, définir des valeurs sous forme d'attributs offre un avantage supplémentaire ; vous pouvez utiliser du [JSON personnalisé](workingstacks-json.md) 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](workingcookbook-attributes.md).

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](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional), 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.

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

1. Modifiez `.kitchen.yml` pour ajouter une plateforme CentOS à la section des plateformes, comme décrit dans [Logique conditionnelle](cookbooks-101-basics-ruby.md#cookbooks-101-basics-ruby-conditional).

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