Recherche…


Utiliser des rôles

Ansible utilise le concept de rôles pour mieux autoriser le code modulaire et éviter de se répéter.

Un rôle est simplement une structure de dossier dans laquelle Ansible sait où charger les fichiers vars, les tâches et les gestionnaires. Un exemple pourrait ressembler à ceci:

apache/
├── defaults
│   └── main.yml
├── files
│   ├── mod-pagespeed-stable_current_i386.deb
│   ├── mod-pagespeed-stable_current_i386.rpm
│   ├── mod-pagespeed-stable_current_amd64.deb
|   └── mod-pagespeed-stable_current_x86_64.rpm
├── tasks
│   ├── debian.yml
│   ├── main.yml
│   └── redhat.yml
├── templates
│   ├── httpd.conf.j2
│   └── sites-available
│       └── virthualhost.conf.j2
└── vars
    ├── debian
    └── redhat

Vous pouvez ensuite utiliser le rôle avec un livret de base qui ressemble à ceci:

- hosts: webservers
  roles:
     - apache

Lorsque vous exécutez Ansible sur ce playbook, il cible tous les hôtes du groupe de webservers et exécute le rôle apache défini ci-dessus, en chargeant automatiquement les variables par défaut du rôle et en exécutant toutes les tâches incluses dans tasks/main.yml . Ansible sait également rechercher certains types de fichiers dans des emplacements adaptés aux rôles:

  • Si roles / x / tasks / main.yml existe, les tâches qui y sont répertoriées seront ajoutées au jeu.

  • Si roles / x / handlers / main.yml existe, les gestionnaires listés seront ajoutés à la lecture

  • Si roles / x / vars / main.yml existe, les variables listées seront ajoutées à la lecture

  • Si roles / x / meta / main.yml existe, toutes les dépendances de rôles qui y sont répertoriées seront ajoutées à la liste des rôles (version 1.3 et ultérieure).

  • Toute tâche de copie, de script, de modèle ou d'inclusion (dans le rôle) peut référencer des fichiers dans des rôles / x / {fichiers, modèles, tâches} / (dir dépend de la tâche) sans avoir à les tracer relativement ou absolument

Les dépendances de rôle

Les rôles vous permettent également de définir d'autres rôles en tant que dépendance en créant un fichier meta/main.yml avec un bloc de dependencies :

dependencies:
  - role: common

Il est également possible de passer une valeur à un paramètre / variable dans le rôle dépendant:

dependencies:
  - { role: common, some_parameter: 3 }

Ou même exécuter le rôle dépendant conditionnellement:

dependencies:
  - { role: common, some_parameter: 3 }
  - { role: sshd, enable_sshd: false,
                         when: environment == 'production' }

Les rôles dépendants sont toujours exécutés avant les rôles qui en dépendent. En outre, ils ne sont exécutés qu'une seule fois. Si deux rôles sont identiques à ceux de leur dépendance, ils ne sont exécutés que la première fois.

Imaginez les rôles role1, role2 et role3 avec les meta/main.yml :
role1 / meta / main.yml:

dependencies:
    - role: role3

role2 / meta / main.yml:

dependencies:
    - role: role3

Lors de l'exécution du rôle1 et du rôle2 dans le même répertoire (avec le rôle1 appelé avant le rôle2), l'ordre d'exécution serait le suivant:

role3 -> role1 -> role2

Vous pouvez remplacer ce comportement en spécifiant allow_duplicates: yes dans meta/main.yml de role1 et role2. L'ordre d'exécution résultant serait le:

role3 -> role1 -> role3 -> role2

Séparer les tâches et les variables spécifiques à la distribution dans un rôle

Nous pouvons facilement séparer les tâches et les variables spécifiques à la distribution en différents fichiers .yml dédiés. Ansible nous aide à identifier automatiquement la distribution des hôtes cibles via {{ ansible_distribution }} et {{ ansible_distribution_version }} . Il nous suffit donc de nommer les fichiers .yml dédiés à la distribution.

Pour Ubuntu Xenial, le répertoire de base des rôles dirait alors:

role
├── tasks
│   ├── main.yml
│   └── Ubuntu16.04.yml
└── vars
    └── Ubuntu16.04.yml

A l'intérieur de tasks/main.yml nous pouvons désormais inclure automatiquement les variables et les tâches appropriées pour la distribution des hôtes cibles.

tâches / main.yml

---

- name: include distribution specific vars
  include_vars: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"

- name: include distribution specific install
  include: "{{ ansible_distribution }}{{ ansible_distribution_version }}.yml"

Dans les tasks/Ubuntu16.06.yml et vars/Ubuntu16.04.yml nous pouvons maintenant définir des tâches et des variables pour Ubuntu Xenial respectivement.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow