如何实现Ansible逐个执行虚拟机快照恢复后再运行Playbook任务?
根据你的需求,我整理了一个完整的Ansible实现方案,刚好能满足你逐个恢复虚拟机快照再执行部署的要求,下面是分步细节:
实现方案概述
核心思路是利用Ansible的serial:1参数强制逐个处理虚拟机,通过委托执行的方式在虚拟化管理平台上完成快照恢复,再等待虚拟机SSH就绪后执行后续部署任务。整个流程完全贴合“仅能在虚拟化平台执行恢复操作”的限制。
1. 前期准备
先把基础环境捋顺:
- 虚拟化平台CLI工具:确保XenServer/ESX主机上已安装对应命令行工具:
- XenServer:预装
xe命令,确认root用户可直接执行 - ESX:推荐安装
govc(VMware官方CLI工具),或使用原生esxcli
- XenServer:预装
- 虚拟机列表文件:
machines.txt按每行一个虚拟机名称编写,示例:vm-web-01 vm-db-01 vm-app-02 - Ansible免密配置:确保Ansible控制节点能免密登录到虚拟化平台主机,同时恢复后的虚拟机也能支持Ansible免密SSH连接。
2. Inventory配置
创建inventory.ini,同时声明虚拟化平台主机和目标虚拟机:
[hypervisors] xenserver-node ansible_host=192.168.1.10 ansible_user=root # 如果是ESX,替换成: # esx-node ansible_host=192.168.1.11 ansible_user=root [target_vms] vm-web-01 ansible_host=192.168.1.101 vm-db-01 ansible_host=192.168.1.102 vm-app-02 ansible_host=192.168.1.103
3. 核心Playbook实现
创建restore_and_deploy.yml,分三个阶段完成任务:
3.1 XenServer版本Playbook
--- - name: 逐个恢复快照并执行部署 hosts: target_vms serial: 1 # 强制逐个处理,核心参数 gather_facts: no vars: hypervisor: "xenserver-node" # 对应inventory中的虚拟化平台主机 target_snapshot: "pre-deploy-base" # 要恢复的快照名称 vm_list_file: "./machines.txt" tasks: - name: 读取machines.txt中的虚拟机列表 set_fact: target_vms_list: "{{ lookup('file', vm_list_file).splitlines() }}" delegate_to: localhost run_once: yes - name: 仅处理列表内的虚拟机 block: - name: 在XenServer上恢复虚拟机快照 command: "xe vm-snapshot-recover snapshot-name='{{ target_snapshot }}' vm='{{ inventory_hostname }}'" delegate_to: "{{ hypervisor }}" register: restore_result until: restore_result.rc == 0 retries: 3 delay: 10 - name: 启动恢复后的虚拟机(如果快照是关机状态) command: "xe vm-start vm='{{ inventory_hostname }}'" delegate_to: "{{ hypervisor }}" when: restore_result.rc == 0 - name: 等待虚拟机SSH端口就绪 wait_for: host: "{{ ansible_host }}" port: 22 state: started delay: 30 # 给虚拟机启动留缓冲时间 timeout: 300 # 最长等待5分钟 - name: 确认虚拟机连接正常(可选) gather_facts: yes - name: 执行自定义部署任务 include_tasks: "./your_deploy_tasks.yml" # 也可以直接在这里写部署逻辑,比如: # yum: # name: nginx # state: present when: inventory_hostname in target_vms_list
3.2 ESX版本调整(替换快照恢复部分)
如果是ESX平台,把快照恢复的任务换成以下内容(以govc为例,需提前在ESX主机配置GOVC_URL等环境变量):
- name: 在ESX上恢复虚拟机快照 command: "govc snapshot.revert -vm '{{ inventory_hostname }}' -name '{{ target_snapshot }}'" delegate_to: "{{ hypervisor }}" register: restore_result until: restore_result.rc == 0 retries: 3 delay: 10
4. 关键细节说明
- 逐个处理保障:
serial:1参数确保Ansible完成一台虚拟机的所有流程(恢复→启动→SSH就绪→部署)后,再处理下一台 - 容错机制:
until+retries参数避免因虚拟化平台临时卡顿导致的恢复失败 - SSH就绪检测:
wait_for模块彻底解决虚拟机恢复后未完全启动就执行部署的问题 - 列表过滤:通过
when条件确保只处理machines.txt中指定的虚拟机,避免误操作其他机器
5. 执行命令
在Ansible控制节点上运行:
ansible-playbook -i inventory.ini restore_and_deploy.yml
内容的提问来源于stack exchange,提问作者Chen A.
相关产品推荐
相关产品推荐

