是否有逻辑推理可以解释为什么debug下面的 Ansible 剧本中的两个任务分别输出"NONE"和"FALSE"而不是两者都输出"NONE"?
- hosts: 'all'
tasks:
- debug:
msg: '{{ foo | default( None ) | ternary( "TRUE", "FALSE", "NONE" ) }}'
- debug:
msg: '{{ bar | ternary( "TRUE", "FALSE", "NONE" ) }}'
vars:
bar: '{{ foo | default( None ) }}'
Run Code Online (Sandbox Code Playgroud)
ansible@2.8.5顺便说一句,我观察到了这一点
[编辑@2019-10-16]
从 @VladimirBotka 的回答推断,人们可以说真正的“问题”是相None对于替换而言不具有传递性。我的使用default(...)不必要地使事情复杂化,该示例可以简化为:
- hosts: 'all'
tasks:
- debug:
msg: '{{ None | ternary( "TRUE", "FALSE", "NONE" ) }}'
- debug:
msg: '{{ bar | ternary( "TRUE", "FALSE", "NONE" ) }}'
vars:
bar: '{{ None }}'
Run Code Online (Sandbox Code Playgroud)
...并且仍然产生完全相同的输出。
foo|default(None)评估为null{{ foo|default(None) }}计算结果为空字符串""任务
- debug:
msg: bar is empty string
when: bar|length == 0
Run Code Online (Sandbox Code Playgroud)
给出
"msg": "bar is empty string"
Run Code Online (Sandbox Code Playgroud)
但任务
- debug:
msg: foo is empty string
when: foo|default(None)|length == 0
Run Code Online (Sandbox Code Playgroud)
失败并出现错误:
"... object of type 'NoneType' has no len() ... "
Run Code Online (Sandbox Code Playgroud)
因此,在三元中,空字符串将选择FALSE,而null将选择NONE。
笔记
1) 参见省略参数中的注释
2)如果省略第三个参数,则三元中的null空字符串和空字符串都""选择FALSE 。任务
- debug:
msg: "{{ bar|ternary('TRUE', 'FALSE') }}"
- debug:
msg: "{{ foo|default(None)|ternary('TRUE', 'FALSE') }}"
Run Code Online (Sandbox Code Playgroud)
给
"msg": "FALSE"
"msg": "FALSE"
Run Code Online (Sandbox Code Playgroud)