Lors de la création d'un nouveau rôle Ansible, le modèle crée à la fois un vars
et un defaults
répertoire avec un main.yml
fichier vide . Lors de la définition de mon rôle, je peux placer des définitions de variables dans l'un ou l'autre de ces éléments, et elles 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 entrer defaults
et que devrait entrer vars
? Est-il judicieux d'utiliser les deux pour les mêmes données?
Je sais qu'il y a une différence de priorité / 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 voudrais fournir une liste de 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 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ù devrait-il aller?
defaults
et ce qu'il y avars
plus bas.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 dansdefaults
.Dans l'article " Priorité variable - Où mettre votre rôle Vars ", l'auteur donne un exemple de ce qu'il faut mettre
vars
: des constantes spécifiques au système qui ne changent pas beaucoup. Ainsi, vous pouvez avoirvars/debian.yml
etvars/centos.yml
avec les mêmes noms de variables mais des valeurs différentes et les inclure conditionnellement.la source
À mon humble avis , il est peu pratique et pas raisonnable que les lieux Ansible comme priorité la configuration dans vars des rôles . Configuration dans
vars/main.yml
etdefaults/main.yml
devrait être faible et probablement la même priorité.Existe-t-il des exemples concrets de cas où nous voulons ce type de comportement?
Il y a des exemples que nous ne voulons pas de cela.
Le point à souligner ici est que la configuration dans
defaults/main.yml
ne peut pas être dynamique. Configuration envars/main.yml
can. Ainsi, par exemple, vous pouvez inclure la configuration pour un système d'exploitation et une version spécifiques de manière dynamique, comme indiqué dans geerlingguy.postgresqlMais parce que la priorité est si étrange et peu pratique dans Ansible, geerlingguy doit introduire des pseudo variables comme on peut le voir dans variables.yml
Il s'agit d'un exemple concret de la vie réelle qui démontre que la préséance n'est pas pratique.
Un autre point à souligner ici est que nous voulons que les rôles soient configurables. Les rôles peuvent être externes, gérés par quelqu'un d'autre. En règle générale, vous ne voulez pas que la configuration des rôles ait une priorité élevée.
la source
Fondamentalement, tout ce qui entre dans les «valeurs par défaut du rôle» (le dossier des valeurs par défaut à l'intérieur du rôle) est le plus malléable et le plus facile à remplacer. Tout ce qui se trouve dans le répertoire vars du rôle remplace les versions précédentes de cette variable dans l'espace de noms. L'idée ici à suivre est que plus vous obtenez explicite dans la portée, plus cela prend de priorité avec la ligne de commande -e extra vars toujours gagnante. Les variables d'hôte et / ou d'inventaire peuvent l'emporter sur les valeurs par défaut des rôles, mais pas sur les inclusions explicites comme le répertoire vars ou une tâche include_vars. doc
la source
Les variables et les valeurs par défaut vont de pair. voici un exemple
dans votre fichier par défaut, vous auriez quelque chose comme:
Ce que ansible fera, c'est qu'il prendra la valeur de
package_version
et le placera à côté du nom du paquet pour qu'il se lise quelque part comme suit:De cette façon, il s'installera
xyz123
et nonxyz123.4
ou quoi que ce soit dans le grand référentiel de xyz.A la fin ça 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.
la source
defaults
sont utilisés lorsqu'il n'y a pas devars
définition, mais la réponse n'explique pas, pourquoi vous définiriez une valeur comme l'une ou l'autre, ce que le PO a demandé. Comparez avec l'explication ci-dessous.