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

Ansible生产环境补丁执行顺序及inventory分组逻辑优化咨询

Ansible 生产环境补丁分批更新优化方案

核心实现思路

业内针对这类有依赖关系、高可用约束的补丁更新场景,统一采用保留原有业务分组不变 + 运行时动态分组 + 多阶段依赖校验的方案,完全不需要额外维护静态补丁分组,也无需为所有主机逐一配置标签,仅需为少量有特殊依赖的主机标记属性即可。

第一步:优化Inventory配置(仅加属性不拆分组)

完全保留你原有的按业务角色划分的inventory结构,仅给有SQL依赖的web服务器新增标记属性,无需修改其他配置:

---
all:
  dcs:
    hosts:
      domaincontroller1
      domaincontroller2
  dbs:
    hosts:
      sql1
      sql2
  webservers:
    hosts:
      websrv1:
        sql_dependent: true # 仅标记有SQL依赖的主机,无需单独创建host_vars文件
      websrv2:
      websrv3:
        sql_dependent: true
      websrv4:

第二步:Playbook实现(含动态分组+分阶段执行)

playbook运行时自动生成所需的临时补丁分组,严格按照高可用、依赖约束分阶段执行,示例代码如下:

---
- name: 生产环境补丁更新全流程
  hosts: all
  gather_facts: true
  serial: 100% # 动态分组阶段全量运行
  pre_tasks:
    - name: 动态拆分DC为两个批次(自动取50%节点为第一批,保证任意时刻至少1台DC在线)
      group_by:
        key: "patch_dc_batch{{ 1 if ansible_play_hosts_all.index(inventory_hostname) < (ansible_play_hosts_all | length // 2) else 2 }}"
      when: "'dcs' in group_names"

    - name: 动态生成SQL依赖/非依赖web服务器分组
      group_by:
        key: "sql_web_{{ 'dependent' if sql_dependent is defined and sql_dependent else 'non_dependent' }}"
      when: "'webservers' in group_names"

# 阶段1:更新第一批DC,验证正常后再进入后续步骤
- name: 分批更新DC第一批
  hosts: patch_dc_batch1
  serial: 1 # 单台更新避免同时故障
  tasks:
    - include_tasks: common_patch_update.yml # 你的通用补丁更新逻辑
    - name: 验证DC服务正常
      wait_for:
        port: 53
        state: started
        delay: 30

# 阶段2:更新SQL服务器,验证完全恢复后再更新依赖的web
- name: 更新SQL服务器
  hosts: dbs
  serial: 1 # 可根据SQL高可用配置调整并行数
  tasks:
    - include_tasks: common_patch_update.yml
    - name: 验证SQL服务正常
      wait_for:
        port: 1433
        state: started
        delay: 60

# 阶段3:更新有SQL依赖的web服务器
- name: 更新SQL依赖的web服务器
  hosts: sql_web_dependent
  serial: 2 # 可根据业务容量调整并行数
  tasks:
    - name: 停业务服务避免脏数据
      service:
        name: "{{ item }}"
        state: stopped
      loop: "{{ web_services }}" # 你预定义的web服务列表
    - include_tasks: common_patch_update.yml
    - name: 验证与SQL连接正常
      wait_for:
        host: "{{ sql_host }}"
        port: 1433
        state: started
        timeout: 10
    - name: 恢复业务服务
      service:
        name: "{{ item }}"
        state: started
      loop: "{{ web_services }}"

# 阶段4:并行更新无依赖的主机(第二批DC + 无SQL依赖的web)
- name: 并行更新剩余无依赖主机
  hosts: patch_dc_batch2,sql_web_non_dependent
  serial: 5 # 可根据资源情况调整并行数
  tasks:
    - include_tasks: common_patch_update.yml
    - name: 验证对应服务正常
      wait_for:
        port: "{{ service_port }}"
        state: started
        delay: 30

方案优势

  • 原有业务分组完全保留,日常批量对web、DC、DB下发配置不受任何影响
  • 无需维护额外的静态补丁分组,DC分批逻辑自动适配DC数量变化,后续新增DC无需手动调整分组规则
  • 仅需为少量有特殊依赖的主机标记属性,100台规模的集群运维成本几乎可以忽略
  • 各阶段自带校验逻辑,完全满足生产环境的高可用、依赖约束要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:54:04