ansible
Les rôles
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.