Ansible set_fact不会更改变量值

时间:2014-11-20 11:32:58

标签: shell ansible

通过传递额外的var:

调用场景ansible-playbook
-e my_var=init_value

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

set_fact: my_var: {{ other_var }}

这会产生一个很好的输出,据说可以确认改变:

{"ansible facts": {"my_var": "new_value"}}

然而,在更改变量后回显变量会显示旧值:

echo {{ my_var }}
-> "echo init_value"

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

set_fact: my_var: {{ other_var }}
set_fact: new_var: {{ other_var }}

new_var设置正确。

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

2 个答案:

答案 0 :(得分:14)

set_fact模块有效地添加了另一个主机事实,即。 “发现了关于该系统的一个事实”。从文档(http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)可以看出,这些事实的优先级较低,并且会被额外的变量和其他各种事物所覆盖。

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

如果您希望通过以后被覆盖的额外变量提供值,则可以通过set_fact在开始时将该额外变量重新分配给另一个变量。您的Playbook,然后再次使用set_fact重新分配该新变量。由于它们处于相同的优先级,因此“覆盖”应该像您期望的那样工作。

答案 1 :(得分:4)

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

Ansible中有关变量优先级的文档在这里http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable列出了您可以设置初始/默认值的所有其他位置。