ansible:已设置检查变量列表的正确方法?

use*_*836 2 ansible ansible-2.x

我试图when: item is undefined在Ansible 2.5中使用以检查是否已设置变量列表,如下所示:

- hosts: all
  tasks:
    - name: validate some variables
      fail:
        msg: "Required variable {{item}} has not been provided"
      when: item is undefined
      loop:
        - v1
        - v2
Run Code Online (Sandbox Code Playgroud)

但是,这永远不会失败,无论是否v1还是v2提供。

切换when为使用jinja2模板工作:

when: "{{item}} is undefined"
Run Code Online (Sandbox Code Playgroud)

但是ansible对此抱怨:

[警告]:当语句不应包含jinja2模板分隔符时,例如{{}}或{%%}。找到:{{item}}未定义

遍历变量名称列表并检查是否已设置的正确方法是什么?

Ale*_*nov 6

在循环内部,您可以使用{{ variable | mandatory }}(请参阅强制定义变量

我认为将其添加为第一个任务看起来更好,它检查 v1 和 v2 是否存在:

- name: 'Check mandatory variables are defined'
  assert:
    that:
      - v1 is defined
      - v2 is defined
Run Code Online (Sandbox Code Playgroud)


tec*_*raf 5

使用vars结构:

- name: validate some variables
  fail:
    msg: "Required variable {{item}} has not been provided"
  when: vars[item] is undefined
  loop:
    - v1
    - v2
Run Code Online (Sandbox Code Playgroud)

或者,在Ansible 2.5中,使用新的vars查找插件:

- name: validate some variables
  debug:
  when: lookup('vars', item) is undefined
  loop:
    - v1
    - v2
Run Code Online (Sandbox Code Playgroud)

尽管未与您指定的错误消息一起出现,但是是查找插件的默认错误消息。

该模块甚至不会执行,因此您可以使用任何内容?我在上面的示例中替换faildebug

  • “assert”不是一个更合适的模块吗? (2认同)