2014-09-19 1 views
1

Avec Ansible, existe-t-il un moyen de définir une valeur par défaut pour un élément de liste? Par exemple, si je définis une liste dans mes group_vars fichier comme ceci:Définir l'élément de liste par défaut avec Ansible

list1: 
    item1: 
    a: 1 
    item2: 
    a: 2 
    b: a2 
... 
#the list can contain more than two items. 

Puis, dans un rôle que je veux l'utiliser, mais si list1.item1.b n'est pas réglé je le veux utiliser un lieu par défaut calculée (par exemple quelque chose comme {{ "a" + list1.item1.a }}).

Je pourrais utiliser le filtre default pour chaque tâche du rôle, mais je veux le définir une fois pour le rôle et l'utiliser ensuite dans le rôle.

Existe-t-il un moyen d'accomplir ceci?

+0

Si vous attendez la valeur dans un template jinja2, alors vous pouvez faire '{{valeur | par défaut ('...')}} '. Une meilleure description ici http://jinja.pocoo.org/docs/dev/templates/#default – cdr

+0

@cdr oui, mais je devrais le faire à chaque endroit où je voulais l'utiliser. – matthew

Répondre

0

Je pense que votre meilleure option est ici pour définir une seconde variable et l'utiliser dans vos tâches:

item_b: "{{ list1.item1.b | default('a' + list1.item1.a) }}" 
+0

Comment cela fonctionnerait-il si j'ai besoin de faire défiler la liste dans une tâche? – matthew

+0

C'est un hack, mais vous pouvez le faire {{item.item1.b | default (...)}}, puis utilisez {{item_b}} dans votre boucle. Les templates jinja sont évalués paresseusement, donc vous pouvez référencer with_items '{{item}} dans un autre var avant de l'utiliser dans la boucle. L'autre option est une deuxième liste qui contient déjà les valeurs par défaut. – hkariti

+0

Je n'avais pas réalisé que vous pouviez référencer "item" en dehors du contexte de la boucle comme ça. Je vais devoir l'essayer. Vous avez raison, mais cela ressemble à un hack. – matthew

0

Disons que vous avez rôle A

--- 
name: execute step 1 
copy: 
    src="{{list1_item1_a_parameter}}" 
    dest="{{list1_item2_b_parameter}}" 

name: execute step 2 
copy: 
    src="{{list1_item1_a_parameter}}" 
    dest="{{list1_item2_a_parameter}}" 

Maintenant, nous allons jeter un coup d'oeil comment appelleriez-vous ce rôle

--- 
... 
roles: 
    - { role: A, 
     list1_item1_a_parameter: '{{list1.item1.a.parameter | default("some default") }}' 
     list1_item2_a_parameter: '{{list1.item2.a.parameter | default("some default") }}' 
     list1_item2_b_parameter: '{{list1.item2.a.parameter | default("some default") }}' 
    } 

vous pouvez définir ces valeurs par défaut à vars/main.yml, dans votre rôle, aussi.

+1

Si je comprends bien votre réponse, cela ne fonctionnerait pas avec une boucle ou avec une liste arbitrairement longue. – matthew

+0

vous avez raison. mais c'est la seule façon de définir les valeurs par défaut une seule fois pour un rôle. –

Questions connexes