Ansible set_fact不会更改变量值

hau*_*ron 11 shell ansible

方案ansible-playbook通过额外的var传递调用:

-e my_var=init_value
Run Code Online (Sandbox Code Playgroud)

然后在角色代码中,该值应该通过set_fact调用更改(变量other_var值为"new_value"):

set_fact: my_var: {{ other_var }}
Run Code Online (Sandbox Code Playgroud)

这导致了一个很好的输出,据说确认了改变:

{"ansible facts": {"my_var": "new_value"}}
Run Code Online (Sandbox Code Playgroud)

但是在更改后回显变量会显示旧值:

echo {{ my_var }}
-> "echo init_value"
Run Code Online (Sandbox Code Playgroud)

除此之外,当我在上面的例子中设置两个变量时:

set_fact: my_var: {{ other_var }}
set_fact: new_var: {{ other_var }}
Run Code Online (Sandbox Code Playgroud)

new_var设置正确.

变量在某种程度上是不可变的吗?如何使用set_fact来更新变量的值?

rob*_*obo 15

set_fact模块有效地添加了另一个主机事实,即."发现了关于该系统的一个事实".从文档(http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable),您可以看到这些事实具有低优先级,并将被额外覆盖 - 各种各样的东西.

这可能会set_fact让人感到困惑,因为使用它可能会让你看起来像是在改变变量的值,但也许名字是理解的关键 - 它不是'set_variable',它是'set_(host)fact'和host事实的优先级低.优先级比分配值的顺序更重要.

如果您想通过以后被覆盖的额外变量提供值,则可以通过在Playbook的开头将该extra-vars值重新分配给不同的变量set_fact,然后再使用set_fact重新分配该新变量.由于它们处于相同的优先级,因此"覆盖"应该像您期望的那样工作.


dod*_*gio 5

命令行变量在所有变量类型中具有最高优先级。您在命令行上定义的任何内容都将覆盖该变量的任何其他定义。

Ansible 中有关变量优先级的文档位于https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable其中列出了您需要的所有其他位置可以输入您的初始/默认值。