Ansible批量调度落地:一键部署整集群,Shell+Ansible完美闭环

从单机脚本到批量分发,打通自动化部署最后一公里


本系列文章01-05篇已完成从Shell脚本设计规范至Nginx单机编译部署的全流程落地,实现了单机部署的标准化与可复用性。

本文作为系列收官闭环篇,将基于前期构建的Shell标准化部署包,依托Ansible实现全集群一键批量部署,彻底打通自动化部署全流程链路。


一、集群部署系统核心设计目标

  1. 1. 零门槛操作:运维人员仅需执行 ./main.sh 指令,无需关注底层实现逻辑
  2. 2. 配置中心化:通过Ansible主机配置文件conf/hosts完成服务器部署规划,统一管理集群参数
  3. 3. 部署状态可监控:部署完成后自动执行服务状态校验,异常情况实时告警
  4. 4. 高可扩展性:新增软件仅需补充部署包与配置模板,无需修改Playbook核心剧本

二、部署系统目录架构

核心目录结构(建议归档为README.md存放于项目根目录)
# 标准化目录规划,逻辑清晰、便于运维与扩展
├── ansible/          # Ansible核心调度目录
│   ├── ansible.cfg   # Ansible全局配置(独立生效,不影响系统默认配置)
│   ├── inventory/    # 主机清单目录
│   │   └── hosts     # 集群服务器列表(按角色分组,conf文件自动覆盖)
│   └── playbooks/    # 部署剧本目录
│       ├── base.yml          # 基础环境统一配置(yum源、基础软件安装)
│       ├── deploy.yml        # 通用软件部署入口(调用底层角色)
│       ├── main.yml          # 主调度剧本(按流程串联子任务)
│       ├── ntp.yml           # NTP时间同步剧本
│       ├── roles/            # 可复用角色目录
│       │   └── software_deploy/  # 通用软件部署角色
│       │       ├── tasks/        # 角色核心任务
│       │       │   └── main.yml  # 部署全流程:分发+解压+配置+启动+校验
│       │       └── templates/    # 动态配置模板目录
│       │           ├── redis.conf.j2        # Redis模板(按需扩充)
│       │           └── validate_install.j2  # 部署校验模板
│       └── templates/        # 全局通用模板
│           └── ntp.conf.j2    # NTP客户端模板
├── conf/             # 全局配置目录(所有脚本共用)
│   ├── env.conf      # 全局环境变量(路径、日志、安装目录)
│   └── hosts         # 主机清单模板(修改后自动同步至ansible目录)
├── packages/         # 预编译部署包目录(系列04 build.sh产出)
│   └── nginx.tar.gz  # Nginx标准化部署包示例
├── resource/         # 补充资源文件(软件部署后初始化数据、定制配置等)
├── software/         # 从软件部署包分离的安装包(可选)
└── main.sh           # 一键部署入口(唯一操作脚本)

 


三、核心配置文件:构建调度基础框架

3.1 ansible/ansible.cfg Ansible全局配置

该配置实现Ansible运行环境独立隔离,避免与系统全局配置冲突,各项参数均标注功能说明,可直接应用于生产环境:

ansible/ansible.cfg 完整配置
# ==================== Ansible基础默认配置 ====================
[defaults]
# 指定主机清单文件路径
inventory = inventory
# 关闭SSH主机密钥检查,实现批量部署免交互确认
host_key_checking = False
# 关闭失败重试文件生成,保持项目目录整洁
retry_files_enabled = False
# 输出格式设为yaml,提升执行日志可读性
stdout_callback = yaml
# 角色加载路径,适配项目目录架构
roles_path = playbooks/roles
# 自动兼容多版本Python,规避执行环境异常
interpreter_python = auto_legacy_silent

# ==================== 权限提权配置 ====================
[privilege_escalation]
# 开启默认提权,任务执行时自动切换至root权限
become = True
# 提权方式采用sudo
become_method = sudo
# 提权目标用户
become_user = root
# 关闭sudo密码询问,适配免密认证与密钥认证场景
become_ask_pass = False

