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