为何Ansible assert在循环中检测未定义变量不触发失败?
问题根源与解决方案
问题出在哪里?
问题完全出在循环任务的逻辑实现上,前两个单独的断言任务是正常工作的,和that:里的测试语句语法无关。
核心错误原因
你在loop里列出的是字符串字面量(比如"variableThatDoesNotExist"),而非变量引用。此时:
item is defined实际是判断这个字符串值本身是否存在——字符串是明确存在的,所以这个断言永远为Trueitem | length > 0是判断这个字符串的长度是否大于0,显然这些变量名字符串的长度都满足要求,所以也永远为True
这就导致哪怕对应的变量根本没定义,循环里的断言也会全部通过,和你预期的逻辑完全不符。
正确的实现方式
要通过字符串形式的变量名检查对应变量是否存在,需要借助Ansible的vars内置字典(它存储了当前可用的所有变量),修改后的循环任务如下:
- name: Check mandatory variables with loop assert: quiet: false that: - item in vars # 检查变量是否已定义(即变量名存在于vars字典中) - vars[item] | length > 0 # 检查变量的值非空 loop: - variableA - variableB - variableThatDoesNotExist
验证效果
执行修改后的playbook时:
- 已传入的
variableA和variableB会正常通过断言 - 未定义的
variableThatDoesNotExist会触发item in vars返回False,导致断言失败,playbook终止执行
内容的提问来源于stack exchange,提问作者Michel Briand
相关产品推荐
相关产品推荐

