通过传递额外的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来更新变量的值?
答案 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列出了您可以设置初始/默认值的所有其他位置。