Ansible, set_fact using if then else statement
Solution 1
Firstly, dictionaries in YAML are not ordered (and the syntax used by Ansible here is a YAML dictionary), so you have no guarantee Ansible would first set jm_env
before proceeding to l_env
-- you need to split the assignment into two tasks.
Secondly, your test expressions are incorrect -- '{{jm_env}}==Develop'
is a string because it is quoted; and testing if 'string'
will always evaluate to true
(this is the direct reason you always get d
in the output).
Use:
- name: Set the jm_env
set_fact:
jm_env: "{{lookup('env', 'Environment')}}"
- name: Set the l_env
set_fact:
l_env: "{% if jm_env=='Develop' %}d{% elif jm_env=='Staging'%}s{% else %}p{% endif %}"
Solution 2
One of the simple way to set fact based condition example as follows:
- name: Set facts for delete operation results
set_fact:
tr_result: "{{ '{\"status\": \"SUCCESS\"}' if (op_result['output'] == 'Deleted') else '{\"status\" : \"FAILED\"}' }}"
Note: Assume op_result is a dict & already defined.
Code has been tested and working well.
thepod71
Updated on December 24, 2020Comments
-
thepod71 over 3 years
I am trying to set a variable in Ansible with set_fact at runtime based upon another variable. If uses first value no matter what the actual value is. Here is my code example:
- name: Global_vars - get date info set_fact: jm_env: "{{lookup('env', 'Environment')}}" l_env: "{% if '{{jm_env}}==Develop' %}d{% elif '{{jm_env}}==Staging'%}s{% else %}p{% endif %}"
l_env
isd
no matter whatjm_env
is set. -
thepod71 about 7 yearsthat worked. i didn't realize the order could be the issue
-
techraf about 7 years@thepod71 Please have a look at the Help Center: do not add a comment on your question or on an answer to say "Thank you"..