Selon la documentation Ansible, un Playbook est:
... la base d'un système vraiment simple de gestion de configuration et de déploiement multi-machines, unique en son genre, et très bien adapté au déploiement d'applications complexes.
Et, encore une fois, selon ces mêmes documents, un Rôles sont:
... méthodes de chargement automatique de certains fichiers vars_files, tâches et gestionnaires basés sur une structure de fichier connue. Le regroupement de contenu par rôles permet également de partager facilement des rôles avec d'autres utilisateurs.
Cependant, la distinction entre ceux-ci et leurs différents cas d'utilisation ne m'est pas immédiatement évidente. Par exemple, si je configure mon /etc/ansible/hosts
fichier pour ressembler à:
[databases]
mydb01.example.org
mydb02.example.org
[mail_servers]
mymail01.example.org
mymail_dr.example.org
... alors quelle est cette "[databases]
"entrée ... a rôle? Ou le nom du fichier YAML du livre de lecture quelque part? Ou autre chose?!?
Si quelqu'un pouvait m'expliquer les différences, ma compréhension de Ansible s'en trouverait grandement améliorée!
[databases]
et entrées similaires dans /etc/ansible/hosts
ansible.cfg
résidant sur le serveur Ansible, comment puis-je ajouter/configurer Ansible avec les livres/rôles disponibles? Par exemple, quand je lance ansible-playbook someplaybook.yaml
, comment Ansible sait où trouver ce livre de jeu?Playbook vs Role vs [bases de données] et entrées similaires dans/etc/ansible/hosts
[databases]
est un nom unique pour un groupe d'hôtes. Il vous permet de référencer plusieurs hôtes avec un seul nom.
Le rôle est un ensemble de tâches et de fichiers supplémentaires pour configurer l'hôte afin qu'il serve pour un certain rôle .
Playbook est un mappage entre hôtes et rôles.
Exemple de documentation décrit un exemple de projet. Il contient deux choses:
site.yml
, webservers.yml
, fooservers.yml
sont des playbooks.roles/common/
et roles/webservers/
_ contient les définitions de common
et webservers
en conséquence.Dans le livre de jeu (webservers.yml
) vous avez quelque chose comme:
---
- hosts: webservers <- this group of hosts defined in /etc/ansible/hosts, databases and mail_servers in example from your question
roles: <- this is list of roles to assign to these hosts
- common
- webservers
Si les livres de lecture sont définis dans des fichiers YAML, où sont définis les rôles?
Ils sont définis à l'intérieur de roles/*
répertoires. Les rôles sont définis principalement à l'aide de fichiers YAML, mais peuvent également contenir des ressources de tous types (files/
, templates/
). Selon documentation , la définition du rôle est structurée de la manière suivante:
- Si roles/x/tasks/main.yml existe, les tâches qui y sont listées seront ajoutées au jeu.
- Si roles/x/handlers/main.yml existe, les gestionnaires qui y sont listés seront ajoutés à la pièce.
- Si roles/x/vars/main.yml existe, les variables qui y sont listées seront ajoutées à la lecture.
- Si roles/x/meta/main.yml existe, toutes les dépendances de rôle qui y sont répertoriées seront ajoutées à la liste des rôles (1.3 et versions ultérieures).
- Toutes les tâches de copie peuvent référencer des fichiers dans les rôles/x/files/sans avoir à les acheminer de manière relative ou absolue.
- Toutes les tâches de script peuvent référencer des scripts dans les rôles/x/files/sans avoir à les acheminer de manière relative ou absolue.
- Toutes les tâches de modèle peuvent référencer des fichiers dans les rôles/x/templates/sans avoir à les acheminer de manière relative ou absolue.
- Toutes les tâches d'inclusion peuvent référencer des fichiers dans les rôles/x/tasks/sans avoir à les acheminer de manière relative ou absolue.
Le fichier le plus important est roles/x/tasks/main.yml
, vous définissez ici les tâches à exécuter lors de l’exécution du rôle.
À part le fichier ansible.cfg installé sur le serveur Ansible, comment puis-je ajouter/configurer Ansible avec les livres/rôles disponibles? Par exemple, quand je lance ansible-playbook someplaybook.yaml, comment Ansible sait-il où trouver ce livre de lecture?
$ ansible-playbook someplaybook.yaml
Va chercher un livre de jeu dans le répertoire courant.
$ ansible-playbook somedir/somedir/someplaybook.yaml
Je chercherai un livre de jeu à l'intérieur somedir/somedir/
répertoire.
Il est de votre responsabilité de mettre votre projet avec tous les playbooks et rôles sur le serveur. Ansible n'a rien à voir avec ça.
Playbook vs Role vs [bases de données] et entrées similaires dans/etc/ansible/hosts
Les rôles permettent de regrouper des tâches dans un même conteneur. Vous pourriez avoir un rôle dans la configuration de MySQL, un autre pour configurer Postfix, etc.
Un livre de jeu définit quoi se passe où. C’est à cet endroit que vous définissez les hôtes (groupes d’hôtes, voir ci-dessous) et les rôles qui seront appliqués à ces hôtes.
[databases]
et les autres entrées de votre inventaire sont des groupes d’hôtes. Les groupes d’hôte définissent un ensemble d’hôtes sur lesquels une lecture sera exécutée.
Une pièce de théâtre est un ensemble de tâches ou de rôles (ou les deux) dans un livre de jeu. Dans la plupart des cas (et des exemples), un livre de jeu ne contiendra qu'une seule pièce. Mais vous pouvez en avoir autant que vous voulez. Cela signifie que vous pourriez avoir un livre de lecture qui exécutera le rôle postfix
sur le groupe d’hôtes mail_servers
et le rôle mysql
sur le groupe d’hôtes databases
:
- hosts: mail_servers
roles:
- postfix
- hosts: databases
roles:
- mysql
Si les livres de lecture sont définis dans des fichiers YAML, où sont définis les rôles?
Dans Ansible, pratiquement tout est défini dans YAML, cela compte pour les rôles et les playbooks.
À part le fichier ansible.cfg installé sur le serveur Ansible, comment puis-je ajouter/configurer Ansible avec les livres/rôles disponibles? Par exemple, quand je lance ansible-playbook someplaybook.yaml, comment Ansible sait-il où trouver ce livre de lecture?
Autant que je sache, vous devez indiquer le chemin d'accès au playbook lorsque vous appelez ansible-playbook
. Alors ansible-playbook someplaybook.yaml
attendrait someplaybook.yaml
être dans votre répertoire actuel. Mais vous pouvez fournir le chemin complet: ansible-playbook /path/to/someplaybook.yaml
C'est une question de terminologie/sémantique. Cela peut être subjectif, même s’il existe une définition de base.
Mon point de vue est le suivant:
Tout système de gestion de configuration/déploiement a:
source data
- données utilisées pour créer la configuration de l'hôte cibletarget data
- données utilisées pour identifier les hôtes ciblesconfig changes
- liste/ensemble de règles/actions que nous appliquons avec source data
sur l'hôte cible basé sur target data
source data
- sont les différents endroits où nous pouvons mettre des données - group_vars
, playbook
vars, role
vars, etc., ces emplacements ont une incidence sur la priorité (si une variable portant le même nom est redéfinie à différents endroits, il existe des règles très spécifiques sur ce qui serait la valeur de la variable pendant ansible
/ansible-playbook
exécutiontarget data
_ est l'inventaire (Et, il est également possible de définir des variables d'inventaire/de groupe hôte dans l'inventaire!)config changes
- ansible a 4 niveaux d’abstraction: role
s/task
s/listes de tâches (et des tâches spéciales comme handlers
)De l'aspect 'logiciel' - le rôle doit être suffisamment générique pour être réutilisé.
Dans certaines organisations (plutôt grandes), les "rôles" sont fournis par le groupe A, alors qu'ils sont utilisés dans les playbooks gérés par le groupe B.
Tout ce qui précède permet de regrouper des configurations similaires - dans un role
. regrouper les sous-systèmes/composants associés dans un playbook
. Il convient également de mentionner 1 élément YAML dans un livre de jeu (y compris hosts:
et soit ou tasks
, pre_tasks
, post_tasks
, roles
) est appelé un play
Oui, c'est déroutant au début.
Vous connectez généralement votre source data
à la sémantique de votre rôle, donc quand vous voyez ce rôle setup_db
est appliqué lors d’une lecture sur un groupe d’hôtes associé (par exemple, db_hosts
) Mais un play
peut être exécuté sur une union de plusieurs groupes d’hôtes. C'est juste une question de convention vs flexibilité.
S'il vous plaît écrivez-moi si cela a ajouté à la confusion, ou clarifié. Merci.
Gardez également à l'esprit qu'un playbook peut appeler plusieurs rôles si un méta-fichier est utilisé pour affecter les différents rôles.
Exemple de livre de lecture: dual_role-playbook.yml
- name: Some Action for two roles
hosts: localhost
vars_files:
- roles/dual_role/meta/main.yml
roles:
- dual_role/container-1
- dual_role/container-2
Le schéma du dossier et du fichier de rôle ressemblera à ceci:
dual_role-playbook.yml
-- roles
-- dual_role
-- meta/main.yml
-- container-1
-- tasks/main.yml
-- templates/template.j2
-- container-2
-- tasks/main.yml
-- templates/template.j2
Tout simplement:
Un playbook est comme le programme principal, il contient des instructions complètes pour terminer le travail. Toutefois, pour les grands projets, il n’est pas souhaitable d’y mettre tous les détails. Donc, vous avez besoin d'un rôle.
Un rôle est un sous-programme et atteint généralement un objectif, par exemple: configurer un serveur de base de données. Vous pouvez le mettre dans roles/
répertoire, ou téléchargez des rôles tiers en fournissant des URI dans rolesfile.yml
et demandez ansible-galaxy de les télécharger pour vous.
Le [database]
est un groupe d'hôtes défini dans le fichier d'inventaire qui répertorie les hôtes appartenant au groupe database
. Vous pouvez également spécifier un groupe de serveurs Web en spécifiant quelque chose comme
[web]
web1.example.com
web2.example.com
Le groupe web
ou database
peut ensuite être utilisé dans des playbooks ou des rôles pour spécifier les hôtes à appliquer.
Les groupes peuvent également être utilisés dans la commande ansible
pour exécuter des commandes ad-hoc.