【问题标题】:Set Ansible variable to undefined through extra-vars or inventory variable通过额外变量或库存变量将 Ansible 变量设置为未定义
【发布时间】:2017-02-28 17:24:02
【问题描述】:

所以我有一个看起来像的 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,它打印一个空字符串。如何通过库存或extra-vars将变量设置为null?

当我想取消设置已在剧本中定义的变量时,这可能很有用。

我使用的是 Ansible 版本 2.1.1.0。

【问题讨论】:

    标签: ansible ansible-2.x


    【解决方案1】:

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

    一旦定义了变量,就无法“取消定义”它。

    结果即使您将值设置为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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多