Scenario ansible-playbook is called with passed in extra var:
-e my_var=init_value
Then in a role code the value is supposed to change via set_fact call (variable other_var value is "new_value"):
set_fact: my_var: {{ other_var }}
This results in a nice output supposedly confirming alteration:
{"ansible facts": {"my_var": "new_value"}}
However echoing the variable after changing it shows the old value:
echo {{ my_var }}
-> "echo init_value"
To add to that, when I set two variables in the above example:
set_fact: my_var: {{ other_var }}
set_fact: new_var: {{ other_var }}
The new_var is set properly.
Is the variable in some way immutable? How to use the set_fact to update the variable's value?
robo :
The set_fact module effectively adds another host fact, ie. \"a fact discovered about the system\". From the documentation (http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable) you can see that those facts have low priority, and will be overridden by extra-vars and various other things.\n\nThis can be confusing because using set_fact can make it seem like you are changing the value of the variable at that point, but maybe the name is the key to understanding - it's not 'set_variable', it's 'set_(host)fact', and host facts have low precedence. Precedence is more important than the order in which the value is assigned.\n\nOne workaround if you want to supply a value via extra-vars that gets overwritten later would be to reassign that extra-vars value to a different variable via set_fact at the start of your playbook, and then reassign that new variable later using set_fact again. Since they're at the same precedence level, the 'overwrite' should work as you would expect.",
2015-05-08T23:03:22