Ansible when条件中如何用变量替换字符串实现VM匹配?
Ansible Playbook动态替换when条件变量失效问题
环境变量定义(vars/main.yml)
foldervm: /datacenter/vm/PROD/ vm1: thisismyfirstvm vm2: thisismysecondvm vm3: thisismythirdvm vm4: thisismyfourthvm array: - name: "{{ vm1 }}" cpu: 3 memory: 84992 - name: "{{ vm2 }}" cpu: 10 memory: 20480 - name: "{{ vm3 }}" cpu: 4 memory: 8192 - name: "{{ vm4 }}" cpu: 8 memory: 65536
任务文件(tasks/createlvmpart.yml)
- name: parted /dev/sdc vmware_vm_shell: hostname: "{{ ip_vcenter }}" username: "{{ username_vcenter }}" password: "{{ password_vcenter }}" datacenter: "{{ datacenter_name }}" validate_certs: no folder: "{{ foldervm }}" vm_id: "{{ item.name }}" vm_username: "{{ id }}" vm_password: "{{ pass }}" vm_shell: /usr/sbin/parted vm_shell_args: "-s /dev/sdc unit GB mkpart primary 50% 100% set 2 lvm on" with_items: - "{{ array }}" when: - not item.name is search("thismysecond") - item.name != 'vm3'
问题描述
希望将when条件中硬编码的"thismysecond"替换为变量vm2,实现排除vm2对应虚拟机执行parted命令的效果,但尝试when: not item.name is search("{{ vm2 }}")和when: item.name != 'vm2'均无效,最终结果是vm2未执行命令,而vm1、vm3、vm4反而执行了,不符合预期。
解决方法
错误原因分析
- 变量引用方式错误:Ansible的
when条件属于Jinja2表达式上下文,直接写变量名即可引用变量值,不需要额外用{{}}包裹;而'vm2'是字符串字面量,不是引用变量vm2的值,所以item.name != 'vm2'实际是判断虚拟机名称是否等于字符串vm2,而非变量vm2对应的thisismysecondvm。 - 原硬编码字符串拼写错误:
"thismysecond"与vm2的值thisismysecondvm不匹配,导致原条件并未正确排除vm2。
正确的条件写法
如果需要精确排除vm2和vm3(仅在虚拟机名称不等于vm2、vm3的值时执行任务),修改when条件为:
when: - item.name != vm2 - item.name != vm3
如果需要模糊匹配排除包含vm2值的虚拟机(比如虚拟机名称包含thisismysecondvm子串时排除),则使用:
when: - not item.name is search(vm2) - item.name != vm3
说明
search过滤器用于模糊匹配子串,若需精确匹配,直接使用!=或==即可,无需使用search。- 在Ansible的条件判断、循环等Jinja2上下文场景中,变量直接写名称即可,不需要额外的
{{}}包裹。
内容的提问来源于stack exchange,提问作者user20893268
相关产品推荐
相关产品推荐

