Lors de la création d'un nouveau rôle Ansible, le modèle crée à la fois un répertoire vars
et un répertoire defaults
avec un fichier main.yml
Vide. Lors de la définition de mon rôle, je peux placer des définitions de variables dans l'une ou l'autre de ces définitions, qui seront disponibles dans mes tâches.
Quelle est la différence entre mettre les définitions dans defaults
et vars
? Qu'est-ce qui devrait aller dans defaults
, et ce qui devrait être dans vars
? Est-il judicieux d’utiliser les deux pour les mêmes données?
Je sais qu'il existe une différence de précédent/priorité entre les deux, mais j'aimerais comprendre ce qui devrait aller où.
Disons que mon rôle créerait une liste de répertoires sur le système cible. Je souhaite fournir une liste des répertoires par défaut à créer, mais je souhaite autoriser l'utilisateur à les remplacer lors de l'utilisation du rôle.
Voici à quoi cela ressemblerait:
---
- directories:
- foo
- bar
- baz
Je pourrais placer cela dans le defaults/main.yml
Ou dans le vars/main.yml
, Du point de vue de l'exécution, cela ne ferait aucune différence - mais où cela devrait-il aller?
La documentation Ansible sur préséance de variable résume ce niceley:
Si plusieurs variables du même nom sont définies à des endroits différents, elles gagnent dans un certain ordre, à savoir:
- les vars supplémentaires (-e dans la ligne de commande) gagnent toujours
- vient ensuite les variables de connexion définies dans l'inventaire (ansible_ssh_user, etc.)
- puis vient "presque tout le reste" (commutateurs de ligne de commande, vars en jeu, vars inclus, vars de rôle, etc.)
- vient ensuite le reste des variables définies dans l'inventaire
- vient ensuite des faits découverts sur un système
- puis "rôle par défaut", qui sont les plus "défaillants" et perdent en priorité à tout.
Supposons donc que vous avez un rôle "Tomcat" que vous utilisez pour installer Tomcat sur un groupe d’hôtes Web, mais que vous avez besoin de versions différentes de Tomcat sur plusieurs hôtes, de le faire fonctionner sous différents utilisateurs dans d’autres cas, etc. Le fichier defaults/main.yml
peut ressemble à ceci:
Tomcat_version: 7.0.56
Tomcat_user: Tomcat
S'agissant de valeurs par défaut, cela signifie qu'elles seront utilisées si ces variables ne sont définies nulle part ailleurs pour l'hôte en question. Vous pouvez les remplacer via des extra-vars, des faits dans votre fichier d'inventaire, etc. pour spécifier différentes valeurs pour ces variables.
Edit: Notez que la liste ci-dessus est pour Ansible 1.x. Dans Ansible 2.x, la liste a été développée. Comme toujours, le Ansible Documentation fournit une description détaillée de la priorité des variables pour 2.x.
Les variables de rôle définies dans var
ont une priorité très élevée - elles ne peuvent être écrasées qu'en les passant sur la ligne de commande, dans la tâche spécifique ou dans un bloc. Par conséquent, presque toutes vos variables doivent être définies dans defaults
.
Dans l'article " Variable Precedence - Où placer votre rôle Vars ", l'auteur donne un exemple de ce qu'il faut mettre dans vars
: Des constantes spécifiques au système qui ne changent pas beaucoup. Pour que vous puissiez avoir vars/debian.yml
et vars/centos.yml
avec les mêmes noms de variable mais des valeurs différentes et les inclure conditionnellement.