所以我有一个看起来像
的Ansible剧本---
- hosts: mygroup
tasks:
- debug:
msg: "{{ foo | default(inventory_hostname) }}"
我的库存文件看起来像
[mygroup]
127.0.0.1
由于foo
未在任何地方定义,因此调试会按预期打印127.0.0.1
。
但假设我的库存文件看起来像
[mygroup]
127.0.0.1 foo=null
当我运行playbook时,它打印出字符串null
。我也试过foo=None
并打印一个空字符串。如何通过库存或额外变量将变量设置为空?
当我想取消设置已在剧本中定义的变量时,这可能很有用。
我正在使用Ansible版本2.1.1.0。
答案 0 :(得分:6)
Python(因此Ansible)区分未定义的变量和具有none值的变量。
没有办法"取消定义"一旦定义了变量。
结果即使您将值设置为none
,您指定的条件也不会将变量视为未定义。
您在输出日志中得到""
,因为这是debug
模块显示无值的方式,而不是因为它是一个空字符串。
解决方案1
使用具有条件的三元运算符来检查foo
变量的实际值:
- debug:
msg: "{{ ((foo is defined) and (foo != None)) | ternary(foo, inventory_hostname) }}"
解决方案2
使用"包装"词典:
在"包装器中定义变量的默认值"词典:
foodict:
foo: bar
在游戏中将变量称为foodict.foo
:
---
- hosts: mygroup
tasks:
- debug:
msg: "{{ foodict.foo | default(inventory_hostname) }}"
通过使"包装器"无效来覆盖清单文件中的值。词典:
[mygroup]
127.0.0.1 foodict=None