Ansible批量操作自动化完整教程:批量部署服务、配置同步、软件更新实战

文章目录

Ansible作为无代理自动化运维工具,仅通过SSH协议管控所有Linux主机,不用在目标机器安装客户端,一套YAML剧本即可完成批量服务部署、全集群配置同步、统一软件升级,自带幂等特性,重复执行不会产生异常,中小集群、云服务器、物理机房都能适配。本文从环境搭建到三套可直接上线的生产Playbook完整实操,兼顾新手入门与运维生产落地,所有代码复制即可运行。

一、Ansible基础环境搭建(控制节点操作)

1. 控制节点安装Ansible

控制节点推荐CentOS7+/Ubuntu20.04+,系统自带Python3环境,两种安装方式任选其一。

CentOS/RHEL系列
bash 复制代码
# 安装epel源
yum install epel-release -y
# 安装ansible
yum install ansible -y
# 验证版本,2.10以上稳定版即可
ansible --version
Ubuntu/Debian系列
bash 复制代码
apt update && apt install ansible -y
ansible --version
pip通用安装(所有Linux/macOS)
bash 复制代码
pip3 install ansible

2. 被控节点前置配置(免密SSH推荐)

Ansible默认使用SSH连接服务器,生产环境优先配置密钥免密登录,避免每次执行输入密码。

  1. 控制节点生成密钥
bash 复制代码
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
  1. 批量分发公钥到所有目标机器(示例IP段自行替换)
bash 复制代码
# 单台分发示例
ssh-copy-id root@192.168.1.10
# 批量循环分发多台
for ip in 192.168.1.10 192.168.1.11 192.168.1.12;do ssh-copy-id root@$ip;done

若临时无法配置密钥,执行ansible命令时增加-k参数手动输入SSH密码。

3. 主机清单Inventory配置(核心配置文件)

Inventory是Ansible管理所有服务器的通讯录,新建hosts文件,自定义分组区分web、db、测试机,方便按分组批量操作。

新建/etc/ansible/hosts,写入以下内容:

ini 复制代码
# web服务器分组
[web_servers]
web01 ansible_host=192.168.1.10 ansible_user=root
web02 ansible_host=192.168.1.11 ansible_user=root
web03 ansible_host=192.168.1.12 ansible_user=root

# 数据库服务器分组
[db_servers]
db01 ansible_host=192.168.1.20 ansible_user=root

# 全局变量,所有主机生效
[all:vars]
ansible_port=22
连通性测试

执行ping模块验证所有主机是否可正常通信:

bash 复制代码
# 测试全部机器
ansible all -m ping
# 仅测试web分组
ansible web_servers -m ping

返回pong代表连接正常,报错检查IP、SSH端口、密钥权限。

二、Ansible核心基础概念(新手必看)

  1. Ad-hoc临时命令:单次快速批量操作,适合临时查看、简单启停服务,不保存脚本;
  2. Playbook剧本:YAML格式持久化任务脚本,复杂批量部署、配置同步、软件更新全部使用Playbook,支持变量、触发器、条件判断;
  3. 模块Module:Ansible内置操作工具,yum/apt安装软件、copy同步文件、service管理服务、template渲染动态配置;
  4. 幂等性:同一剧本重复执行,系统只会变更不符合预期的内容,不会重复安装、覆盖配置,线上执行无风险;
  5. Handlers触发器:仅配置文件发生修改时,自动重启对应服务,无变更不执行重启,减少服务抖动。

三、实战一:Ansible批量部署服务(Nginx示例)

业务场景:多台web服务器统一安装Nginx、开放防火墙80端口、设置开机自启、部署默认页面,一套脚本完成全集群服务上线。

1. 新建部署剧本 deploy_nginx.yml

yaml 复制代码
---
- name: 批量部署Nginx Web服务
  hosts: web_servers
  become: yes  # 提权root执行
  gather_facts: true  # 采集目标主机系统信息,区分CentOS/Ubuntu
  tasks:
    # 1. Ubuntu更新软件源缓存
    - name: 更新apt缓存
      apt:
        update_cache: yes
        cache_valid_time: 3600
      when: ansible_os_family == "Debian"

    # 2. 安装Nginx(兼容CentOS/Ubuntu)
    - name: 安装Nginx服务包
      package:
        name: nginx
        state: present

    # 3. 部署自定义首页
    - name: 推送网站首页文件
      copy:
        src: ./index.html
        dest: /var/www/html/index.html
        mode: 0644
        backup: yes
      notify: 重启Nginx服务

    # 4. 防火墙放行80端口(Ubuntu)
    - name: UFW放行HTTP 80端口
      ufw:
        rule: allow
        port: '80'
        proto: tcp
      when: ansible_os_family == "Debian"

    # 5. 防火墙放行80端口(CentOS firewalld)
    - name: firewalld放行80端口
      firewalld:
        service: http
        permanent: yes
        state: enabled
        immediate: yes
      when: ansible_os_family == "RedHat"

    # 6. 设置Nginx开机自启并启动
    - name: 启动Nginx并开机自启
      service:
        name: nginx
        state: started
        enabled: yes

  # 触发器:配置文件变更才执行重启
  handlers:
    - name: 重启Nginx服务
      service:
        name: nginx
        state: restarted

