Home:ALL Converter>Ansible set_fact doesn't change the variable value

Ansible set_fact doesn't change the variable value

Ask Time:2014-11-20T19:32:57         Author:hauron

Json Formatter

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?

Author:hauron,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/27038553/ansible-set-fact-doesnt-change-the-variable-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
yy