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

如何按特定顺序执行Ansible集群应用升级任务?

单节点升级后同步至集群其他节点的Ansible方案优化

需求概述

仅在tabapp_main组的单台服务器执行应用升级,将升级后的/opt/tab安装目录同步到tabapp_followers组的所有服务器,同时保证Playbook具备通用性,支持后续新增服务器无需修改Playbook。

原Playbook问题分析

你提供的示例Playbook核心思路(分片执行)是可行的,但存在两处关键问题:

  1. 复制目录的命令写法错误:跨服务器无法直接用cp命令,需要用Ansible的文件同步模块;
  2. 硬编码节点索引(tabapp_followers[0]、tabapp_followers[1]):新增服务器后必须修改Playbook,不满足通用性要求。

分片方法的可行性

分片执行的思路完全可行:分三个阶段(停止所有节点服务、主节点升级、同步目录到从节点)的逻辑符合你的业务场景,只要优化同步环节的实现,就能满足通用性需求。

优化后的分片执行Playbook

方案1:使用synchronize模块直接跨节点同步(依赖rsync)

synchronize是Ansible基于rsync实现的同步模块,支持跨节点直接同步,效率高且配置简洁:

---
- name: 停止所有节点的tab应用
  hosts: tabapp
  tasks:
    - name: 停止tab服务
      systemd:
        name: tab
        state: stopped

- name: 在主节点执行应用升级
  hosts: tabapp_main
  tasks:
    - name: 下载最新安装包
      get_url:
        url: "http://example.com/tab-latest.rpm"
        dest: "/tmp/tab-latest.rpm"
    - name: 升级tab应用
      yum:
        name: "/tmp/tab-latest.rpm"
        state: present

- name: 同步主节点安装目录至所有从节点
  hosts: tabapp_followers
  tasks:
    - name: 从主节点同步/opt/tab目录
      synchronize:
        src: "{{ groups.tabapp_main[0] }}:/opt/tab/"
        dest: "/opt/tab/"
        mode: pull
        rsync_opts:
          - "--delete"  # 可选:保持从节点目录与主节点完全一致,删除多余文件

方案2:通过控制节点中转同步(无需rsync依赖)

如果集群节点未安装rsync,可以用fetch先将主节点的目录拉到AWX控制节点,再用copy推送到所有从节点:

---
- name: 停止所有节点的tab应用
  hosts: tabapp
  tasks:
    - name: 停止tab服务
      systemd:
        name: tab
        state: stopped

- name: 在主节点执行应用升级
  hosts: tabapp_main
  tasks:
    - name: 下载最新安装包
      get_url:
        url: "http://example.com/tab-latest.rpm"
        dest: "/tmp/tab-latest.rpm"
    - name: 升级tab应用
      yum:
        name: "/tmp/tab-latest.rpm"
        state: present

- name: 从主节点拉取安装目录到控制节点
  hosts: tabapp_main
  tasks:
    - name: 拉取/opt/tab目录
      fetch:
        src: "/opt/tab/"
        dest: "/tmp/tab_sync/"
        flat: yes

- name: 将目录推送到所有从节点
  hosts: tabapp_followers
  tasks:
    - name: 推送/opt/tab目录到目标节点
      copy:
        src: "/tmp/tab_sync/tab/"
        dest: "/opt/"
        owner: root
        group: root
        mode: '0755'

其他可选解决方案

  1. AWX工作流拆分:将三个阶段拆分为独立的Job Template,通过AWX工作流串联执行,便于单独调试每个步骤,也支持灵活调整执行顺序;
  2. 单Play内完成所有操作:使用run_once和delegate_to在同一个Play中完成主节点升级和从节点同步,但分阶段的Play结构更清晰,便于维护;
  3. 同步RPM包而非目录:如果应用升级是通过RPM包实现,可以先将主节点下载的RPM包同步到从节点,再在从节点执行安装,这种方式更符合包管理规范,适合需要保留安装记录的场景。

内容的提问来源于stack exchange,提问作者shlco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:10:31