Ansible批量调度落地:一键部署整集群,Shell+Ansible完美闭环
从单机脚本到批量分发,打通自动化部署最后一公里
本系列文章01-05篇已完成从Shell脚本设计规范至Nginx单机编译部署的全流程落地,实现了单机部署的标准化与可复用性。
本文作为系列收官闭环篇,将基于前期构建的Shell标准化部署包,依托Ansible实现全集群一键批量部署,彻底打通自动化部署全流程链路。
一、集群部署系统核心设计目标
- 1. 零门槛操作:运维人员仅需执行
./main.sh指令,无需关注底层实现逻辑 - 2. 配置中心化:通过Ansible主机配置文件conf/hosts完成服务器部署规划,统一管理集群参数
- 3. 部署状态可监控:部署完成后自动执行服务状态校验,异常情况实时告警
- 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篇全部完结,本系列实现了从脚本设计规范、单机标准化部署到集群批量调度的全流程落地,整套方案可直接迁移至生产环境应用。
后续进阶实战内容规划:
- • 控制主机的安装部署与配置优化
- • 引言涉及的其他软件部署实战逐步更新
若本文所述方案对您的工作有参考价值,欢迎点赞、收藏、转发;也可在评论区留言您需落地的中间件集群场景,将优先推出对应实战教程。

浙公网安备 33010602011771号