我正在努力理解一些安塞的行为,虽然我已经解决了手头的问题,但我很好奇是否有人可以阐明为什么 ansible的行为方式。
我已删除了该任务的无关细节,并将其归结为this gist。
将变量作为布尔值传递时会出现问题,例如:
ansible-playbook -i ./local.hosts ./test.yml -e "x=true y=false z=false"
我可以在when
子句中使用这些变量,它们按预期工作:
- name: do_something_if_x_is_true
shell: echo kill all humans
when: x
对我而言,这似乎表明x
已作为布尔值传入并解析。但是只要在复合条件中使用x
,(x and y)
- 一切都会出错,并且变量会停止运行。
要解决此问题,我可以将x显式转换为布尔值:
- name: do_something_when_x_and_y_are_true
shell: echo finally robotic beings rule the world
when: (x|bool and y|bool)
很棒,一切都按照我的预期运作。
我真的很想了解这种行为,任何人都可以解释一下吗?
答案 0 :(得分:4)
在命令行上传递的Vars不会通过YAML解析器,这通常是布尔类型推断。如果没有,或者其他一些提示(比如bool过滤器),它们只是Jinja的字符串。 Jinja是Python的一个非常薄的包装器,Python说任何非空字符串都是True。在下面的情况中,YAML解析器执行布尔类型推断,因为vars是内联定义的:
- hosts: all
vars:
x: false
y: false
tasks:
- name: do_something_if_x_is_true
shell: echo kill all humans
when: x or y
# humans are safe!
为了安全起见,如果您不知道您的变量来自哪里,那么使用bool过滤器可能是个好主意。