如何按特定顺序执行Ansible集群应用升级任务?
单节点升级后同步至集群其他节点的Ansible方案优化
需求概述
仅在tabapp_main组的单台服务器执行应用升级,将升级后的/opt/tab安装目录同步到tabapp_followers组的所有服务器,同时保证Playbook具备通用性,支持后续新增服务器无需修改Playbook。
原Playbook问题分析
你提供的示例Playbook核心思路(分片执行)是可行的,但存在两处关键问题:
- 复制目录的命令写法错误:跨服务器无法直接用
cp命令,需要用Ansible的文件同步模块; - 硬编码节点索引(
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'
其他可选解决方案
- AWX工作流拆分:将三个阶段拆分为独立的Job Template,通过AWX工作流串联执行,便于单独调试每个步骤,也支持灵活调整执行顺序;
- 单Play内完成所有操作:使用
run_once和delegate_to在同一个Play中完成主节点升级和从节点同步,但分阶段的Play结构更清晰,便于维护; - 同步RPM包而非目录:如果应用升级是通过RPM包实现,可以先将主节点下载的RPM包同步到从节点,再在从节点执行安装,这种方式更符合包管理规范,适合需要保留安装记录的场景。
内容的提问来源于stack exchange,提问作者shlco
相关产品推荐
相关产品推荐

