Ansible使用add_host动态添加KVM主机到inventory后无法识别问题求助
问题根因
你通过add_host添加的主机已经成功写入当前Ansible运行周期的内存清单,这一点从hostvars的输出可以确认。问题出在Ansible的Play执行逻辑:
每个Play的目标主机列表在Play初始化阶段就会完成预解析,2.11版本中如果仅指定hosts: all,默认只会匹配静态inventory初始解析出的主机列表,不会自动纳入动态添加的主机。
解决方案
方案1:显式在后续Play中指定包含动态组
将Play B的hosts字段修改为同时包含原有静态主机和你动态添加的组即可,例如你的最小复现可以修改为:
- name: "Play B" hosts: ansible,myGroup # 同时覆盖静态主机和动态添加的myGroup组 become: yes gather_facts: no tasks: - debug: var=hostvars - debug: var=group_names - debug: var=play_hosts - name: test-ping ping:
实际使用时将myGroup替换为你实际的动态组名libvirt即可。如果需要匹配所有静态+动态主机,也可以写成hosts: all,libvirt。
方案2:拆分Play分别处理静态和动态主机
如果需要对两类主机执行不同逻辑,可以拆分Play分别指定目标:
# 处理原有静态主机 - name: "处理静态管理节点" hosts: local_ansible become: yes gather_facts: no tasks: - debug: msg="执行管理节点任务" # 处理动态添加的KVM虚拟机 - name: "处理KVM虚拟机" hosts: libvirt become: yes gather_facts: yes tasks: - name: 测试虚拟机连通性 ping:
注意事项
如果执行动态主机任务时出现SSH连接报错,可以在add_host任务后添加端口等待逻辑,避免虚拟机SSH服务未就绪导致执行失败:
- name: 等待虚拟机SSH端口就绪 local_action: module: wait_for host: "{{ vm_ip }}" port: 22 delay: 5 timeout: 300 state: started
内容的提问来源于stack exchange,提问作者David Koenig
相关产品推荐
相关产品推荐