2. 准备本地首页文件 index.html

html 复制代码
<h1>Ansible批量部署Web节点 {{ inventory_hostname }}</h1>
<p>服务自动部署完成,配置统一同步</p>

3. 执行部署脚本

bash 复制代码
# 预校验剧本语法,无报错再执行
ansible-playbook deploy_nginx.yml --syntax-check
# 正式批量部署所有web服务器
ansible-playbook deploy_nginx.yml
# 仅单独部署web02单台机器
ansible-playbook deploy_nginx.yml --limit web02

执行完成后,所有web节点自动安装Nginx、放行端口、同步首页,修改index.html重新执行剧本会自动更新页面并重启服务。

四、实战二:Ansible批量配置同步(生产高频场景)

运维最频繁的需求:统一同步Nginx配置、系统limits、内核参数、监控配置文件,同步前自动备份原有配置,避免误操作丢失原始文件。

1. 配置同步剧本 config_sync.yml

yaml 复制代码
---
- name: 批量同步全集群配置文件
  hosts: all
  become: yes
  tasks:
    # 场景1:同步Nginx主配置文件
    - name: 同步nginx.conf全局配置
      copy:
        src: ./conf/nginx.conf
        dest: /etc/nginx/nginx.conf
        mode: 0644
        owner: root
        group: root
        backup: yes  # 同步前自动备份原文件,后缀.bak
        checksum: sha256  # 校验文件哈希,无变更跳过操作
      notify: 重载Nginx配置

    # 场景2:同步虚拟主机配置目录
    - name: 同步nginx虚拟主机配置文件夹
      synchronize:
        src: ./conf/vhost/
        dest: /etc/nginx/conf.d/
        delete: yes  # 删除远端多余旧配置文件,保持目录完全一致
      notify: 重载Nginx配置

    # 场景3:同步系统内核参数sysctl.conf
    - name: 同步系统内核优化参数
      copy:
        src: ./conf/sysctl.conf
        dest: /etc/sysctl.conf
        backup: yes
      notify: 生效内核参数

    # 场景4:同步系统文件句柄限制limits.conf
    - name: 同步文件打开数限制配置
      copy:
        src: ./conf/limits.conf
        dest: /etc/security/limits.conf
        backup: yes

  handlers:
    - name: 重载Nginx配置
      service:
        name: nginx
        state: reloaded

    - name: 生效内核参数
      command: sysctl -p

2. 目录结构规范

复制代码
ansible_project/
├── config_sync.yml
├── conf/
│   ├── nginx.conf
│   ├── sysctl.conf
│   ├── limits.conf
│   └── vhost/
│       ├── site1.conf
│       └── site2.conf
└── hosts

3. 执行配置同步

bash 复制代码
# 模拟执行,只输出变更内容,不实际修改服务器(推荐上线前测试)
ansible-playbook config_sync.yml --check
# 正式同步所有主机配置
ansible-playbook config_sync.yml
# 只同步db服务器分组
ansible-playbook config_sync.yml --limit db_servers

--check模拟运行是生产环境必备操作,提前查看哪些机器配置会变更,规避大规模同步故障;backup参数会在目标机器原配置同目录生成备份文件,出现异常可快速回滚。

五、实战三:Ansible批量软件更新、系统补丁升级

服务器安全基线维护,定期批量更新所有软件包、安装安全补丁,兼容CentOS yum与Ubuntu apt双系统,支持仅升级指定软件或全量系统更新。

1. 软件更新剧本 server_update.yml