# ==================== SSH连接优化(提升批量执行效率) ====================
[ssh_connection]
# 启用SSH持久连接,减少重复建连耗时
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
# 开启SSH流水线,大幅提升批量部署速度
pipelining = True
# 持久连接缓存路径
control_path = ~/.ssh/ansible-%%r@%%h:%%p
# 持久连接超时时间(秒)
control_persist = 60s

3.2 conf/env.conf 全局环境变量

统一管理部署全流程全局参数,与Shell脚本、Ansible剧本深度联动,杜绝硬编码,参数修改后全链路生效:

conf/env.conf 全局变量配置# 应用框架全局环境变量配置
# 日志输出级别
LOG_LEVEL="INFO"
# 日志文件持久化存储目录
LOG_DIR="/opt/install/logs/"
# 应用默认安装根目录
INSTALL_DIR="/opt/app"

3.3 conf/hosts 主机清单

按业务角色对集群服务器进行分组管理,支持全局变量与组内自定义变量,是Ansible批量调度的核心依据:

conf/hosts 主机清单配置[all:vars]
# 全局通用SSH认证参数
ansible_user=root                # SSH登录用户
ansible_port=22                  # SSH端口
ansible_ssh_pass=**************  # SSH密码

# Nginx负载均衡集群分组
[nginx_lb]
nginx-01 ansible_host=192.168.3.110
nginx-02 ansible_host=192.168.3.111

# Nginx集群专属变量
[nginx_lb:vars]
software_list="nginx keepalived"  # 待部署软件列表
vip_ip="192.168.3.160"             # 负载均衡虚拟IP
lb_hosts="192.168.3.110,192.168.3.111"  # 后端服务节点列表

四、核心脚本:main.sh 一键部署入口

main.sh为整套部署系统的唯一操作入口,封装环境校验、Ansible初始化、剧本调度全流程逻辑,运维人员无需掌握Ansible语法,单条指令即可完成集群部署。脚本采用模块化设计,核心实现环境自检、初始化、批量调度三大核心能力。

4.1 核心功能概述

  • • 全局路径绑定:锁定项目根目录,与配置文件强关联,规避路径错乱风险
  • • 分级日志输出:带时间戳的结构化日志,支持控制台与文件双落盘,便于问题追溯
  • • 依赖自动检测:离线校验Ansible运行环境,缺失组件一键补装,适配国产化与CentOS系列系统
  • • 环境一键初始化:自动同步主机清单、创建必备目录,消除前置部署障碍
  • • 剧本智能调度:传递全局变量执行主剧本,实现全流程自动化部署
  • • 简易交互指令:支持run(部署)、help(帮助)指令,降低操作门槛

4.2 核心代码展示(精简版)

说明:脚本保留核心调度逻辑,省略离线安装、异常捕获等冗余细节,仅展示主体结构与关键函数。

main.sh 核心代码片段(已省略冗余细节)#!/bin/bash
# 锁定项目根目录,保障路径绝对可靠
PROJECT_DIR=$(cd `dirname $0`; pwd)
export ANSIBLE_DIR="$PROJECT_DIR/ansible"
export ANSIBLE_CONFIG="$ANSIBLE_DIR/ansible.cfg"
export CONFIG_DIR="$PROJECT_DIR/conf"
export SOURCE_PACKAGES_DIR="$PROJECT_DIR/packages"
export TARGET_PACKAGES_DIR="/opt/packages"

# 分级日志函数(含时间戳、日志级别标识)
log() {
    local message=$1
    local level=${2:-INFO}
    local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo -e "[$level][$timestamp] $message"
}

