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