Ansible批量部署虚拟主机的核心是将“创建虚拟机”转化为可重复、变量驱动、跨宿主机的自动化任务。需准备KVM宿主机环境(安装libvirt等组件、启用服务)、统一管理镜像与桥接网络资源、用loop结合vm_list变量动态创建虚拟机,并在启动后自动初始化、加入临时inventory并验证连通性。

准备宿主机环境
目标不是部署应用,而是让宿主机具备“生出虚拟机”的能力。需确保每台 KVM 宿主机已安装并启用 libvirt、qemu-kvm、bridge-utils 等基础组件;关闭 SELinux 或配置策略允许 libvirt 操作;开启内核虚拟化支持(egrep -c '(vmx|svm)' /proc/cpuinfo 返回非 0)。
Ansible 可统一完成这些:用 package 模块安装软件包,service 模块启动 libvirtd,user 模块创建专用管理用户(如 kvmadmin),再用 authorized_key 模块部署控制节点的 SSH 公钥。
统一管理镜像与网络资源
批量部署的前提是资源一致。建议将系统镜像(如 CentOS Stream 9 cloud-init 镜像)提前下载到 NFS 或 HTTP 服务器,并通过 Tailscale 或私有网络挂载到所有宿主机的固定路径(如 /var/lib/libvirt/images/base.qcow2)。
网络方面,避免依赖默认 NAT 网络。用 virt_net 模块(需 ansible-collection-community.libvirt)或自定义 shell 任务定义桥接网络(br0),确保所有虚拟机能获得真实内网 IP 并互通。
用变量驱动虚拟机创建过程
不要为每台 VM 写一个 task。而是用 loop + vars_files 或 host_vars 实现动态生成。例如在 inventory 中为每台宿主机定义:
- vm_list: [{name: 'web01', memory_mb: 2048, vcpu: 2, disk_gb: 20}, {name: 'db01', memory_mb: 4096, vcpu: 4, disk_gb: 50}]
- vm_bridge: 'br0'
- vm_image_path: '/var/lib/libvirt/images/centos9.qcow2'
Playbook 中调用 community.libvirt.virt 模块,循环遍历 vm_list,自动完成复制镜像、定义 XML、启动实例、注入 cloud-init 元数据等步骤。
部署后自动初始化与验证
虚拟机启动后,Ansible 可立即通过 wait_for_connection 等待 SSH 就绪,再用 add_host 动态加入临时 inventory,继续执行后续配置(如更新源、安装常用工具、部署应用)。
最后加一个验证任务:对所有新 VM 运行 command: hostnamectl 或 ping 测试连通性,失败时中断流程并输出具体 VM 名称——这比人工逐台检查快得多也可靠得多。

















