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?

101
demandé sur Alexander Suraphel 2015-03-18 19:31:29

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.

76
répondu Bruce P 2015-11-24 23:17:05

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.

18
répondu chiborg 2017-02-08 09:17:54

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.

-2
répondu qubsup 2017-05-10 11:44:06