Ansible Playbook中如何正确比较变量与文本值?
Ansible中变量与文本比较判断的正确实现
原有写法的问题点
- 语法错误:
when关键字后的判断逻辑本身运行在Jinja2原生解析环境中,不需要使用{{ }}包裹变量,直接引用变量名即可,额外加花括号会触发解析异常,导致判断失效 - 逻辑错误:判断运算符使用错误。如果需求是传入的project值既不是tmp1也不是tmp2时终止Playbook,不能使用
or连接判断条件,必须使用and。原or逻辑会导致条件永远成立:比如project值为tmp1时,它必然不等于tmp2,整个or表达式会直接返回真,无论传入什么值都会触发fail任务。
正确写法
基础判断写法:
- name: Stop the executing fail: msg: "非法project值,仅允许使用tmp1或tmp2" when: project != "tmp1" and project != "tmp2"
如果后续需要扩展允许的取值列表,更推荐用not in写法,可维护性更好:
- name: Stop the executing fail: msg: "非法project值,仅允许使用tmp1或tmp2" when: project not in ["tmp1", "tmp2"]
排查提示:如果修正写法后仍然判断异常,可以先在任务前加一个debug任务打印project变量的实际值和类型,确认是否存在inventory传值时带入的首尾空格、换行、类型不匹配问题。存在格式问题时可以先通过过滤器处理变量再比较,比如
project | trim | string先去除首尾空白、强制转字符串类型后再做判断。
内容的提问来源于stack exchange,提问作者Alatau
相关产品推荐
相关产品推荐

