when template set_fact playbook debug jinja2 ansible ansible-playbook

jinja2 - set_fact - ansible template



Cómo escribir variable dinámica en Playbook Ansible (3)

En primer lugar, sugeriría que retroceda y organice sus obras para no requerir tanta complejidad, pero si realmente lo hace, use lo siguiente:

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

Basado en extra vars parámetro extra vars Necesito escribir un valor variable en un ansible playbook

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

Si solo pasó el param1

myvariable: ''param1''

Si solo param1, pasa el param2

myvariable: ''param1,param2''

Si se pasan param1, param2, param3, entonces el valor de la variable será

myvariable: ''param1,param2,param3''

Cuando intento crear una variable dinámicamente a través de la plantilla, mi libro de jugadas siempre toma el valor de la variable anterior. Pero dentro de dest=roles/myrole/vars/main.yml su valor correcto de escritura.

Lo que intento aquí

- 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 }

Entonces, dentro del directorio myrole , he creado template y 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 %}

Como sé que solo hay dos condiciones, puedo hacer esto usando una inline expression como la siguiente

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

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

¿Es posible if - elif - else en la inline expression en inline expression como arriba? ¿O de otra manera para asignar valor dinámicamente en el libro de jugadas ansible?


Estoy seguro de que hay una forma más inteligente de hacer lo que quieres, pero esto debería funcionar:

- 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

Espero que ayude. No estoy seguro de si puede construir variables dinámicamente y hacer esto en un iterador. Pero también puedes escribir un pequeño código de Python o cualquier otro idioma y conectarlo a ansible


my_var: la variable declarada

VAR: la variable, cuyo valor debe verificarse

param_1, param_2: valores de la variable VAR

value_1, value_2, value_3: los valores que se asignarán a my_var de acuerdo con los valores de my_var

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