40 votes

Ansible : Définir conditionnellement des variables dans le fichier vars si une certaine condition est remplie

En fonction de la valeur (Vrai/Faux) d'une variable définie dans le groupe_vars J'essaie de définir certaines variables dans un fichier vars. Leur valeur dépend de la valeur de la variable group_vars.

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 à ce qui suit :

- 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 la suivante :

{% 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>"

Est-ce que je fais quelque chose de stupide ici ou est-ce que ce n'est même pas supporté ? J'ai essayé de trouver une autre façon de définir ces variables (j'en ai beaucoup) mais je n'ai pas réussi à obtenir quelque chose de fonctionnel ici. Avez-vous des suggestions ?

0 votes

Où ces variables finissent-elles par être utilisées ? Cela n'est peut-être pas nécessaire si vous ne les utilisez que dans le cadre d'un projet de template appel du module.

0 votes

Si test est dépendant du groupe, il doit être placé dans group_vars.

0 votes

Malheureusement, le test ne dépend pas du groupe. Comme mentionné dans la description, le test dépend de la valeur d'une variable group_var.

1voto

Alan Rezende Points 22

Le code Jinja2 est attendu dans des fichiers '.j2' pour les modèles et les playbooks en ligne, où certaines règles s'appliquent. C'est pourquoi vous obtenez ces erreurs de syntaxe.

Ansible dispose d'une multitude de moyens pour accomplir les mêmes tâches.

Si vous souhaitez définir des variables pour chaque rôle, une approche consiste à utiliser un fichier var distinct pour chaque rôle. rôle :

roles/
    some_role/            # this hierarchy represents a "role"
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role

La méthode ci-dessus ne nécessite pas de conditionnel (la clause "when").

Si vous voulez vraiment avoir un seul fichier avec toutes les définitions de variables, vous aurez un fichier modèle pour générer le fichier var final et ensuite l'inclure/importer dans votre playbook.

Je recommande vivement la compréhension des concepts de réutilisation du code y contenu dynamique ou statique .

De même, s'il n'y a pas de conflit d'espace de noms ou si le nombre de variables n'est pas trop élevé, il est possible d'envisager un seul fichier var global statique pour chaque livre de lecture ou ensemble de livres de lecture.

A partir de la documentation Ansible sur Utilisation des variables ( Priorité variable : Où dois-je placer une variable ? ?) :

Beaucoup de gens se demandent comment les variables peuvent remplacer les autres. En fin de compte, la philosophie d'Ansible est qu'il est préférable de savoir où mettre une variable, et ensuite vous avez à y penser beaucoup moins.

Évitez de définir la variable "x" à 47 endroits et de poser ensuite la question "quelle x est utilisée". Pourquoi ? Parce que ce n'est pas la philosophie zen d'Ansible.

Il n'y a qu'un seul Empire State Building. Une seule Mona Lisa, etc. Trouvez où définir une variable, et ne compliquez pas les choses.

Il existe une excellente liste ordonnée de la préséance des variables. aquí .

0voto

niglesias Points 210

À ma connaissance, le truc {} que vous essayez d'utiliser concerne les modèles Jinja2 et non les fichiers yml. Dans le documentation :

ansible autorise les boucles et les conditionnels Jinja2 dans les modèles, mais dans les playbooks, nous ne les utilisons pas.

Vous pouvez préparer un fichier .yml séparé avec un play qui configure les variables dont vous avez besoin en utilisant des clauses when, puis les importer (ou les inclure) dans votre playbook principal. De cette façon, vous pouvez avoir toutes les variables définies de manière conditionnelle dans un seul fichier.

OU : Utiliser les rôles. Je pense que les rôles sont l'approche la plus adéquate pour résoudre votre problème.

0voto

Peter Smallwood Points 101

J'espère que la citation suivante (tirée de Documentation Ansible ) peut constituer un complément intéressant aux contributions utiles des autres personnes mentionnées ci-dessus.

- name: Show value of 'variablename'
  debug: msg="{{ lookup('vars', 'variabl' + myvar)}}"
  vars:
    variablename: hello
    myvar: ename

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X