# Ansible环境检测(省略离线安装、详细校验逻辑)
check_ansible() {
    if ! command -v ansible > /dev/null; then
        log "Ansible未安装,启动离线安装流程"
        # 系统判断、解压安装等细节逻辑(已省略)
    fi
    # 核心配置文件完整性校验
    local critical_files=("$ANSIBLE_DIR/ansible.cfg" "$CONFIG_DIR/hosts")
    for file in "${critical_files[@]}"; do
        [ ! -e "$file" ] && log "缺失关键配置文件:$file" && exit 1
    done
}

# 环境初始化(省略目录权限、备份等辅助逻辑)
initialize(){
    check_ansible
    mkdir -p "$ANSIBLE_DIR/inventory"
    cp "$CONFIG_DIR/hosts" "$ANSIBLE_DIR/inventory/hosts"
    log "环境初始化完成"
}

# 执行Ansible剧本调度
run_playbook() {
    log "启动集群批量部署流程"
    ansible-playbook "$ANSIBLE_DIR/playbooks/main.yml" \
        -e "source_packages_dir=$SOURCE_PACKAGES_DIR" \
        -e "target_packages_dir=$TARGET_PACKAGES_DIR" \
        -e "timezone=Asia/Shanghai"
}

# 主流程:指令解析与部署执行
main() {
    case "${1:-run}" in
        run) initialize && run_playbook && log "集群部署完成" ;;
        -h|--help) echo "用法: $0 run | --help" ;;
        *) log "未知指令,请输入 --help 查看使用说明" && exit 1 ;;
    esac
}

main "$@"

使用规范:

# 赋予脚本执行权限
chmod +x main.sh
# 执行全量集群部署
./main.sh run

该脚本屏蔽底层复杂逻辑,实现极简式部署操作,降低运维人员使用成本。


五、Ansible Playbook核心逻辑

5.1 playbooks/main.yml 主调度剧本

本剧本将集群主机划分为控制主机、数据库主机、普通业务主机三类,采用差异化部署策略:核心节点串行执行保障稳定性,普通节点并行执行提升效率。后续章节将详细阐述主机分组逻辑、适用场景及性能调优方案,本文优先落地标准化调度框架。

playbooks/main.yml 核心调度剧本(已省略冗余配置)
# 加载全局变量,对接项目配置体系
- name: 加载全局部署参数
  hosts: all
  vars:
    config_file_dir: "{{ playbook_dir + '/../conf' }}"
    source_packages_dir: "{{ playbook_dir + '/../packages' }}"
    target_packages_dir: "/opt/packages"
    timezone: "Asia/Shanghai"

# 控制主机:核心节点串行部署,规避并发冲突
- name: 控制主机初始化与软件部署
  hosts: control_hosts
  serial: 1
  tasks:
    - name: 基础环境配置
      include_tasks: base.yml
    - name: 执行软件部署
      include_tasks: deploy.yml

# 普通主机:并行完成基础配置与时间同步
- name: 普通主机基础环境初始化
  hosts: "all:!control_hosts"
  tasks:
    - name: 基础环境配置
      include_tasks: base.yml
    - name: NTP时间同步
      include_tasks: ntp.yml

# 数据库主机:核心组件串行部署(省略重复校验、变量赋值细节)
- name: 数据库主机专属部署
  hosts: db_hosts
  serial: 1
  tasks:
    - name: 数据库软件部署
      include_tasks: deploy.yml

# 通用业务主机:无状态服务并行部署(省略冗余判断逻辑)
- name: 普通业务主机批量部署
  hosts: "all:!control_hosts,!db_hosts"
  tasks:
    - name: 业务软件部署
      include_tasks: deploy.yml

 

5.2 playbooks/deploy.yml(通用软件部署入口)

本剧本为软件部署统一入口,支持多软件批量部署、临时文件自动清理,完全复用底层角色模块,无需重复编写部署逻辑,适配各类中间件标准化部署。

