从零玩转Ansible:自动化运维入门到实战(超详细教程)
Ansible是一款面向类Unix系统的自由开源自动化工具,由Python编写,核心功能是“配置管理”和“任务自动化”。简单说,它能让你在“管理端”一台机器上,批量控制几十、上百台“被管理端”服务器,完成命令执行、软件安装、配置部署等操作。无需在被管理端安装任何客户端(Agentless),只依赖SSH协议通信;配置文件用YAML编写,语法简洁易懂,新手也能快速上手;支持Jinja2模板,可灵活生
文章目录
作为运维工程师,你是否还在为“重复登录多台服务器执行相同命令”“手动配置几十台机器的环境”而头疼?如果答案是肯定的,那Ansible——这款轻量级自动化运维工具,绝对能帮你摆脱“手动运维”的困境。今天这篇文章,我会从Ansible的基础概念讲到实战操作,带你一步步掌握自动化运维的核心能力。
一、认识Ansible:为什么它是运维的“好帮手”
在聊实战前,我们先搞清楚:Ansible到底是什么?它和其他自动化工具(比如SaltStack、Puppet)有什么不一样?
1.1 什么是Ansible?
Ansible是一款面向类Unix系统的自由开源自动化工具,由Python编写,核心功能是“配置管理”和“任务自动化”。简单说,它能让你在“管理端”一台机器上,批量控制几十、上百台“被管理端”服务器,完成命令执行、软件安装、配置部署等操作。
和SaltStack、Puppet相比,Ansible的最大优势就是**“轻”**:
- 无需在被管理端安装任何客户端(Agentless),只依赖SSH协议通信;
- 配置文件用YAML编写,语法简洁易懂,新手也能快速上手;
- 支持Jinja2模板,可灵活生成个性化配置文件。
1.2 Ansible的“成长史”
了解它的背景,能帮你更信任这个工具:
- 2013年:Ansible成立,总部位于美国北卡罗来纳州达勒姆;
- 2015年10月:红帽(Red Hat)以1-1.5亿美元收购Ansible,纳入企业级运维生态;
- 至今:Ansible已成为企业级自动化运维的主流工具,支持云计算、大数据平台等复杂场景。
1.3 Ansible的核心组成
要理解Ansible的工作逻辑,先记住它的5个核心组件:
组件 | 作用说明 |
---|---|
Ansible | 核心引擎,负责解析配置、调度任务、与被管理端通信 |
Modules | 任务执行单元,包括内置核心模块(如yum 、copy )和自定义模块(Python编写) |
Plugins | 补充功能,如连接插件(默认SSH)、邮件插件(任务执行后发通知) |
Playbooks | “剧本”,用YAML定义多任务流程(比如“安装Nginx→配置文件→启动服务”) |
Inventory | 主机清单,记录被管理端的IP/主机名、分组信息、登录变量(端口、用户名等) |
1.4 什么是Role?解决“剧本臃肿”问题
随着你管理的服务器增多,Playbook会变得越来越长(比如几百行),维护起来很麻烦。这时候Role(角色) 就派上用场了:
- 把复杂任务拆成“独立模块”(比如“Nginx角色”“MySQL角色”);
- 每个Role有严格的目录结构(如
tasks
放任务、vars
放变量、templates
放模板); - 可重复使用,比如一套“Nginx Role”能在多环境部署,不用重复写Playbook。
二、实战部署:5分钟搭建Ansible环境
光说不练假把式,接下来我们动手搭建Ansible环境。先明确环境需求:
2.1 环境准备
我们需要1台“管理端”(安装Ansible)和2台“被管理端”(无需安装客户端),系统建议用CentOS 7/8(其他Linux发行版步骤类似):
机器类型 | IP地址 | 作用说明 |
---|---|---|
管理端 | 192.168.10.125 | 安装Ansible,发起控制命令 |
被管理端1 | 192.168.10.124 | 归为“webservers”组(跑Web服务) |
被管理端2 | 192.168.10.99 | 归为“dbservers”组(跑数据库) |
2.2 管理端安装Ansible
Ansible在CentOS默认源里没有,需要先装EPEL源(额外软件仓库):
# 1. 安装EPEL源
yum install -y epel-release
# 2. 安装Ansible
yum install -y ansible
# 3. 验证安装(出现版本号即成功)
ansible --version
2.3 关键目录解析
安装完成后,Ansible的核心配置文件都在/etc/ansible/
目录下,重点关注3个文件/目录:
/etc/ansible/
├── ansible.cfg # 主配置文件,默认无需修改(新手不建议动)
├── hosts # 主机清单(重点!在这里配置被管理端)
└── roles/ # 公共Role目录(存放自定义角色)
2.4 配置主机清单:给被管理端“分组”
打开hosts
文件,按“组”划分被管理端(方便批量操作):
vim /etc/ansible/hosts
# 在文件末尾添加以下内容:
[webservers] # 组名:Web服务器组
192.168.10.124 # 被管理端1的IP(默认SSH端口22,非默认需加端口:192.168.10.14:2222)
[dbservers] # 组名:数据库服务器组
192.168.10.99 # 被管理端2的IP
2.5 配置免密SSH登录(关键步骤)
Ansible默认通过SSH通信,为了避免每次执行命令都输密码,我们要配置管理端到被管理端的免密登录:
# 1. 管理端生成SSH密钥(一路按回车,不用输密码)
ssh-keygen -t rsa
# 2. 安装sshpass(用于批量传输密钥,避免手动输密码)
yum install -y sshpass
# 3. 把公钥传到被管理端1(密码替换成你的被管理端root密码)
sshpass -p '123456' ssh-copy-id root@192.168.10.124
# 4. 把公钥传到被管理端2
sshpass -p '123456' ssh-copy-id root@192.168.10.99
验证免密登录:ssh root@192.168.10.124
,能直接登录说明配置成功。
三、核心模块实战:常用命令“拿来就用”
Ansible的所有操作都通过“模块”实现,记住基本命令格式:
ansible <目标> -m <模块> -a <模块参数>
# 目标:可以是IP、组名(如webservers)、all(所有被管理端)
# -m:指定模块(省略则默认用command模块)
# -a:模块的参数(如命令内容、文件路径)
下面是12个最常用的模块,每个模块都附“用途+示例”,直接复制命令就能用!
3.1 命令执行类:command vs shell
这两个模块都用来在被管理端执行命令,核心区别是是否支持Shell特性(管道、重定向)。
模块 | 支持Shell特性 | 示例命令 |
---|---|---|
command | ❌ 不支持 | # 给webservers组执行date命令 ansible webservers -m command -a ‘date’ |
shell | ✅ 支持 | # 给dbservers组改test用户密码(用管道) ansible dbservers -m shell -a 'echo 123456 |
小技巧:查看模块帮助用
ansible-doc -s 模块名
,比如ansible-doc -s shell
。
3.2 计划任务:cron模块
用来在被管理端添加/删除定时任务,state=present
(添加,默认)、state=absent
(删除)。
示例:
# 1. 给webservers组添加定时任务:每分钟输出helloworld(命名为test crontab)
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
# 2. 查看webservers组的定时任务
ansible webservers -a 'crontab -l'
# 3. 删除刚才的定时任务(通过name匹配)
ansible webservers -m cron -a 'name="test crontab" state=absent'
3.3 用户与组管理:user + group
user
模块:创建/删除用户;group
模块:创建/删除用户组。
示例:
# 1. 给dbservers组创建mysql用户组(系统组,gid=306)
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'
# 2. 给dbservers组创建test01用户,加入mysql组(uid=306)
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'
# 3. 查看test01用户信息
ansible dbservers -a 'id test01'
# 4. 删除test01用户(不删除家目录,加remove=yes则删除)
ansible dbservers -m user -a 'name=test01 state=absent'
3.4 文件操作:copy + file
copy
模块:从管理端复制文件/内容到被管理端;file
模块:修改文件权限、创建链接、删除文件。
示例:
# 1. 把管理端的/etc/fstab复制到dbservers组的/opt/fstab.bak(属主root,权限640)
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
# 2. 直接在dbservers组的/opt/hello.txt写入内容(不用复制文件)
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
# 3. 给dbservers组的/opt/fstab.bak创建软链接/opt/fstab.link(首先目标主机的fstab.bak存在)
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
# 4. 删除dbservers组的/opt/hello.txt
ansible dbservers -m file -a 'path=/opt/hello.txt state=absent'
3.5 系统配置:hostname + ping
hostname
模块:修改被管理端主机名;ping
模块:检测管理端与被管理端的连通性(最常用的测试命令)。
示例:
# 1. 把dbservers组的主机名改成mysql01
ansible dbservers -m hostname -a "name=mysql01"
# 2. 检测所有被管理端的连通性(成功会返回pong)
ansible all -m ping
3.6 软件与服务:yum + service
yum
模块:安装/卸载RPM软件包;service
模块:启停服务、设置开机自启。
示例(以安装Nginx为例):
# 1. 给webservers组安装Nginx
ansible webservers -m yum -a 'name=nginx'
# 2. 给webservers组启动Nginx,并设置开机自启
ansible webservers -m service -a 'name=nginx enabled=true state=started'
# 3. 查看webservers组的Nginx状态
ansible webservers -a 'systemctl status nginx'
# 4. (可选)卸载Nginx
ansible webservers -m yum -a 'name=nginx state=absent'
3.7 脚本与信息收集:script + setup
script
模块:在被管理端执行管理端的本地Shell脚本;setup
模块:收集被管理端的系统信息(如IP、内存、CPU)。
示例:
# 1. 管理端创建脚本test.sh
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
# 2. 给脚本加执行权限
chmod +x test.sh
# 3. 在webservers组执行这个脚本
ansible webservers -m script -a 'test.sh'
# 4. 查看脚本执行结果
ansible webservers -a 'cat /opt/script.txt'
# 5. 收集dbservers组的IPV4信息(用filter筛选,避免输出太多)
ansible dbservers -m setup -a 'filter=*ipv4'
四、Inventory进阶:灵活管理主机与变量
当你管理的机器越来越多,简单的分组已经不够用了,这时候需要用到Inventory变量和组嵌套。
4.1 主机分组技巧:简化配置
如果被管理端的IP/主机名有规律,可以用“列表”或“通配符”简化配置:
vim /etc/ansible/hosts
# 1. 列表形式:192.168.10.12、192.168.10.13、192.168.10.14、192.168.10.15
[webservers]
192.168.10.1[2:5]
# 2. 通配符形式:db-a.example.org、db-b.example.org...db-f.example.org
[dbservers]
db-[a:f].example.org
4.2 常用Inventory变量
如果被管理端的SSH端口、用户名不同,可以在Inventory中定义变量,避免每次执行命令都指定参数:
变量名 | 含义说明 |
---|---|
ansible_host | 被管理端IP(如果主机名解析不了,用这个) |
ansible_port | SSH端口(默认22,非默认需指定) |
ansible_user | SSH登录用户名(默认root) |
ansible_password | SSH登录密码(未用密钥时用,不推荐明文) |
ansible_become | 是否提升权限(yes/no,比如sudo) |
ansible_become_user | 提升后的用户名(比如ansible_become_user=root) |
变量配置示例:
vim /etc/ansible/hosts
# 1. 主机变量:给192.168.10.14单独指定端口和用户名
[webservers]
192.168.10.14 ansible_port=2222 ansible_user=admin
# 2. 组变量:给webservers组所有机器指定密码(不推荐明文,仅示例)
[webservers:vars]
ansible_password=abc1234
# 3. 全局变量:给所有机器指定SSH端口
[all:vars]
ansible_port=22
4.3 组嵌套:让分组更灵活
如果需要对“多个组”执行相同操作,可以用“组嵌套”(把多个组归为一个父组):
vim /etc/ansible/hosts
# 1. 子组1:nginx服务器
[nginx]
192.168.10.20
192.168.10.21
# 2. 子组2:apache服务器
[apache]
192.168.10.30
192.168.10.31
# 3. 父组:webs(包含nginx和apache)
[webs:children]
nginx
apache
# 执行命令:给webs组所有机器安装wget
ansible webs -m yum -a 'name=wget'
五、总结与下一步学习
通过本文,你已经掌握了Ansible的核心能力:
- 搭建Ansible环境,配置免密登录;
- 用12个常用模块完成命令执行、用户管理、软件安装等操作;
- 灵活配置Inventory,实现主机分组、变量管理、组嵌套。
接下来,你可以向这些方向进阶:
- Playbook编写:用YAML定义多任务流程(比如“部署LNMP环境”);
- Role开发:把常用任务封装成Role,实现复用;
- Ansible Galaxy:从官方仓库(https://galaxy.ansible.com/)下载现成的Role;
- API扩展:用Python调用Ansible API,实现自定义自动化逻辑。
Ansible的核心思想是“简单高效”,不用追求一次性掌握所有功能,先从“批量执行命令”“批量安装软件”这些小场景练起,慢慢积累实战经验,你会发现自动化运维原来这么简单!
如果在操作中遇到问题,记得查官方文档(https://docs.ansible.com/)或用ansible-doc
查看模块帮助,祝你早日成为自动化运维高手!
更多推荐
所有评论(0)