一、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 的copy或synchronize模块可实现高效同步。
示例:同步 Nginx 配置文件到所有 Web 服务器
- 编写配置同步 Playbook(config_sync.yml):
\- name: 批量同步Nginx配置文件
  hosts: web\_servers
  remote\_user: root
  tasks:
  - name: 同步nginx.conf配置
  copy:
  src: ./nginx.conf # 控制节点本地配置文件(需提前准备)
  dest: /etc/nginx/nginx.conf # 目标主机配置路径
  mode: 0644
  backup: yes # 同步前备份原有配置(自动添加.bak后缀)
  # 同步后重启Nginx使配置生效
  - name: 重启Nginx
  service:
  name: nginx
  state: restarted
- 执行同步命令:
ansible-playbook config\_sync.yml
进阶技巧:若需同步目录(如 Nginx 虚拟主机配置目录),将copy模块替换为synchronize模块,支持增量同步:
\- name: 同步Nginx虚拟主机配置目录
  synchronize:
  src: ./conf.d/ # 本地目录(末尾加/表示同步目录内文件,不加则同步目录本身)
  dest: /etc/nginx/conf.d/
  delete: yes # 删除目标主机上本地不存在的文件(保持完全一致)
五、实战 3:Ansible 批量更新软件包
定期更新系统软件包是运维必备操作,Ansible 可实现全集群自动化更新,避免逐机执行yum update/apt upgrade。
编写软件更新 Playbook(pkg_update.yml)
\- name: 批量更新系统软件包
  hosts: all # 所有主机(可替换为指定组)
  remote\_user: root
  become: yes # 提权(部分系统需root权限更新)
  tasks:
  # CentOS系统更新
  - name: CentOS更新软件包
  yum:
  name: '\*' # 所有软件包
  state: latest # 更新到最新版本
  update\_cache: yes
  when: ansible\_distribution == "CentOS"
  register: centos\_update\_result # 记录更新结果
  # Ubuntu系统更新
  - name: Ubuntu更新软件包
  apt:
  name: '\*'
  state: latest
  update\_cache: yes
  upgrade: dist # 分发版升级(推荐,包含依赖优化)
  when: ansible\_distribution == "Ubuntu"
  register: ubuntu\_update\_result
  # 输出更新结果(可选,便于查看哪些主机更新了软件)
  - name: 打印CentOS更新结果
  debug:
  msg: "{{ centos\_update\_result }}"
  when: ansible\_distribution == "CentOS"
  - name: 打印Ubuntu更新结果
  debug:
  msg: "{{ ubuntu\_update\_result }}"
  when: ansible\_distribution == "Ubuntu"
执行更新命令:
ansible-playbook pkg\_update.yml
注意事项:
-
生产环境建议先在测试机执行,避免更新导致软件兼容性问题;
-
若需忽略特定软件包(如不想更新内核),可在
yum模块中添加exclude参数:
yum:
  name: '\*'
  state: latest
  exclude: kernel\*,centos-release\* # 忽略内核和系统版本包
六、Ansible 批量操作高频技巧(提升效率)
- 临时命令执行:无需编写 Playbook,直接通过
ansible命令执行单任务(适合快速操作):
\# 批量查看所有主机磁盘使用率
ansible all -m shell -a "df -h"
\# 批量重启web\_servers组的Nginx
ansible web\_servers -m service -a "name=nginx state=restarted"
- 变量与模板:使用
template模块(支持 Jinja2 语法)实现动态配置,例如根据主机 IP 分配 Nginx 端口:
\- name: 部署动态Nginx配置
  template:
  src: ./nginx.conf.j2 # 模板文件(含Jinja2变量)
  dest: /etc/nginx/nginx.conf
模板文件nginx.conf.j2中可嵌入变量:
server {
  listen {{ 8080 if ansible\_default\_ipv4.address == "192.168.1.101" else 80 }};
  server\_name {{ ansible\_hostname }};
}
- 错误处理:在 Playbook 中添加
ignore_errors: yes忽略非关键任务失败,或failed_when定义失败条件:
\- name: 测试文件是否存在
  shell: test -f /etc/nginx/nginx.conf
  register: file\_check
  failed\_when: file\_check.rc != 0 and file\_check.rc != 1 # 仅当返回码不是0/1时失败
- 并行执行:默认 5 台主机并行操作,可通过
-f参数调整并发数(如 10 台并行):
ansible-playbook -f 10 nginx\_deploy.yml