playbooks/deploy.yml 核心配置(已省略冗余清理、判断细节)
# 通用软件批量部署剧本
- name: 初始化远程部署环境
  hosts: all
  gather_facts: false
  become: true

  tasks:
    # 创建远程安装包缓存目录
    - name: 创建安装包目录
      file:
        path: "{{ target_packages_dir }}"
        state: directory
        mode: 0755

    # 循环读取软件列表,调用部署角色
    - name: 批量部署指定软件
      include_role:
        name: software_deploy
      loop: "{{ software_list.split() }}"
      loop_control:
        loop_var: current_software
      when: software_list is defined and software_list | trim | length > 0

    # 部署后清理临时目录(省略空目录判断、权限校验冗余逻辑)
    - name: 清理部署缓存目录
      file:
        path: "{{ target_packages_dir }}"
        state: absent
      when: cleanup_after_deploy | default(true) | bool

 

5.3 roles/software_deploy/tasks/main.yml(通用部署核心角色)

该角色为标准化部署执行单元,覆盖变量初始化、安装包分发、解压、配置渲染、安装执行、状态校验、资源清理全流程,支持多软件通用适配,以下为核心步骤展示(冗余细节已省略):

software_deploy 核心任务脚本(已省略冗余步骤)
# 1. 变量初始化:合并全局配置与主机专属配置(省略默认赋值、校验细节)
- name: 定义当前部署软件名称
  set_fact:
    software_name: "{{ current_software }}"
- name: 合并全局与个性化配置参数
  set_fact:
    current_config: "{{ base_config | default({}) | combine(host_config.get(software_name, {})) }}"

# 2. 部署包分发与解压,避免重复传输
- name: 检查远程安装包是否存在
  stat:
    path: "{{ target_packages_dir }}/{{ software_name }}.tar.gz"
  register: package_stat
- name: 拷贝部署包至目标主机
  copy:
    src: "{{ source_packages_dir }}/{{ software_name }}.tar.gz"
    dest: "{{ target_packages_dir }}/"
  when: not package_stat.stat.exists
- name: 解压部署包
  unarchive:
    src: "{{ target_packages_dir }}/{{ software_name }}.tar.gz"
    dest: "{{ target_packages_dir }}"
    remote_src: yes

# 3. 配置文件渲染与下发(省略权限设置、本地备份冗余逻辑)
- name: 拷贝全局环境配置文件
  copy:
    src: "{{ config_file_dir }}/env.conf"
    dest: "{{ target_packages_dir }}/{{ software_name }}/conf/"
- name: 渲染主机专属配置模板
  template:
    src: "{{ software_name }}.conf.j2"
    dest: "{{ config_file_dir }}/{{ software_name }}.{{ inventory_hostname }}.conf"
  delegate_to: localhost

# 4. 执行安装与状态校验(省略异常捕获、重试逻辑)
- name: 执行软件安装脚本
  command: "./{{ current_config.install_script | default('install_' + software_name) }}"
  args:
    chdir: "{{ target_packages_dir }}/{{ software_name }}/bin"
  register: install_result
- name: 生成并执行部署校验脚本
  template:
    src: "validate_install.j2"
    dest: "/tmp/validate_install_{{ software_name }}.sh"
- name: 执行部署状态验证
  command: "/tmp/validate_install_{{ software_name }}.sh"

# 5. 部署成功后清理临时资源
- name: 清理安装包与临时目录
  file:
    path: "{{ item }}"
    state: absent
  loop:
    - "{{ target_packages_dir }}/{{ software_name }}.tar.gz"
    - "{{ target_packages_dir }}/{{ software_name }}"
  when: install_result.rc == 0 and validation_result.rc == 0

 


六、实战演示:一键部署Nginx负载均衡集群(验证效果)

完成配置与脚本准备后,仅需三步即可实现集群标准化部署,全程无需人工干预:

步骤1:部署包准备

将系列04编译打包生成的 nginx.tar.gz 存放至项目 packages/ 目录,确保包名与主机清单配置参数一致。

步骤2:集群服务器配置

