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

如何通过Ansible判断VMware虚拟机是否为SRM占位虚拟机

区分Ansible中的VMware真实虚拟机与SRM占位机

刚好我之前处理过类似的问题,给你分享下怎么在Ansible里搞定这个区分——其实原理和PowerCLI是一致的,只是需要用到Ansible VMware模块返回的对应字段就行。

核心思路

Ansible的VMware模块(比如vmware_guest_info、vmware_vm_info)底层调用vSphere API,和PowerCLI获取的数据源是一样的。我们可以通过虚拟机的config.managed_by.extension_key字段来判断:

  • SRM占位机的extension_key通常是com.vmware.vcDr(不同环境可能略有差异,你可以先查一个占位机的具体值)
  • 真实虚拟机的这个字段要么不存在,要么是其他值

方法1:先获取所有VM再筛选

先拉取所有虚拟机的详细信息,再用Jinja2过滤器排除占位机:

- name: 获取所有虚拟机信息并筛选真实VM
  hosts: localhost
  gather_facts: false
  vars:
    vcenter_hostname: "你的VC地址"
    vcenter_username: "VC用户名"
    vcenter_password: "VC密码"
  tasks:
    - name: 拉取全部VM详情
      vmware_guest_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: false
      register: all_vms

    - name: 筛选出真实虚拟机(排除SRM占位机)
      set_fact:
        real_vms: "{{ all_vms.virtual_machines | rejectattr('config.managed_by.extension_key', 'equalto', 'com.vmware.vcDr') | list }}"

    - name: 打印真实虚拟机列表
      debug:
        var: real_vms

方法2:直接在查询时过滤

如果你用的是vmware_vm_info模块,可以直接通过filters参数在查询阶段就排除占位机,效率更高:

- name: 直接查询并过滤真实VM
  hosts: localhost
  gather_facts: false
  vars:
    vcenter_hostname: "你的VC地址"
    vcenter_username: "VC用户名"
    vcenter_password: "VC密码"
  tasks:
    - name: 获取仅真实虚拟机
      vmware_vm_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: false
        filters:
          # 用!表示排除extension_key等于com.vmware.vcDr的VM
          config.managed_by.extension_key: "!com.vmware.vcDr"
      register: real_vms

    - name: 打印结果
      debug:
        var: real_vms.virtual_machines

确认SRM的extension_key

如果你不确定自己环境中SRM占位机的extension_key,可以先单独获取一个占位机的信息查看:

- name: 查询单个占位机的extension_key
  hosts: localhost
  gather_facts: false
  vars:
    vcenter_hostname: "你的VC地址"
    vcenter_username: "VC用户名"
    vcenter_password: "VC密码"
    placeholder_vm_name: "你的占位机名称"
  tasks:
    - name: 获取占位机详情
      vmware_guest_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: false
        name: "{{ placeholder_vm_name }}"
      register: placeholder_vm

    - name: 打印extension_key
      debug:
        var: placeholder_vm.instance.config.managed_by.extension_key

这样就能拿到准确的extension_key值,替换到前面的筛选规则里就行。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:57:48