

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.

# Structure de la recette
<a name="cookbooks-101-basics-structure"></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.

Un livre de recettes est principalement constitué d'un ensemble de *recettes* qui peuvent effectuer diverses tâches sur une instance. Pour clarifier l'implémentation des recettes, il est utile d'examiner un exemple simple. Voici la recette de configuration de la [couche HAProxy](layers-haproxy.md) intégrée. Concentrez-vous simplement sur la structure globale à ce stade et ne vous inquiétez pas trop des détails ; ils seront couverts dans les exemples suivants.

```
package 'haproxy' do
  action :install
end

if platform?('debian','ubuntu')
  template '/etc/default/haproxy' do
    source 'haproxy-default.erb'
    owner 'root'
    group 'root'
    mode 0644
  end
end

include_recipe 'haproxy::service'

service 'haproxy' do
  action [:enable, :start]
end

template '/etc/haproxy/haproxy.cfg' do
  source 'haproxy.cfg.erb'
  owner 'root'
  group 'root'
  mode 0644
  notifies :restart, "service[haproxy]"
end
```

**Note**  
Pour cet exemple et pour d'autres exemples de recettes fonctionnelles et de fichiers associés, consultez les [recettes intégrées d'OpsWorks Stacks](https://github.com/aws/opsworks-cookbooks).

L'exemple met en évidence les éléments principaux de la recette, qui sont décrits dans les sections suivantes.

**Topics**
+ [Ressources](#cookbooks-101-basics-structure-resources)
+ [Contrôle de flux](#cookbooks-101-basics-structure-ruby)
+ [Recettes incluses](#cookbooks-101-basics-structure-include)

## Ressources
<a name="cookbooks-101-basics-structure-resources"></a>

Les recettes se composent en grande partie d'un ensemble de *ressources* Chef. Chacun spécifie un aspect particulier de l'état final de l'instance, par exemple un package à installer ou un service à démarrer. L'exemple a quatre ressources :
+ Une `package` ressource, qui représente un package installé, un [HAProxy serveur](http://haproxy.1wt.eu/) pour cet exemple.
+ Une `service` ressource, qui représente un service, le HAProxy service dans cet exemple.
+ Deux `template` ressources, qui représentent des fichiers à créer à partir d'un modèle spécifié, deux fichiers HAProxy de configuration pour cet exemple.

Les ressources permettent de spécifier l'état de l'instance de façon déclarative. En arrière-plan, chaque ressource a un *fournisseur* associé qui effectue les tâches requises, telles que l'installation des packages, la création et la configuration des répertoires, le démarrage des services, etc. Si les détails de la tâche dépendent du système d'exploitation, la ressource a plusieurs fournisseurs et utilise celui qui est approprié pour le système. Par exemple, sur un système Red Hat Linux, le fournisseur `package` utilise `yum` pour installer les packages. Sur un système Ubuntu Linux, le fournisseur `package` utilise `apt-get`.

Vous implémentez une ressource comme un bloc de code Ruby avec le format général suivant.

```
resource_type "resource_name" do
  attribute1 'value1'
  attribute2 'value2'
  ...
  action :action_name
  notifies : action 'resource'
end
```

Les éléments sont les suivants :

**Type de ressource**  
(Obligatoire) L'exemple inclut trois types de ressource, `package`, `service` et `template`.

**Nom de la ressource**  
(Obligatoire) Le nom identifie la ressource particulière et est parfois utilisé comme valeur par défaut pour l'un des attributs. Dans l'exemple, `package` représente une ressource de package nommée `haproxy` et la première ressource `template` représente un fichier de configuration nommé `/etc/default/haproxy`.

**Attributes**  
(Facultatif) les attributs spécifient la configuration des ressources et varient en fonction du type de ressource et de la façon dont vous souhaitez configurer la ressource.  
+ Les ressources `template` de l'exemple définissent explicitement un ensemble d'attributs qui spécifient la source, le propriétaire, le groupe et le mode du fichier créé. 
+ Les ressources `package` et `service` de l'exemple ne définissent pas explicitement les attributs.

  Le nom de la ressource est généralement la valeur par défaut pour un attribut obligatoire et il arrive que rien d'autre ne soit nécessaire. Par exemple, le nom de la ressource est la valeur par défaut pour la ressource `package` dont le seul attribut obligatoire est `package_name`.
Il existe également des attributs spécialisés nommés attributs de protection, qui spécifient lorsque le fournisseur de la ressource va intervenir. Par exemple, l'attribut `only_if` indique au fournisseur de ressources d'agir uniquement si une condition spécifiée est remplie. La HAProxy recette n'utilise pas d'attributs de garde, mais ils sont utilisés dans plusieurs des exemples suivants.

**Actions et notifications**  
(Facultatif) Les actions et les notifications spécifient les tâches qui seront effectuées par le fournisseur.  
+ `action` indique au fournisseur d'effectuer une action spécifiée, telle que l'installation ou la création.

  Chaque ressource dispose d'un ensemble d'actions qui dépendent de la ressource particulière, dont l'action par défaut. Dans l'exemple, l'action de la ressource `package` action de la ressource est `install`, qui demande au fournisseur d'installer le package. La première ressource `template` n'a pas d'élément `action`, c'est pourquoi le fournisseur prend l'action `create` par défaut.
+ `notifies` indique au fournisseur de la ressource d'effectuer une action, mais uniquement si l'état de la ressource a été modifié.

  `notifies` est généralement utilisé avec des ressources telles que `template` et `file` pour exécuter des tâches telles que le redémarrage d'un service après la modification d'un fichier de configuration. Les ressources n'ont pas de notifications par défaut. Si vous souhaitez une notification, la ressource doit avoir un élément `notifies` explicite. Dans la HAProxy recette, la deuxième `template` ressource demande à la `service` ressource haproxy de redémarrer le HAProxy service si le fichier de configuration associé a changé. 

Les ressources dépendent parfois du système d'exploitation.
+ Certaines ressources peuvent être utilisées uniquement sur les systèmes Linux ou Windows.

  Par exemple, [package](https://docs.chef.io/chef/resources.html#package) installe les packages sur les systèmes Linux et [windows\$1package](https://docs.chef.io/chef/resources.html#windows-package) installe les packages sur les systèmes Windows.
+ Certaines ressources peuvent être utilisées avec n'importe quel système d'exploitation, mais ont des attributs qui sont propres à un système particulier.

  Par exemple, la ressource [file](https://docs.chef.io/chef/resources.html#file) peut être utilisée sur les systèmes Linux ou Windows, mais possède des ensembles distincts d'attributs pour configurer des autorisations.

Pour les descriptions de ressources standard, y compris les attributs, les actions et les notifications disponibles pour chaque ressource, consultez [À propos des ressources et des fournisseurs](https://docs.chef.io/resource.html). 

## Contrôle de flux
<a name="cookbooks-101-basics-structure-ruby"></a>

Dans la mesure où les recettes sont des applications Ruby, vous pouvez utiliser les structures de contrôle Ruby pour intégrer le contrôle de flux dans une recette. Par exemple, vous pouvez utiliser une logique conditionnelle Ruby pour que la recette se comporte différemment selon les systèmes. La HAProxy recette inclut un `if` bloc qui utilise une `template` ressource pour créer un fichier de configuration, mais uniquement si la recette est exécutée sur un système Debian ou Ubuntu. 

Un autre scénario courant consiste à utiliser une boucle pour exécuter une ressource plusieurs fois avec différents paramètres d'attribut. Par exemple, vous pouvez créer un ensemble de répertoires en utilisant une boucle pour exécuter une ressource `directory` plusieurs fois avec différents noms de répertoires.

**Note**  
Si vous ne maîtrisez pas bien Ruby, consultez la section [Juste assez de Ruby pour Chef](https://docs.chef.io/just_enough_ruby_for_chef.html), qui couvre ce que vous devez savoir pour la plupart des recettes.

## Recettes incluses
<a name="cookbooks-101-basics-structure-include"></a>

`include_recipe` inclut d'autres recettes dans votre code, ce qui vous permet d'organiser os recettes par modules et de réutiliser le même code dans plusieurs recettes. Lorsque vous exécutez la recette de l'hôte, Chef remplace chaque élément `include_recipe` par le code de la recette spécifiée avant d'exécuter la recette de l'hôte. Vous identifiez une recette incluse à l'aide de la syntaxe standard de Chef `cookbook_name::recipe_name`, avec `recipe_name` qui omet l'extension `.rb`. L'exemple inclut une recette qui représente le HAProxy service. `haproxy::service` 

**Note**  
Si vous utilisez `include_recipe` dans les recettes qui exécutent Chef 11.10 et des versions ultérieures pour inclure une recette d'un autre livre de recettes, vous devez utiliser une instruction `depends` pour déclarer la dépendance dans le fichier `metadata.rb` du livre de recettes. Pour de plus amples informations, veuillez consulter [Mise en œuvre des recettes : Chef 11.10](workingcookbook-chef11-10.md).