作为运维工程师,你是否还在为“重复登录多台服务器执行相同命令”“手动配置几十台机器的环境”而头疼?如果答案是肯定的,那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 任务执行单元,包括内置核心模块(如yumcopy)和自定义模块(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的核心能力:

  1. 搭建Ansible环境,配置免密登录;
  2. 用12个常用模块完成命令执行、用户管理、软件安装等操作;
  3. 灵活配置Inventory,实现主机分组、变量管理、组嵌套。

接下来,你可以向这些方向进阶:

  • Playbook编写:用YAML定义多任务流程(比如“部署LNMP环境”);
  • Role开发:把常用任务封装成Role,实现复用;
  • Ansible Galaxy:从官方仓库(https://galaxy.ansible.com/)下载现成的Role;
  • API扩展:用Python调用Ansible API,实现自定义自动化逻辑。

Ansible的核心思想是“简单高效”,不用追求一次性掌握所有功能,先从“批量执行命令”“批量安装软件”这些小场景练起,慢慢积累实战经验,你会发现自动化运维原来这么简单!

如果在操作中遇到问题,记得查官方文档(https://docs.ansible.com/)或用ansible-doc查看模块帮助,祝你早日成为自动化运维高手!

Logo

更多推荐