文章目录
-
- 一、Ansible基础环境搭建(控制节点操作)
-
- [1. 控制节点安装Ansible](#1. 控制节点安装Ansible)
- [2. 被控节点前置配置(免密SSH推荐)](#2. 被控节点前置配置(免密SSH推荐))
- [3. 主机清单Inventory配置(核心配置文件)](#3. 主机清单Inventory配置(核心配置文件))
- 二、Ansible核心基础概念(新手必看)
- 三、实战一:Ansible批量部署服务(Nginx示例)
-
- [1. 新建部署剧本 `deploy_nginx.yml`](#1. 新建部署剧本
deploy_nginx.yml) - [2. 准备本地首页文件 `index.html`](#2. 准备本地首页文件
index.html) - [3. 执行部署脚本](#3. 执行部署脚本)
- [1. 新建部署剧本 `deploy_nginx.yml`](#1. 新建部署剧本
- 四、实战二:Ansible批量配置同步(生产高频场景)
-
- [1. 配置同步剧本 `config_sync.yml`](#1. 配置同步剧本
config_sync.yml) - [2. 目录结构规范](#2. 目录结构规范)
- [3. 执行配置同步](#3. 执行配置同步)
- [1. 配置同步剧本 `config_sync.yml`](#1. 配置同步剧本
- 五、实战三:Ansible批量软件更新、系统补丁升级
-
- [1. 软件更新剧本 `server_update.yml`](#1. 软件更新剧本
server_update.yml) - [2. 执行更新操作](#2. 执行更新操作)
- 补充:临时Ad-hoc快速更新单类软件
- [1. 软件更新剧本 `server_update.yml`](#1. 软件更新剧本
- 六、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连接服务器,生产环境优先配置密钥免密登录,避免每次执行输入密码。
- 控制节点生成密钥
bash
ssh-keygen -t rsa -N "" -f /root/.ssh/id_rsa
- 批量分发公钥到所有目标机器(示例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核心基础概念(新手必看)
- Ad-hoc临时命令:单次快速批量操作,适合临时查看、简单启停服务,不保存脚本;
- Playbook剧本:YAML格式持久化任务脚本,复杂批量部署、配置同步、软件更新全部使用Playbook,支持变量、触发器、条件判断;
- 模块Module:Ansible内置操作工具,yum/apt安装软件、copy同步文件、service管理服务、template渲染动态配置;
- 幂等性:同一剧本重复执行,系统只会变更不符合预期的内容,不会重复安装、覆盖配置,线上执行无风险;
- 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高频实用命令(日常运维必备)
- 批量查看所有服务器内存使用
bash
ansible all -m shell -a "free -h" -b
- 批量重启web服务器Nginx
bash
ansible web_servers -m service -a "name=nginx state=restarted" -b
- 批量创建统一运维用户deploy
bash
ansible all -m user -a "name=deploy shell=/bin/bash state=present" -b
- 批量推送本地脚本到远端并执行
bash
ansible all -m script -a "./init_script.sh" -b
- 限制并发执行数量,避免一次性压垮大量服务器(一次仅操作5台)
bash
ansible-playbook deploy_nginx.yml -f 5
七、生产环境最佳实践(避坑要点)
- 所有Playbook纳入Git版本管理,配置文件、剧本全程追溯修改记录,多人协作不冲突;
- 敏感信息加密:数据库密码、密钥使用ansible-vault加密,禁止明文写在剧本内;
- 上线前必加--check模拟运行,确认变更范围后再正式执行,杜绝批量误操作;
- 分组精细化管控,严格区分测试、预发、生产机器,禁止全量all执行高危操作;
- 配置同步必开backup备份,同步后保留旧配置,出现故障一键回滚;
- 大文件同步使用synchronize模块,比copy传输效率更高,支持目录增量同步;
- 定期执行系统更新剧本,统一修复安全漏洞,避免单台服务器漏打补丁;
- 灰度分批执行 :大规模集群使用
serial: 3参数,每次只操作3台,分批发布降低故障影响。