Ansible 从入门到实战:批量管理工具核心用法全解析
一、Ansible 核心介绍
Ansible 是 2013 年推出的 IT 自动化 DevOps 工具,基于 Python 开发,主打轻量级、无客户端特性,是批量管理服务器的首选工具之一。
核心特性
- 无 Agent:基于 Paramiko 实现 SSH 通信,被管理节点仅需开启 SSH 服务,无需安装额外代理;
- 模块化设计:内置丰富模块,支持自定义模块(任意语言编写);
- Playbook 能力:基于 PyYAML 编写可复用的自动化剧本,支持复杂场景;
- Roles 架构:适合部署 OpenStack、K8s 等大型复杂环境。
批量管理工具对比
| 工具 | 开发语言 | 架构 | 现状/特点 |
|---|---|---|---|
| Ansible | Python | 无客户端 | 主流,轻量易上手 |
| SaltStack | Python | C/S 架构 | 小众,配置相对复杂 |
| Puppet | Ruby | C/S 架构 | 淘汰,学习成本高、冷门 |
| Chef | Ruby | C/S 架构 | 淘汰,学习成本高、冷门 |
| |
二、实验环境准备
环境规划
| 主机名 | 角色 | 系统环境 | 硬件配置 |
|---|---|---|---|
| Ansible | 管理主机 | CentOS 7.6 | 2C/4G |
| node01 | 被管理主机 | CentOS 7.6 | 2C/4G |
| node02 | 被管理主机 | CentOS 7.6 | 2C/4G |
| |
基础配置(管理主机执行)
1. 修改主机名
# 管理主机
hostnamectl set-hostname Ansible --static
# 被管理主机(分别在 node01/node02 执行)
hostnamectl set-hostname node01
hostnamectl set-hostname node02
2. 配置本地解析
vim /etc/hosts
# 添加以下内容
192.168.0.30 node01
192.168.0.31 node02
3. 配置 SSH 免密登录
# 生成密钥对(一路回车)
ssh-keygen
# 批量推送公钥到被管理节点
for IP in node01 node02
do
ssh-copy-id $IP
done
安装 Ansible
1. 配置阿里云源
# 替换 Base 源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 配置 EPEL 源(Ansible 依赖)
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2. 安装并验证版本
# 安装 Ansible
yum -y install ansible
# 查看版本
ansible --version
定义主机清单
Ansible 通过清单文件管理被控制主机,默认路径:/etc/ansible/hosts。
# 编辑清单,定义主机组
vim /etc/ansible/hosts
# 添加以下内容
[websrvs]
node[01:02]
# 验证主机组
ansible websrvs --list-host
# 输出示例:
# hosts (2):
# node01
# node02
Ansible 基础命令
1. ansible-doc:模块文档查询
ansible-doc -l # 列出所有模块
ansible-doc -s ping # 查看 ping 模块帮助
2. ansible:核心执行命令
格式:ansible 组名/主机 [-m 模块名] [-a 具体操作]
# 测试 websrvs 组连通性(ping 模块)
ansible websrvs -m ping
3. 返回值颜色说明
- 绿色:执行成功,远程主机无变更;
- 黄色:执行成功,远程主机有变更;
- 红色:执行失败/异常;
- 粉色:警告(可忽略)。
三、Ansible 常用模块实战
1. command 模块(默认模块)
远程执行命令,不经过 bash 解析(< > | ; & 等符号失效)。
常用参数
chdir:执行命令前进入指定目录;creates:文件存在则不执行命令;removes:文件存在才执行命令。
示例
# 进入 /root 目录后执行 ls
ansible websrvs -m command -a 'chdir=/root/ ls'
# 若 /opt/test.txt 存在,则不执行 touch
ansible websrvs -m command -a 'creates=/opt/test.txt touch /opt/test.txt'
# 若 /opt/test.txt 存在,则执行 mv
ansible websrvs -m command -a 'removes=/opt/test.txt mv /opt/test.txt /root/'
# 查看主机名、内核、内存
ansible websrvs -a 'hostname'
ansible websrvs -a 'uname -r'
ansible websrvs -a 'free -h'
2. shell 模块
远程执行命令,通过 bash 解析,支持管道、重定向等符号。
常用参数
cmd:指定执行命令(Playbook 中使用);chdir/creates/removes:同 command 模块。
示例
# 统计 /etc/passwd 行数
ansible websrvs -m shell -a 'cat /etc/passwd | wc -l'
# 重定向文件内容
ansible websrvs -m shell -a 'cat /etc/passwd > /opt/passwd'
# 关闭防火墙并禁用开机自启
ansible websrvs -m shell -a 'systemctl stop firewalld && systemctl disable firewalld'
3. script 模块
执行本地脚本(无需拷贝到远程主机)。
示例:批量配置本地 YUM 源
# 编写脚本
vim /root/yum.sh
#!/bin/bash
mkdir /mnt/centos
mount /dev/cdrom /mnt/centos
echo "/dev/cdrom /mnt/centos iso9660 defaults 0 0" >> /etc/fstab
rm -rf /etc/yum.repos.d/*
echo "[local_centos7]
name=local_centos7
baseurl=file:///mnt/centos
enabled=1
gpgcheck=0" > /etc/yum.repos.d/centos.repo
yum repolist
# 执行脚本
ansible websrvs -m script -a '/root/yum.sh'
4. yum 模块
管理远程主机软件包。
常用参数
name:指定软件包名(必填);state:指定状态(present/installed/latest/removed/absent)。
示例
# 安装 vsftpd
ansible websrvs -m yum -a 'name=vsftpd'
# 卸载 vsftpd
ansible websrvs -m yum -a 'name=vsftpd state=removed'
# 安装最新版本
ansible websrvs -m yum -a 'name=vsftpd state=latest'
5. service 模块
管理远程主机服务。
常用参数
name:服务名(必填);state:服务状态(started/restarted/stopped);enabled:是否开机自启(yes/no)。
示例
# 启动 vsftpd 并设置开机自启
ansible websrvs -m service -a 'name=vsftpd state=started enabled=yes'
# 重启 vsftpd
ansible websrvs -m service -a 'name=vsftpd state=restarted'
# 停止 vsftpd
ansible websrvs -m service -a 'name=vsftpd state=stopped'
# 查看服务状态
ansible websrvs -m shell -a 'systemctl status vsftpd'
6. copy 模块
拷贝本地文件到远程主机。
常用参数
src:本地文件/目录路径;dest:远程目标路径(必填);force:是否强制覆盖(yes/no,默认 yes);backup:覆盖前是否备份(yes/no);owner/group:设置文件属主/属组;mode:设置文件权限(如 0644)。
示例
# 拷贝本地文件到远程
ansible websrvs -m copy -a 'src=/tmp/test.txt dest=/var/ftp'
# 覆盖前备份远程文件
ansible websrvs -m copy -a 'src=/root/hello dest=/opt backup=yes'
# 拷贝并设置属主、权限
ansible websrvs -m copy -a 'src=/root/hello dest=/opt owner=test group=test mode=0744'
# 不强制覆盖(文件不同时跳过)
ansible websrvs -m copy -a 'src=/root/hello dest=/opt force=no'
四、Ansible Playbook 实战
Playbook 是 Ansible 的核心,基于 YAML 编写,用于实现复杂自动化场景。
YAML 基础语法
- 严格区分大小写;
- 缩进用空格(禁止 tab),相同层级左对齐;
#表示注释;:后必须加空格;- 多段配置用
---分隔; - 数组用
-开头,对象用键: 值。
Playbook 核心属性
hosts:目标主机/组;remote_user:远程执行用户;tasks:任务列表(每个任务以-开头);name:任务名称(自定义,便于排查)。
示例 1:基础 Playbook(测试连通性+创建目录)
# 编写剧本
vim ping_websrvs.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: ping websrvs
ping:
- name: mkdir directory test
shell:
cmd: mkdir /test
# 执行剧本
ansible-playbook ping_websrvs.yml
# 语法检查(推荐先执行)
ansible-playbook --syntax-check ping_websrvs.yml
# 模拟执行(不实际修改主机)
ansible-playbook --check ping_websrvs.yml
示例 2:源码部署 Nginx
--- # YAML文件的开始标识(固定格式,告诉系统这是YAML文件)
# 定义一个Play(剧本),Ansible的核心执行单元
- hosts: websrvs # 指定要执行任务的目标主机组:qwe(你的主机组包含20和30两台机器)
remote_user: root # 指定在远程主机上执行命令的用户:root(最高权限)
# 任务列表:所有要在目标主机上执行的操作都写在tasks下面(必须是复数tasks,这是你之前报错的核心)
tasks:
# 第一个任务:安装编译nginx需要的依赖包
- name: 安装nginx编译依赖包 # 任务名称(自定义,方便你看执行日志)
yum: # 调用Ansible的yum模块(用来管理Linux软件包)
# 要安装的软件包列表(逗号分隔):gcc是编译器,pcre-devel处理正则,openssl-devel处理HTTPS,zlib压缩,wget下载文件
name: gcc,pcre-devel,openssl-devel,zlib,wget
state: present # 操作状态:确保包已安装(和installed等价,Ansible推荐写法)
# 第二个任务:创建nginx用户和组(因为编译nginx时要指定nginx用户运行,先建用户才不会报错)
- name: 创建nginx用户和组(编译nginx需要) # 任务名称
user: # 调用Ansible的user模块(用来管理Linux用户)
name: nginx # 要创建的用户名:nginx
shell: /sbin/nologin # 禁止nginx用户登录系统(安全规范,只用来运行程序)
create_home: no # 不创建nginx用户的家目录(不需要)
state: present # 操作状态:确保用户存在(不存在就创建,存在就不操作)
# 第三个任务:下载nginx源码包到/opt目录
- name: 下载nginx源码包到/opt目录 # 任务名称
shell: # 调用Ansible的shell模块(执行Linux命令)
# 具体命令:wget下载nginx包,-P /opt/ 指定下载到/opt目录(你之前问过的wget参数)
wget -P /opt/ https://nginx.org/download/nginx-1.24.0.tar.gz
# 幂等性控制:如果/opt/nginx-1.24.0.tar.gz文件已经存在,就跳过这个任务(避免重复下载)
args:
creates: /opt/nginx-1.24.0.tar.gz
# 第四个任务:解压并编译安装nginx(最核心的步骤,拆成多行更易读)
- name: 解压并编译安装nginx # 任务名称
shell: | # shell模块的|符号:允许写多行Linux命令(按顺序执行)
# 第一步:解压nginx源码包到/opt目录(-C指定解压目录)
tar xf /opt/nginx-1.24.0.tar.gz -C /opt/
# 第二步:进入解压后的目录,执行编译配置、编译、安装
# ./configure:编译前的配置,指定安装路径和功能模块
# --prefix=/usr/local/nginx:nginx的安装目录
# --user=nginx --group=nginx:指定nginx运行的用户/组
# --with-xxx_module:启用nginx的扩展功能(如HTTPS、状态监控、压缩等)
# make:编译源码(把代码转成可执行程序)
# make install:安装编译好的程序到指定目录
cd /opt/nginx-1.24.0 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module && make && make install
# 幂等性控制:如果/usr/local/nginx目录已存在(说明nginx已安装),就跳过这个任务
args:
creates: /usr/local/nginx
# 执行剧本
ansible-playbook nginx.yml
附:常用资源地址
- 阿里云镜像:mirrors.aliyun.com
- 清华大学镜像:mirrors.tuna.tsinghua.edu.cn/
- Docker Hub:hub.docker.com/
- Nginx 官网:nginx.org/
- Ansible 学习文档:www.zsythink.net/archives/ta…