yaml 复制代码
---
- name: 批量系统软件更新与安全补丁升级
  hosts: all
  become: yes
  gather_facts: true
  vars:
    # 自定义需要单独升级的软件列表
    update_pkgs:
      - nginx
      - openssl
      - openssh-server
  tasks:
    # 1. Ubuntu系统全量升级
    - name: Ubuntu系统完整更新升级
      apt:
        upgrade: dist
        update_cache: yes
        cache_valid_time: 3600
        autoremove: yes  # 自动清理无用依赖包
      when: ansible_os_family == "Debian"

    # 2. CentOS系统全量升级所有软件
    - name: CentOS yum全量更新软件包
      yum:
        name: "*"
        state: latest
        update_cache: yes
      when: ansible_os_family == "RedHat"

    # 3. 单独升级指定软件包(nginx、openssl等)
    - name: 单独升级指定业务软件
      package:
        name: "{{ update_pkgs }}"
        state: latest

    # 4. 清理服务器无用缓存包
    - name: CentOS清理yum缓存
      command: yum clean all
      when: ansible_os_family == "RedHat"

    - name: Ubuntu清理apt缓存
      command: apt clean
      when: ansible_os_family == "Debian"

    # 5. 检查内核是否更新,提示重启服务器
    - name: 检测内核版本变化
      command: uname -r
      register: kernel_now

    - name: 输出当前内核版本,如需重启手动执行reboot
      debug:
        msg: "当前内核版本:{{ kernel_now.stdout }},内核更新完成请手动重启服务器"

2. 执行更新操作

bash 复制代码
# 模拟更新,查看待升级包,不实际安装
ansible-playbook server_update.yml --check
# 批量全集群更新所有软件补丁
ansible-playbook server_update.yml
# 仅更新web分组服务器,缩小操作范围
ansible-playbook server_update.yml --limit web_servers

补充:临时Ad-hoc快速更新单类软件

无需写剧本,单行命令批量升级openssl:

bash 复制代码
# CentOS批量升级openssl
ansible all -m yum -a "name=openssl state=latest" -b
# Ubuntu批量升级openssl
ansible all -m apt -a "name=openssl state=latest update_cache=yes" -b

-b等同于become: yes,自动切换root权限执行。

六、Ansible高频实用命令(日常运维必备)

  1. 批量查看所有服务器内存使用
bash 复制代码
ansible all -m shell -a "free -h" -b
  1. 批量重启web服务器Nginx
bash 复制代码
ansible web_servers -m service -a "name=nginx state=restarted" -b
  1. 批量创建统一运维用户deploy
bash 复制代码
ansible all -m user -a "name=deploy shell=/bin/bash state=present" -b
  1. 批量推送本地脚本到远端并执行
bash 复制代码
ansible all -m script -a "./init_script.sh" -b
  1. 限制并发执行数量,避免一次性压垮大量服务器(一次仅操作5台)
bash 复制代码
ansible-playbook deploy_nginx.yml -f 5

七、生产环境最佳实践(避坑要点)

  1. 所有Playbook纳入Git版本管理,配置文件、剧本全程追溯修改记录,多人协作不冲突;
  2. 敏感信息加密:数据库密码、密钥使用ansible-vault加密,禁止明文写在剧本内;
  3. 上线前必加--check模拟运行,确认变更范围后再正式执行,杜绝批量误操作;
  4. 分组精细化管控,严格区分测试、预发、生产机器,禁止全量all执行高危操作;
  5. 配置同步必开backup备份,同步后保留旧配置,出现故障一键回滚;
  6. 大文件同步使用synchronize模块,比copy传输效率更高,支持目录增量同步;
  7. 定期执行系统更新剧本,统一修复安全漏洞,避免单台服务器漏打补丁;
  8. 灰度分批执行 :大规模集群使用serial: 3参数,每次只操作3台,分批发布降低故障影响。
相关推荐
辞旧 lekkk1 小时前
CMake工程指南(一)
linux·运维·服务器·开发语言·qt·学习·萌新
oushaojun21 小时前
deepseek教我什么是docker
运维·docker·容器
回眸&啤酒鸭1 小时前
【回眸】搞钱灵感——AI 数字人口播博主自动化运营
大数据·人工智能·自动化
jieyucx2 小时前
Windows11 & Linux 环境Docker部署与镜像拉取效率优化实战指南
linux·运维·docker
weixin_307779132 小时前
Linux下ClickHouse数据仓库故障系统化诊断脚本
linux·运维·clickhouse·自动化·数据库开发
RisunJan13 小时前
Linux命令-rlogin(远程登录)
linux·运维
深圳恒讯13 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
蓝天下的守望者14 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
小林ixn14 小时前
从“玩具工具”到“跨语言利器”:MCP 协议实战解析
运维·服务器·网络