En fonction de la valeur (True / False) d'une variable définie dans le group_vars, j'essaie de définir certaines variables dans un fichier vars. Leur valeur dépend de la valeur du groupe var.
Mon fichier var actuel ressemble à ceci:
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
Pour chacun de mes rôles, j'utilise une variable définie dans ce fichier.
Mon playbook de test ressemble à ci-dessous:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
L'erreur que je reçois après avoir exécuté le playbook est:
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
Suis-je en train de faire quelque chose de stupide ici ou ce n'est même pas supporté? J'ai essayé de trouver une autre façon de définir ces vars (j'en ai beaucoup) mais je n'ai pas réussi à obtenir quelque chose de fonctionnel ici. Aucune suggestion?
ansible
automation
jinja
pandoJohn
la source
la source
template
appel de module.test
dépend du groupe, il doit être placé dans group_vars.Réponses:
Je ne pense pas que vous puissiez, je crée généralement des fichiers séparés pour contenir les collections de variables conditionnelles et j'utilise une
when
clause pour les inclure à une condition spécifique:la source
Ansible permet à l'une des formes suivantes de définir une variable de manière conditionnelle:
En combinant la syntaxe ci-dessus avec la recherche de variables, nous pouvons charger des variables complexes (liste dans ce cas):
Il existe une autre façon d'effectuer un chargement d'arbre conditionnel avec la recherche vars. Cette méthode est pratique lorsque vous avez besoin d'implémenter une logique de cas (c'est-à-dire que la variable de condition a plus de deux valeurs possibles):
la source
Malgré ce serait bien, je crains que votre chemin ne soit pas possible (ou je ne suis pas au courant de la bonne façon).
Je suggère de préparer d'abord le fichier vars à partir du modèle jinja, puis de l'inclure avec include_vars. Voir l'exemple de playbook:
Le contenu de l'exemple de modèle jinja /tmp/vars.yaml.j2 est:
la source
- debug: var=test
je peux voir qu'il y a des définitionstest.var1
et destest.var2
valeurs attendues. Vous devriez donc pouvoir utiliser ces variables dans d'autres tâches du playbook.AFAIK, cette {} chose que vous essayez est pour les modèles Jinja2 et non pour les fichiers yml. De la documentation :
Vous pouvez préparer un fichier .yml séparé avec un jeu qui définit les variables dont vous avez besoin en utilisant des clauses when, puis en les important (ou en les incluant) dans votre livre de jeu principal. De cette façon, vous pouvez avoir toutes les variables définies conditionnellement dans un seul fichier.
OU: Utilisez des rôles. Je pense que les rôles sont l'approche la plus adéquate pour résoudre votre problème.
la source
Ce que j'ai fait à la fin était de créer 2 fichiers var distincts - appelons-les
type_a.yml
ettype_b.yml
- et j'ai défini une variable de groupe qui indique quel fichier utiliser - quelque chose commetype_of_file: a
. Voici à quoi ressemble mon playbook maintenant:Merci pour toutes les réponses. Je les trouve vraiment utiles.
la source
J'espère que le snip suivant (tiré de la documentation Ansible ) pourra apporter un complément utile aux contributions utiles des autres ci-dessus.
la source