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

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.

tec*_*raf 6

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

使用"包装器"字典:

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

    foodict:
      foo: bar
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在游戏中将变量称为foodict.foo:

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

    [mygroup]
    127.0.0.1 foodict=None
    
    Run Code Online (Sandbox Code Playgroud)