目录

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

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

一、Ansible 是什么?

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

✅ 核心优势:

  • 无需客户端:基于 SSH 协议,轻量级;
  • 易学易用:YAML 语法,上手快;
  • 功能强大:支持模块、剧本、变量、模板等;
  • 社区活跃:被 Red Hat 收购,生态成熟。

二、Ansible 架构与核心组件

组件说明
Ansible核心引擎
Modules执行具体任务的模块(如 copy、yum、service)
PlaybooksYAML 编写的任务剧本
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

https://i-blog.csdnimg.cn/direct/ad6061d867e14ace942696d9ed3e8cb8.png


当然也可以手动生成密钥


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下面的状态

https://i-blog.csdnimg.cn/direct/a5b0d4c89fe34b9badb93469754a85bd.png


ansible webservers -a 'crontab -l'


ansible webservers -m cron -a 'name="test crontab" state=absent'

https://i-blog.csdnimg.cn/direct/ec0c1cc2bd2d4423ac97f0d9d5227014.png

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'

https://i-blog.csdnimg.cn/direct/f40f97cdb5ea4063a5d648530188bcc5.png

file 模块


ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'

https://i-blog.csdnimg.cn/direct/f5c84f7661814c27a6d2711c8e9e082a.png


ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'

https://i-blog.csdnimg.cn/direct/89a7a6c49fb5475eb864b3bf224a653e.png


ansible dbservers -m file -a "path=/opt/abc.txt state=touch"			#创建一个文件
ansible dbservers -m file -a "path=/opt/abc.txt state=absent"			#删除一个文件

https://i-blog.csdnimg.cn/direct/1f06ba0947104492ba9a021b39764cd7.png

hostname 模块


ansible dbservers -m hostname -a "name=mysql01"

https://i-blog.csdnimg.cn/direct/7d698cb0c29d4d50be34c9745592993c.png

yum 模块


ansible webservers -m yum -a 'name=httpd'					#安装服务

https://i-blog.csdnimg.cn/direct/65743020a34d4320aa47f0a749d4d044.png


ansible webservers -m yum -a 'name=httpd state=absent'		#卸载服务

https://i-blog.csdnimg.cn/direct/ce26bdf7a2514605932d4e6562fa9392.png

service/systemd 模块


ansible webservers -a 'systemctl status httpd'

https://i-blog.csdnimg.cn/direct/099f4f49783d4bfb815e7c4d7aefa620.png


ansible webservers -m service -a 'enabled=true name=httpd state=started' # 开启httpd

https://i-blog.csdnimg.cn/direct/4fb342e40e4243c0b6c5c32ea07f09f9.png

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'

https://i-blog.csdnimg.cn/direct/cd777e533067421c8811d24c3e74adfa.png

setup 模块


ansible webservers -m setup				#获取mysql组主机的facts信息

https://i-blog.csdnimg.cn/direct/cbb4559c83d843898493a0a5dea1e7d0.png


ansible dbservers -m setup -a 'filter=*ipv4'    #使用filter可以筛选指定的facts信息

https://i-blog.csdnimg.cn/direct/5d9814a636e744fd9bd6abe91aa5d4c5.png

补充


# 内存信息
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 做版本控制。