Ansible批量操作自动化完全指南:部署服务、配置同步、软件更新一步到位

45 阅读7分钟

一、Ansible 批量自动化核心价值:为什么选择它?

在服务器运维中,面对几十上百台主机的重复操作(如统一安装 Nginx、同步配置文件、批量更新软件包),手动执行不仅效率低,还容易出现人为错误。Ansible 作为无 Agent 架构的自动化工具,无需在目标主机安装额外客户端,通过 SSH 即可实现批量管控,支持模块化扩展,无论是新手还是资深运维,都能快速上手实现 “一次编写,多机复用”。

核心应用场景:

  • 批量部署 Web 服务(Nginx/Apache)、数据库(MySQL/Redis)

  • 跨主机配置文件同步(如 /etc/hosts、应用配置)

  • 全集群软件包更新与漏洞修复

  • 自动化执行 Shell 脚本、服务启停等重复操作

二、前置准备:Ansible 环境搭建(Linux 系统实操)

1. 控制节点安装 Ansible(CentOS/Ubuntu 通用)

Ansible 控制节点需满足 Python 2.7 或 3.5 + 环境,推荐使用 Linux 服务器(Windows 需借助 WSL),安装步骤如下:

CentOS/RHEL 系统

\# 安装EPEL源(Ansible不在官方源中)

yum install epel-release -y

\# 安装Ansible

yum install ansible -y

Ubuntu/Debian 系统

\# 更新软件源

apt update

\# 安装Ansible

apt install ansible -y

验证安装

ansible --version  # 显示版本信息即安装成功

2. 目标主机免密登录配置(关键步骤)

Ansible 通过 SSH 连接目标主机,配置免密登录可避免每次输入密码,提升自动化效率:

\# 控制节点生成SSH密钥(一路回车默认即可)

ssh-keygen -t rsa

\# 批量分发公钥到目标主机(替换为实际主机IP)

ssh-copy-id root@192.168.1.101

ssh-copy-id root@192.168.1.102

3. inventory 主机清单配置

Ansible 通过 inventory 文件管理目标主机,默认路径/etc/ansible/hosts,配置格式如下:

\# 单主机配置

192.168.1.101

\# 分组配置(推荐,便于按组操作)

\[web\_servers]

192.168.1.101

192.168.1.102

192.168.1.103

\[db\_servers]

192.168.1.201

192.168.1.202

\# 带端口/用户名配置(非默认22端口时)

192.168.1.104:2222 ansible\_user=ubuntu

测试连通性

\# 测试所有主机

ansible all -m ping

\# 测试web\_servers组

ansible web\_servers -m ping

返回pong即表示控制节点与目标主机通信正常。

三、实战 1:Ansible 批量部署 Nginx 服务

以部署 Nginx 为例,演示从安装到启动的完整自动化流程,使用 Ansible 核心模块实现零手动操作。

1. 编写部署 Playbook(nginx_deploy.yml)

Playbook 是 Ansible 的自动化脚本文件,采用 YAML 格式,内容如下:

\- name: 批量部署Nginx服务

  hosts: web\_servers  # 目标主机组(对应inventory中的分组)

  remote\_user: root   # 远程登录用户

  tasks:

    # 任务1:安装Nginx(根据系统区分yum/apt)

    - name: 安装Nginx(CentOS)

      yum:

        name: nginx

        state: present

      when: ansible\_distribution == "CentOS"

    - name: 安装Nginx(Ubuntu)

      apt:

        name: nginx

        state: present

        update\_cache: yes  # 安装前更新软件源

      when: ansible\_distribution == "Ubuntu"

    # 任务2:启动Nginx并设置开机自启

    - name: 启动Nginx服务

      service:

        name: nginx

        state: started

        enabled: yes  # 开机自启

    # 任务3:拷贝自定义首页文件(可选,替换默认页面)

    - name: 同步自定义index.html

      copy:

        src: ./index.html  # 控制节点本地文件路径

        dest: /usr/share/nginx/html/index.html  # 目标主机路径

        mode: 0644  # 文件权限

2. 准备自定义首页文件(可选)

在 Playbook 同级目录创建index.html,内容自定义:

\<!DOCTYPE html>

\<html>

\<head>\<title>Ansible批量部署测试\</title>\</head>

\<body>\<h1>Web服务器 {{ ansible\_default\_ipv4.address }}\</h1>\</body>

\</html>

3. 执行 Playbook,批量部署

ansible-playbook nginx\_deploy.yml

执行后会显示每个任务的执行结果,绿色表示成功,红色表示失败。部署完成后,访问任意 web 服务器 IP 即可看到自定义首页。

四、实战 2:Ansible 批量同步配置文件

在集群环境中,需保证多台主机配置一致(如 Nginx 配置、数据库配置),使用 Ansible 的copysynchronize模块可实现高效同步。

示例:同步 Nginx 配置文件到所有 Web 服务器

  1. 编写配置同步 Playbook(config_sync.yml):
\- name: 批量同步Nginx配置文件

