Ansible中正确检查一组变量是否已设置的方法
正确遍历变量名列表检查变量是否已设置的Ansible写法
你的问题核心在于:当你用loop遍历["v1", "v2"]时,item拿到的是字符串形式的变量名(比如"v1"),而不是变量v1本身。所以when: item is undefined永远不会成立——因为字符串"v1"是明确存在的,根本不是未定义状态。
下面是两种符合Ansible规范、不会触发警告的正确写法:
方法1:检查变量名是否存在于vars字典中
Ansible的所有变量都存储在vars内置字典里,你可以直接判断变量名字符串是否在这个字典中:
- hosts: all tasks: - name: Validate required variables fail: msg: "Required variable {{ item }} has not been provided" when: item not in vars loop: - v1 - v2
方法2:用vars.get()获取变量并判断是否未定义
如果需要更严谨的判断(比如区分变量未定义和变量值为None的情况),可以用vars.get()方法,指定默认值为undefined:
- hosts: all tasks: - name: Validate required variables fail: msg: "Required variable {{ item }} has not been provided" when: vars.get(item, undefined) is undefined loop: - v1 - v2
为什么原来的写法会失效?
再回头解释下你的两种尝试:
when: item is undefined:item是字符串"v1",这个字符串本身是存在的,所以条件永远为false,不会触发失败。when: "{{item}} is undefined":Jinja2会先把{{item}}替换成变量名(比如v1),变成v1 is undefined后再让Ansible解析,所以能正确判断,但这种写法违反了Ansible的语法规范——when语句本身就是Jinja2上下文,不需要额外加{{}},因此会触发警告。
内容的提问来源于stack exchange,提问作者user783836
相关产品推荐
相关产品推荐

