web-dev-qa-db-fra.com

Ansible Playbooks vs Roles

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!

  • Playbook vs Role vs [databases] et entrées similaires dans /etc/ansible/hosts
  • Si les livres de lecture sont définis dans des fichiers YAML, où sont définis les rôles?
  • Mis à part le 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?
84
smeeb

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:

  • Playbooks. site.yml, webservers.yml, fooservers.yml sont des playbooks.
  • Les rôles: 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.

89
Yaroslav Admin

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

32
udondan

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:

  1. source data - données utilisées pour créer la configuration de l'hôte cible
  2. target data - données utilisées pour identifier les hôtes cibles
  3. config changes - liste/ensemble de règles/actions que nous appliquons avec source data sur l'hôte cible basé sur target data

En termes possibles:

  1. source data - sont les différents endroits où nous pouvons mettre des données - group_vars, playbookvars, rolevars, 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écution
  2. target data _ est l'inventaire (Et, il est également possible de définir des variables d'inventaire/de groupe hôte dans l'inventaire!)
  3. config changes - ansible a 4 niveaux d’abstraction:
    1. tâche - action unique
    2. liste des tâches - liste des actions
    3. role - liste d'actions (ou liste de listes) regroupées par le même "sujet", généralement toutes les cibles fonctionnent sur le même hôte/groupe d'hôtes
    4. playbook - liste de lectures, chacune opérant sur un groupe hôte éventuellement différent, appliquant plusieurs roles/tasks/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.

sommaire

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

Maintenant pour votre question:

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

P.S.

S'il vous plaît écrivez-moi si cela a ajouté à la confusion, ou clarifié. Merci.

9
mvk_il

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
0
Jose H. Rosa

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.

0
Ding-Yi Chen