修改 conf/hosts 文件,配置Nginx负载均衡节点IP及专属参数:

conf/hosts Nginx集群配置
# Nginx负载均衡节点分组
[nginx_lb]
nginx-01 ansible_host=192.168.3.110
nginx-02 ansible_host=192.168.3.111

# 集群专属参数
[nginx_lb:vars]
software_list="nginx keepalived"
vip_ip="192.168.3.160"
lb_hosts="192.168.3.110,192.168.3.111"

步骤3:执行一键部署

部署执行指令
# 赋予脚本执行权限
chmod +x main.sh

# 启动集群批量部署
./main.sh run

部署结果验证

指令执行后,控制台输出全量部署日志,任务执行状态、节点结果清晰可查,以下为关键日志精简展示:

部署执行关键日志(精简版)
[root@control_host deploy]# ./main.sh
[INFO][2026-03-18 15:16:50] 开始执行playbook...
[WARNING]: Could not match supplied host pattern, ignoring: db_hosts
[WARNING]: Could not match supplied host pattern, ignoring: all:!control_hosts

# 控制主机部署阶段
PLAY [部署控制主机] *********************************************************************
TASK [Gathering Facts] *****************************************************************
ok: [control_host]
TASK [在控制主机上部署软件] *****************************************************************
included: /opt/install/deploy/ansible/playbooks/deploy.yml for control_host
TASK [创建安装包目录] *********************************************************************
changed: [control_host]
TASK [配置基础环境] ***********************************************************************
included: /opt/install/deploy/ansible/playbooks/base.yml for control_host
TASK [安装jq工具] ***********************************************************************
ok: [control_host]
TASK [显示jq安装结果] *********************************************************************
ok: [control_host] => msg: 'jq安装完成,版本: jq-1.8.1'

# 负载均衡主机基础配置与时间同步
PLAY [所有主机基础配置(除控制主机)] **********************************************************
TASK [Gathering Facts] *****************************************************************
ok: [nginx-01, nginx-02]
TASK [配置基础环境] ***********************************************************************
included: /opt/install/deploy/ansible/playbooks/base.yml for nginx-01, nginx-02
TASK [更新yum缓存并安装基础软件包] ************************************************************
changed: [nginx-01, nginx-02]
TASK [配置时间同步] ***********************************************************************
included: /opt/install/deploy/ansible/playbooks/ntp.yml for nginx-01, nginx-02
TASK [强制时间同步] ***********************************************************************
ok: [nginx-01, nginx-02]
TASK [显示时间同步结果] *********************************************************************
ok: [nginx-01] => msg: '时间同步结果: [''18 Mar 15:18:17 ntpdate[3966]: adjust time server 192.168.0.2 offset -0.000000 sec'']'

# 部署结果汇总(核心校验指标)
PLAY RECAP *****************************************************************************
nginx-01                : ok=24   changed=8    unreachable=0    failed=0
nginx-02                : ok=24   changed=8    unreachable=0    failed=0
control_host            : ok=13   changed=2    unreachable=0    failed=0

日志说明:本次部署仅涉及控制主机与Nginx负载均衡节点,无数据库主机匹配,主机分组忽略警告属于正常现象;所有节点failed=0、unreachable=0,表明集群部署完全成功。


系列总结与后续规划

至此,「Ansible+Shell自动化部署应用集群」系列1-6篇全部完结,本系列实现了从脚本设计规范、单机标准化部署到集群批量调度的全流程落地,整套方案可直接迁移至生产环境应用。

后续进阶实战内容规划:

  • • 控制主机的安装部署与配置优化
  • • 引言涉及的其他软件部署实战逐步更新

若本文所述方案对您的工作有参考价值,欢迎点赞、收藏、转发;也可在评论区留言您需落地的中间件集群场景,将优先推出对应实战教程。

posted @ 2026-03-30 10:25  知者认知  阅读(4)  评论(0)    收藏  举报