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}}未定义
遍历变量名称列表并检查是否已设置的正确方法是什么?
在循环内部,您可以使用{{ variable | mandatory }}(请参阅强制定义变量)
我认为将其添加为第一个任务看起来更好,它检查 v1 和 v2 是否存在:
- name: 'Check mandatory variables are defined'
assert:
that:
- v1 is defined
- v2 is defined
Run Code Online (Sandbox Code Playgroud)
使用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)
尽管未与您指定的错误消息一起出现,但是是查找插件的默认错误消息。
该模块甚至不会执行,因此您可以使用任何内容?我在上面的示例中替换fail为debug。