Ansible 入门到实战:自动化运维的瑞士军刀

一、Ansible 是什么?

Ansible 是一款由 Python 编写的开源自动化运维工具,用于配置管理、应用部署、任务编排等场景。

✅ 核心优势:

  • 无需客户端:基于 SSH 协议,轻量级;

  • 易学易用:YAML 语法,上手快;

  • 功能强大:支持模块、剧本、变量、模板等;

  • 社区活跃:被 Red Hat 收购,生态成熟。


二、Ansible 架构与核心组件

组件 说明
Ansible 核心引擎
Modules 执行具体任务的模块(如 copy、yum、service)
Playbooks YAML 编写的任务剧本
Inventory 主机清单,定义目标主机与分组
Plugins 扩展功能,如连接、日志、邮件等

三、快速部署 Ansible

1️⃣ 环境示例

角色 IP
管理端 192.168.10.100
被控端 192.168.10.101
被控端 192.168.10.102

2️⃣ 安装 Ansible

复制代码
yum install -y epel-release
yum install -y ansible

3️⃣ 配置主机清单

编辑 /etc/ansible/hosts

复制代码
[webservers]
192.168.10.101

[dbservers]
192.168.10.102

4️⃣ 设置 SSH 免密登录

复制代码
生成管理机的密钥
ssh-keygen -t rsa 

生成被管理机器的密钥
sshpass -p '123456' ssh-copy-id root@192.168.10.101
sshpass -p '123456' ssh-copy-id root@192.168.10.102

当然也可以手动生成密钥

复制代码
ssh-copy-id root@192.168.10.101
ssh-copy-id root@192.168.10.102

四、常用模块速查表

表格

复制

模块 功能说明
command 执行命令(不支持管道)
shell 执行命令(支持管道、重定向)
copy 拷贝文件或内容
file 设置文件属性、创建链接、删除
user 用户管理
group 用户组管理
yum 安装/卸载软件包
service 启动/停止/设置服务
cron 添加/删除计划任务
script 在远程执行本地脚本
setup 收集主机信息(facts)
ping 测试主机连通性

五、模块使用示例

shell模块

复制代码
在/home 目录下所有的文件和文件夹
ansible all -m command -a "chdir=/home ls ./"

给dbserve(192.168.10.102)的test用户命设置密码
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'

获取dbserve(192.168.10.102)中的ifconfig中的ens33的第二行的第二个
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \$2}")'

cron模块

复制代码
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'

webserver下面的状态

复制代码
ansible webservers -a 'crontab -l'

复制代码
ansible webservers -m cron -a 'name="test crontab" state=absent'

usr模块

复制代码
ansible dbservers -m user -a 'name="test01"'

复制代码
ansible dbservers -m command -a 'tail -2 /etc/passwd'

复制代码
ansible dbservers -m user -a 'name="test01" state=absent'

group 模块

复制代码
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'

复制代码
ansible dbservers -a 'tail /etc/group'
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'	#将test01用户添加到mysql组中
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'

copy 模块

复制代码
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
ansible dbservers -a 'ls -l /opt'
ansible dbservers -a 'cat /opt/fstab.bak'

复制代码
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
ansible dbservers -a 'cat /opt/hello.txt'

file 模块

复制代码
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'
复制代码
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
复制代码
ansible dbservers -m file -a "path=/opt/abc.txt state=touch"			#创建一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=absent"			#删除一个文件

hostname 模块

复制代码
ansible dbservers -m hostname -a "name=mysql01"

yum 模块

复制代码
ansible webservers -m yum -a 'name=httpd'					#安装服务
复制代码
ansible webservers -m yum -a 'name=httpd state=absent'		#卸载服务

service/systemd 模块

复制代码
ansible webservers -a 'systemctl status httpd'
复制代码
ansible webservers -m service -a 'enabled=true name=httpd state=started' # 开启httpd

script 模块

复制代码
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt

chmod +x test.sh
ansible webservers -m script -a 'test.sh'
ansible webservers -a 'cat /opt/script.txt'

setup 模块

复制代码
ansible webservers -m setup				#获取mysql组主机的facts信息
复制代码
ansible dbservers -m setup -a 'filter=*ipv4'    #使用filter可以筛选指定的facts信息

补充

复制代码
# 内存信息
ansible all -m setup -a "filter=ansible_memory_mb*"

# 具体内存信息
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_swaptotal_mb"

# 磁盘信息
ansible all -m setup -a "filter=ansible_devices*"
ansible all -m setup -a "filter=ansible_mounts*"

# 具体磁盘信息
ansible all -m setup -a "filter=ansible_devices"
ansible all -m setup -a "filter=ansible_mounts"
ansible all -m setup -a "filter=ansible_device_links"

# 网络信息
ansible all -m setup -a "filter=ansible_*ipv4*"
ansible all -m setup -a "filter=ansible_default_ipv4*"

# 具体 IP 信息
ansible all -m setup -a "filter=ansible_default_ipv4"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"

六、Inventory 高级用法

1️⃣ 分组与范围

复制代码
[webservers]
192.168.10.10[1:5]

[dbservers]
db-[a:f].example.org

2️⃣ 主机变量

复制代码
192.168.10.101 ansible_port=22 ansible_user=root ansible_password=abc1234

3️⃣ 组变量

复制代码
[webservers:vars]
ansible_user=root
ansible_password=abc1234

4️⃣ 组嵌套

复制代码
[nginx]
192.168.10.20

[apache]
192.168.10.30

[webs:children]
nginx
apache

七、总结与建议

  • 初学者:先掌握常用模块 + Inventory + Playbook 基础;

  • 进阶者:学习角色(Role)、变量、模板、条件判断;

  • 生产环境:使用 Ansible Tower/AWX 做可视化与权限管理;

  • 最佳实践:保持 Playbook 简洁、复用性强,使用 Git 做版本控制。

相关推荐
CIb0la6 小时前
Complete Bug Bounty tool List for free
linux·运维·bug
大、男人6 小时前
DSPy-自动化提示工程的开源框架
自动化
北京耐用通信6 小时前
工业通信升级利器:耐达讯自动化Ethernet/IP转CC-Link网关让IO模块兼容无忧!
网络·人工智能·科技·物联网·网络协议·自动化·信息与通信
wadesir6 小时前
Nginx反向代理错误处理(从零开始配置自定义错误页面与故障应对)
运维·nginx
一念一花一世界6 小时前
CI/CD工具选型:Jenkins与Arbess全面对比指南
运维·ci/cd·jenkins·arbess
zt1985q6 小时前
本地部署开源运维工具 MyIP 并实现外部访问
运维·服务器·网络协议·开源
似水流年 光阴已逝6 小时前
Linux系统“No space left on device”错误:从根因到修复的全攻略
linux·运维·服务器
翼龙云_cloud6 小时前
阿里云渠道商:文件和数据放在云端安全吗?
运维·服务器·安全·阿里云·云计算
玩具猴_wjh6 小时前
Linux常用命令详细介绍
linux·运维·服务器
Y淑滢潇潇6 小时前
RHCE Day 9 SHELL条件测试
linux·运维·服务器