You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Ansible逐个执行虚拟机快照恢复后再运行Playbook任务?

根据你的需求,我整理了一个完整的Ansible实现方案,刚好能满足你逐个恢复虚拟机快照再执行部署的要求,下面是分步细节:

实现方案概述

核心思路是利用Ansible的serial:1参数强制逐个处理虚拟机,通过委托执行的方式在虚拟化管理平台上完成快照恢复,再等待虚拟机SSH就绪后执行后续部署任务。整个流程完全贴合“仅能在虚拟化平台执行恢复操作”的限制。


1. 前期准备

先把基础环境捋顺:

  • 虚拟化平台CLI工具:确保XenServer/ESX主机上已安装对应命令行工具:
    • XenServer:预装xe命令,确认root用户可直接执行
    • ESX:推荐安装govc(VMware官方CLI工具),或使用原生esxcli
  • 虚拟机列表文件: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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:31:14