web-dev-qa-db-fra.com

Comment écrire une variable dynamique dans le classeur Ansible

Basé sur extra vars paramètre I Besoin d'écrire la valeur de la variable dans ansible playbook

ansible-playbook playbook.yml -e "param1=value1 param2=value2 param3=value3"

Si seulement param1 passé

myvariable: 'param1'  

Si seulement param1, param2 passé

myvariable: 'param1,param2' 

Si param1, param2, param sont passés alors la valeur de la variable sera

myvariable: 'param1,param2,param3' 

Lorsque j'essaie de créer des variables de manière dynamique via un modèle, mon livre de lecture prend toujours la valeur de variable précédente. Mais à l'intérieur dest=roles/myrole/vars/main.yml sa valeur d'écriture correcte.

Ce que je fais essayer ici

- hosts: local
  user: roop
  gather_facts: yes
  connection: local

  tasks: 

  - template: src=roles/myrole/templates/myvar.j2 dest=roles/myrole/vars/main.yml

  - debug: var=myvariable

  roles:
        - { role: myrole }

Donc, dans le répertoire myrole, j'ai créé template et vars

- roles
  - myrole
    - vars/main.yml
    - templates/myvar.j2 

templates/myvar.j2

{% if param1 is defined and param2 is defined and param3 is defined %}
  myvariable: 'param1,param2,param3'
{% Elif param1 is defined and param2 is defined %}
  myvariable: 'param1,param2'
{% Elif param1 is defined %}
  myvariable: 'param1'
{% else %}
  myvariable: 'default-param'
{% endif %} 

Comme je sais si seulement deux conditions, je peux le faire en utilisant inline expression comme ci-dessous

{{ 'param1,param2' if param1 is defined and param2 is defined else 'default-param' }}

<do something> if <something is true> else <do something else>

C'est possible if - Elif - else dans inline expression comme ci-dessus. Ou tout autre moyen d'attribuer une valeur de manière dynamique dans Ansible Playbook?

33
Roopendra

Je suis sûr qu'il existe un moyen plus intelligent de faire ce que vous voulez, mais cela devrait fonctionner:

- name         : Test var
  hosts        : all
  gather_facts : no
  vars:
    myvariable : false
  tasks:
    - name: param1
      set_fact:
        myvariable: "{{param1}}"
      when: param1 is defined

    - name: param2
      set_fact:
        myvariable: "{{ param2 if not myvariable else myvariable + ',' + param2 }}"
      when: param2 is defined

    - name: param3
      set_fact:
        myvariable: "{{ param3 if not myvariable else myvariable + ',' + param3 }}"
      when: param3 is defined

    - name: default
      set_fact:
        myvariable: "default"
      when: not myvariable

    - debug:
       var=myvariable

J'espère que ça t'as aidé. Je ne sais pas si vous pouvez construire des variables de manière dynamique et le faire dans un itérateur. Mais vous pouvez aussi écrire un petit code python ou tout autre langage et le brancher à ansible

39
DomaNitro

my_var: la variable déclarée

VAR: la variable dont la valeur doit être vérifiée

param_1, param_2: valeurs de la variable VAR

valeur_1, valeur_2, valeur_3: les valeurs à affecter à my_var en fonction des valeurs de my_var

my_var: "{{ 'value_1' if VAR == 'param_1' else 'value_2' if VAR == 'param_2' else 'value_3' }}"
23
AnshBikram

Je voudrais tout d’abord vous suggérer de prendre du recul et d’organiser vos pièces de manière à ne pas exiger une telle complexité, mais si vous le faites vraiment, utilisez ce qui suit:

   vars:
    myvariable: "{{[param1|default(''), param2|default(''), param3|default('')]|join(',')}}"
15
bcoca