如何通过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
相关产品推荐
相关产品推荐

