通过extra-vars或inventory变量将Ansible变量设置为undefined

时间:2017-02-28 17:24:03

标签: ansible ansible-2.x

所以我有一个看起来像

的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。

1 个答案:

答案 0 :(得分:6)

Python(因此Ansible)区分未定义的变量和具有none值的变量。

没有办法"取消定义"一旦定义了变量。

结果即使您将值设置为none,您指定的条件也不会将变量视为未定义。

您在输出日志中得到"",因为这是debug模块显示无值的方式,而不是因为它是一个空字符串。

解决方案1 ​​

使用具有条件的三元运算符来检查foo变量的实际值:

- debug:
    msg: "{{ ((foo is defined) and (foo != None)) | ternary(foo, inventory_hostname) }}"

解决方案2

使用"包装"词典:

  1. 在"包装器中定义变量的默认值"词典:

    foodict:
      foo: bar
    
  2. 在游戏中将变量称为foodict.foo

    ---
    - hosts: mygroup
      tasks:
        - debug:
            msg: "{{ foodict.foo | default(inventory_hostname) }}"
    
  3. 通过使"包装器"无效来覆盖清单文件中的值。词典:

    [mygroup]
    127.0.0.1 foodict=None