Ansible配置双条件正则判断执行任务报模板语法错误如何解决
错误原因
你的playbook报错和逻辑不生效的核心问题有3个:
when条件语句本身运行在Jinja2上下文环境中,不需要在条件内部额外嵌套{{ }}模板标记,嵌套后会直接触发模板解析语法错误,这也是报错提示unexpected '}'的直接原因- 正则匹配的对象和过滤器用错了:你要判断的是传入的
environment参数(即目标主机组名)的前缀,不是hosts变量里存储的主机IP列表;而且regex_replace是字符串替换过滤器,根本不具备正则判断返回布尔值的能力 - 存在语法和笔误:条件括号未闭合、任务名里还把
OS_*错写成了OA_*
正确Playbook编写方案
直接用match正则匹配过滤器判断environment变量的前缀即可,不需要绕弯子查询主机列表,修正后的基础版playbook如下:
- hosts: "{{ environment }}" gather_facts: no vars: package: "{{ package }}" tasks: - name: package为abc且主机组是OS_前缀时执行脚本 shell: sh test.sh when: - package == "abc" - environment is match('^OS_.*') - name: package为xyz且主机组是PA_前缀时执行脚本 shell: sh test.sh when: - package == "xyz" - environment is match('^PA_.*')
扩展优化写法
如果后续需要支持更多包和主机组的映射规则,可以把对应关系抽到变量里统一维护,不用重复写多个task,可维护性更高:
- hosts: "{{ environment }}" gather_facts: no vars: package: "{{ package }}" # 包名与允许执行的主机组前缀映射表 package_group_map: abc: '^OS_.*' xyz: '^PA_.*' tasks: - name: 符合双执行条件时运行脚本 shell: sh test.sh when: - package in package_group_map - environment is match(package_group_map[package])
执行命令参考
运行playbook时通过-e传入外部参数即可,示例:
ansible-playbook your_playbook.yml -e "environment=OS_SB_UAT1 package=abc"
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

