Ansible对接多ESXi主机vCenter如何查找指定虚拟机所在的宿主机?
方案说明
首先明确两点:
- 无需提前知晓虚拟机所属的ESXi服务器,有两种实现路径,优先推荐对接vCenter的方案,可完全避免维护ESXi列表的成本
- 若当前环境无vCenter,可通过遍历ESXi列表+提前终止的逻辑实现需求,无需手动感知虚拟机位置
方案1:对接vCenter(优先推荐)
只要你的所有ESXi都纳管到同一vCenter下,不管后续新增多少台ESXi,都无需维护ESXi列表,直接调用community.vmware.vmware_guest_info模块即可直接查询到虚拟机所属ESXi:
- name: 查询虚拟机所属ESXi信息 community.vmware.vmware_guest_info: hostname: "{{ vcenter_address }}" username: "{{ vcenter_username }}" password: "{{ vcenter_password }}" validate_certs: false name: "{{ target_vm_name }}" register: vm_info - name: 输出虚拟机所属ESXi主机名 debug: msg: "目标虚拟机所在ESXi为:{{ vm_info.instance.hw_esxi_host }}"
该方案优势是完全不需要感知ESXi集群的扩缩容,只要vCenter纳管了所有主机就能自动覆盖所有虚拟机。
方案2:无vCenter时遍历ESXi列表实现
如果没有vCenter,可按照你提到的遍历逻辑实现,Ansible原生支持动态修改参数、匹配到结果后终止遍历,具体实现代码如下:
- name: 初始化查询状态标记 set_fact: vm_found: false target_esxi: "" - name: 遍历ESXi列表查询目标虚拟机 community.vmware.vmware_guest_find: hostname: "{{ item }}" username: "{{ esxi_username }}" password: "{{ esxi_password }}" validate_certs: false name: "{{ target_vm_name }}" register: find_result loop: "{{ esxi_host_list }}" failed_when: false when: not vm_found loop_control: label: "正在查询ESXi主机:{{ item }}" - name: 匹配到虚拟机后更新状态标记 set_fact: vm_found: true target_esxi: "{{ item.item }}" loop: "{{ find_result.results }}" when: item.found | default([]) | length > 0 - name: 输出查询结果 debug: msg: "目标虚拟机所在ESXi为:{{ target_esxi }}" when: vm_found - name: 未查询到虚拟机时报错 fail: msg: "所有ESXi主机中未找到目标虚拟机{{ target_vm_name }}" when: not vm_found
核心逻辑说明
- 通过
vm_found标记控制遍历执行:一旦匹配到虚拟机,后续的ESXi遍历任务会因为when: not vm_found条件不满足自动跳过,等价于提前终止遍历 hostname参数直接取循环变量item即可实现动态修改为当前遍历的ESXi地址failed_when: false避免单台ESXi未查询到虚拟机时直接中断整个playbook执行- 所有ESXi的账号建议统一运维,若存在不同账号可将
esxi_host_list定义为字典列表,同时存储主机地址、账号、密码信息即可
内容的提问来源于stack exchange,提问作者João Olavo Vasconcelos
相关产品推荐
相关产品推荐