&#x20; hosts: web\_servers

&#x20; remote\_user: root

&#x20; tasks:

&#x20;   - name: 同步nginx.conf配置

&#x20;     copy:

&#x20;       src: ./nginx.conf  # 控制节点本地配置文件(需提前准备)

&#x20;       dest: /etc/nginx/nginx.conf  # 目标主机配置路径

&#x20;       mode: 0644

&#x20;       backup: yes  # 同步前备份原有配置(自动添加.bak后缀)

&#x20;   # 同步后重启Nginx使配置生效

&#x20;   - name: 重启Nginx

&#x20;     service:

&#x20;       name: nginx

&#x20;       state: restarted
  1. 执行同步命令:
ansible-playbook config\_sync.yml

进阶技巧:若需同步目录(如 Nginx 虚拟主机配置目录),将copy模块替换为synchronize模块,支持增量同步:

\- name: 同步Nginx虚拟主机配置目录

&#x20; synchronize:

&#x20;   src: ./conf.d/  # 本地目录(末尾加/表示同步目录内文件,不加则同步目录本身)

&#x20;   dest: /etc/nginx/conf.d/

&#x20;   delete: yes  # 删除目标主机上本地不存在的文件(保持完全一致)

五、实战 3:Ansible 批量更新软件包

定期更新系统软件包是运维必备操作,Ansible 可实现全集群自动化更新,避免逐机执行yum update/apt upgrade

编写软件更新 Playbook(pkg_update.yml)

\- name: 批量更新系统软件包

&#x20; hosts: all  # 所有主机(可替换为指定组)

&#x20; remote\_user: root

&#x20; become: yes  # 提权(部分系统需root权限更新)

&#x20; tasks:

&#x20;   # CentOS系统更新

&#x20;   - name: CentOS更新软件包

&#x20;     yum:

&#x20;       name: '\*'  # 所有软件包

&#x20;       state: latest  # 更新到最新版本

&#x20;       update\_cache: yes

&#x20;     when: ansible\_distribution == "CentOS"

&#x20;     register: centos\_update\_result  # 记录更新结果

&#x20;   # Ubuntu系统更新

&#x20;   - name: Ubuntu更新软件包

&#x20;     apt:

&#x20;       name: '\*'

&#x20;       state: latest

&#x20;       update\_cache: yes

&#x20;       upgrade: dist  # 分发版升级(推荐,包含依赖优化)

&#x20;     when: ansible\_distribution == "Ubuntu"

&#x20;     register: ubuntu\_update\_result

&#x20;   # 输出更新结果(可选,便于查看哪些主机更新了软件)

&#x20;   - name: 打印CentOS更新结果

&#x20;     debug:

&#x20;       msg: "{{ centos\_update\_result }}"

&#x20;     when: ansible\_distribution == "CentOS"

&#x20;   - name: 打印Ubuntu更新结果

&#x20;     debug:

&#x20;       msg: "{{ ubuntu\_update\_result }}"

&#x20;     when: ansible\_distribution == "Ubuntu"

执行更新命令:

ansible-playbook pkg\_update.yml

注意事项

  1. 生产环境建议先在测试机执行,避免更新导致软件兼容性问题;

  2. 若需忽略特定软件包(如不想更新内核),可在yum模块中添加exclude参数:

yum:

&#x20; name: '\*'

&#x20; state: latest

&#x20; exclude: kernel\*,centos-release\*  # 忽略内核和系统版本包

六、Ansible 批量操作高频技巧(提升效率)

  1. 临时命令执行:无需编写 Playbook,直接通过ansible命令执行单任务(适合快速操作):
\# 批量查看所有主机磁盘使用率

ansible all -m shell -a "df -h"

\# 批量重启web\_servers组的Nginx

ansible web\_servers -m service -a "name=nginx state=restarted"
  1. 变量与模板:使用template模块(支持 Jinja2 语法)实现动态配置,例如根据主机 IP 分配 Nginx 端口:
\- name: 部署动态Nginx配置

&#x20; template:

&#x20;   src: ./nginx.conf.j2  # 模板文件(含Jinja2变量)

&#x20;   dest: /etc/nginx/nginx.conf

模板文件nginx.conf.j2中可嵌入变量:

server {

&#x20;   listen {{ 8080 if ansible\_default\_ipv4.address == "192.168.1.101" else 80 }};

&#x20;   server\_name {{ ansible\_hostname }};

}
  1. 错误处理:在 Playbook 中添加ignore_errors: yes忽略非关键任务失败,或failed_when定义失败条件:
\- name: 测试文件是否存在

&#x20; shell: test -f /etc/nginx/nginx.conf

&#x20; register: file\_check

&#x20; failed\_when: file\_check.rc != 0 and file\_check.rc != 1  # 仅当返回码不是0/1时失败
  1. 并行执行:默认 5 台主机并行操作,可通过-f参数调整并发数(如 10 台并行):
ansible-playbook -f 10 nginx\_deploy.yml