You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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反而执行了,不符合预期。

解决方法

错误原因分析

  1. 变量引用方式错误:Ansible的when条件属于Jinja2表达式上下文,直接写变量名即可引用变量值,不需要额外用{{}}包裹;而'vm2'是字符串字面量,不是引用变量vm2的值,所以item.name != 'vm2'实际是判断虚拟机名称是否等于字符串vm2,而非变量vm2对应的thisismysecondvm。
  2. 原硬编码字符串拼写错误:"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:10:26