Quelle est la différence entre les valeurs par défaut et les variables dans un rôle Ansible?
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 les définitions de variables dans l'un de ces, ils seront disponibles dans mes tâches.
Quelle est la différence entre mettre les définitions dans defaults
et vars
? Ce qui devrait aller dans defaults
, et ce qui devrait en vars
? Est-il logique d'utiliser les deux pour les mêmes données?
Je sais qu'il y a une différence dans priorité priorité entre les deux, mais je voudrais comprendre ce qui doit aller où.
Disons que mon rôle créerait une liste de répertoires sur le système cible. Je voudrais fournir une liste des répertoires par défaut à créer, mais je voudrais permettre à l'utilisateur de les remplacer lors de l'utilisation du rôle.
Voici à quoi cela ressemblerait:
---
- directories:
- foo
- bar
- baz
Je pourrais placer ceci soit dans le defaults/main.yml
ou dans le vars/main.yml
, du point de vue de l'exécution, cela ne ferait pas toute différence - mais où devrait-il aller?
3 réponses
La documentation Ansible sur la priorité des variables résume ce niceley:
Si plusieurs variables du même nom sont définies à des endroits différents, elles gagnent dans un certain ordre, qui est:
- Vars supplémentaires (- e dans la ligne de commande) toujours gagner
- vient ensuite les variables de connexion définies dans inventory (ansible_ssh_user, etc)
- vient ensuite "la plupart de 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 inventory
- vient ensuite les faits découverts sur un système
- puis "defaults rôle", qui sont les plus "defaulty" et perdent en priorité à tout.
Supposons donc que vous ayez un rôle "tomcat" que vous utilisez pour installer Tomcat sur un tas d'hébergeurs, mais vous avez besoin de différentes versions de tomcat sur quelques hôtes, besoin de fonctionner en tant qu'utilisateurs différents dans d'autres cas, etc. Le fichier defaults/main.yml
peut quelque chose comme ceci:
tomcat_version: 7.0.56
tomcat_user: tomcat
Comme ce ne sont que des 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 extras, via des faits dans votre fichier d'inventaire,etc. pour spécifier des valeurs différentes pour ces variables.
Edit: notez que la liste ci-dessus est pour Ansible 1.x. Dans Ansible 2.x la liste a été étendue. Comme toujours, la Documentation Ansible fournit une description détaillée de priorité variable 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 "priorité Variable-où mettre vos Vars de rôle" 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. Vous pouvez donc avoir vars/debian.yml
et vars/centos.yml
, avec les mêmes noms de variables, mais différentes valeurs et les inclure conditionnellement.
Les Variables et les valeurs par défaut marchent main dans la main. voici un exemple
-name: install package
yum: name=xyz{{package_version}} state=present
Dans votre fichier par défaut, vous auriez quelque chose comme:
package_version: 123
Ce qu'Ansible va faire, c'est qu'il va prendre la valeur de package_version
et la mettre à côté du nom du paquet afin qu'il se lise quelque part comme:
-name: install package
yum: name=xyz123 state=present
De cette façon, il installera xyz123
et non xyz123.4
ou tout ce qui se trouve dans le grand dépôt de xyz.
À la fin, il fera yum install -y xyz123
Donc, fondamentalement, les valeurs par défaut sont les valeurs présentes, si vous ne définissez pas de valeur spécifique pour les variables, car cet espace ne peut pas rester vide.