理解Ansible的条件表达式

时间:2015-08-05 15:40:49

标签: ansible ansible-playbook

我正在努力理解一些安塞的行为,虽然我已经解决了手头的问题,但我很好奇是否有人可以阐明为什么 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)

很棒,一切都按照我的预期运作。

我真的很想了解这种行为,任何人都可以解释一下吗?

1 个答案:

答案 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过滤器可能是个好主意。