Question:
Based on extra vars
parameter I Need to write variable value in ansible playbook
1 2 |
ansible-playbook playbook.yml -e "param1=value1 param2=value2 param3=value3" |
If only param1 passed
1 2 |
myvariable: 'param1' |
If only param1,param2 passed
1 2 |
myvariable: 'param1,param2' |
If param1,param2,param3 are passed then variable value will be
1 2 |
myvariable: 'param1,param2,param3' |
When I try to create variable dynamically through template then my playbook always takes previous variable value. But inside dest=roles/myrole/vars/main.yml
its writing correct value.
What I make a try here
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
- 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 } |
So inside myrole directory I have created template
and vars
1 2 3 4 5 |
- roles - myrole - vars/main.yml - templates/myvar.j2 |
templates/myvar.j2
1 2 3 4 5 6 7 8 9 10 |
{% 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 %} |
As I know if only two condition then I can do this using inline expression
like below
1 2 |
{{ 'param1,param2' if param1 is defined and param2 is defined else 'default-param' }} |
<do something> if <something is true> else <do something else>
Is it possible if - elif - else
in inline expression
like above. Or any other way to assign value dynamically in ansible playbook?
Answer:
I am sure there is a smarter way for doing what you want but this should work:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
- 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 |
Hope that helps. I am not sure if you can construct variables dynamically and do this in an iterator. But you could also write a small python code or any other language and plug it into ansible