自动化运维工具 Ansible 集中化管理服务器 - 实践
目录
一、Ansible 概述与运行机制
1.1 什么是 Ansible?
1.2 Ansible 工作机制
核心流程(轻量执行,无残留)
核心组成(5 大组件,各司其职)
1.3 Ansible 角色(Role)—— 复杂任务模块化
二、实战:Ansible 环境安装与配置
2.1 环境规划(3 节点示例)
2.2 管理端安装 Ansible(仅需 3 步)
2.3 Ansible 默认目录结构
2.4 关键配置:主机清单(hosts)
关键配置:SSH 免密登录(核心前提)
三、命令执行类模块(批量跑命令)
1. command 模块(简单命令,无 Shell 特性)
2. shell 模块(复杂命令,支持 Shell 特性)
四、系统管理类模块(用户、定时任务、主机名)
1. user 模块(批量管理系统用户)
2. group 模块(批量管理用户组)
3. cron 模块(批量管理定时任务)
4. hostname 模块(批量修改主机名)
五、文件操作类模块(复制、权限、链接)
1. copy 模块(管理端→被管理端传文件 / 内容)
2. file 模块(管理文件 / 目录属性、创建链接)
六软件与服务类模块(装软件、启服务)
1. yum 模块(RPM 系统批量装软件)
2. service 模块(批量管理系统服务)
七、信息收集类模块(查节点信息)
1. setup 模块(收集被管理端硬件 / 系统信息)
2. script 模块(批量执行管理端本地脚本)
八、Inventory 主机清单与变量配置
1 主机清单高级分组(灵活管理节点)
2 常用 Inventory 变量(简化连接配置)
3 变量配置方式(优先级:主机变量 > 组变量 > 全局变量)
主机变量(仅对单个节点生效)
组变量(对组内所有节点生效)
九、总结
一、Ansible 概述与运行机制
1.1 什么是 Ansible?
Ansible 是基于 Python 开发的开源自动化运维工具,主打 “轻量、无客户端、易上手”,可实现批量命令执行、配置管理、应用部署等功能,对比 SaltStack、Puppet 等工具,核心优势如下:
- 无客户端:被管理端无需安装 Agent,仅通过 SSH 通信;
- 语法简单:用 YAML 写 Playbook(任务剧本),Jinja2 做模板;
- 功能灵活:支持内置模块、自定义模块,适配云计算 / 大数据场景。
行业背景:2013 年成立,2015 年被红帽以 1-1.5 亿美元收购,联合创始人均为红帽前员工。
1.2 Ansible 工作机制
核心流程(轻量执行,无残留)
- 管理端通过 Inventory(主机清单) 识别被管理节点;
- 根据用户指令(命令 / Playbook),将 Modules(功能模块) 通过 SSH 推送到被管理端;
- 被管理端执行模块任务,结果通过 SSH 回传管理端;
- 任务完成后,模块自动从被管理端删除,无后台进程残留。
核心组成(5 大组件,各司其职)
组件 | 作用说明 |
---|---|
Ansible 引擎 | 核心调度器:解析指令、调用模块、管理 SSH 通信流程 |
Modules | 功能执行单元:如 yum (装软件)、copy (传文件),支持内置 + 自定义 |
Plugins | 功能补充:如连接插件(默认 SSH)、回调插件(结果输出)、邮件插件(告警) |
Playbooks | 任务剧本:用 YAML 定义多步骤任务(如 “装 Nginx→改配置→启服务”) |
Inventory | 主机清单:记录被管理节点的 IP、分组、连接参数(如 SSH 端口) |
1.3 Ansible 角色(Role)—— 复杂任务模块化
当 Playbook 任务过多(如部署一套 Web 服务需 10+ 步骤)时,Role 可将任务按功能拆分,实现复用和维护效率提升:
- 优势:独立目录结构、支持外部变量、可跨项目复用;
- 核心能力:将 “安装”“配置”“部署” 拆分为独立角色,如
nginx_role
(管 Nginx)、mysql_role
(管 MySQL)。
二、实战:Ansible 环境安装与配置
2.1 环境规划(3 节点示例)
节点类型 | IP 地址 | 作用 | 系统要求(推荐) |
---|---|---|---|
管理端 | 192.168.10.23 | 安装 Ansible,下发指令 | CentOS 7/8、2 核 2GB+ |
被管理端 1 | 192.168.10.14 | 模拟 Web 服务器 | 类 Unix 系统、2 核 2GB+ |
被管理端 2 | 192.168.10.15 | 模拟数据库服务器 | 类 Unix 系统、2 核 2GB+ |
2.2 管理端安装 Ansible(仅需 3 步)
# 1. 安装 EPEL 源(CentOS 需额外装,提供 Ansible 包)
yum install -y epel-release
# 2. 安装 Ansible
yum install -y ansible
# 3. 验证安装(输出版本号即成功,如 ansible [core 2.14.2])
ansible --version
2.3 Ansible 默认目录结构
安装后默认目录在 /etc/ansible/
,核心文件作用:
/etc/ansible/
├── ansible.cfg # 全局配置文件(默认无需改,可自定义 SSH 超时、日志路径)
├── hosts # 主机清单(记录被管理节点分组和连接信息)
└── roles/ # 公共角色目录(存放自定义 Role,如 nginx_role)
2.4 关键配置:主机清单(hosts)
按业务分组定义被管理节点,后续可按 “组” 批量执行命令:
# 1. Web 服务器组(组名:webservers)
[webservers]
192.168.10.14 # 被管理端1(Web节点),默认 SSH 22端口
# 2. 数据库服务器组(组名:dbservers)
[dbservers]
192.168.10.15 # 被管理端2(DB节点)
关键配置:SSH 免密登录(核心前提)
Ansible 依赖 SSH 通信,免密登录可避免每次输入密码:
# 1. 管理端生成 RSA 密钥(一路回车,不设密码,测试环境更便捷)
ssh-keygen -t rsa
# 2. 将公钥推送到被管理端(密码为被管理端 root 密码,示例:123456)
sshpass -p '123456' ssh-copy-id root@192.168.10.14 # 推到 Web 节点
sshpass -p '123456' ssh-copy-id root@192.168.10.15 # 推到 DB 节点
# 3. 验证免密:管理端执行,无需输密码即成功
ssh root@192.168.10.14
三、命令执行类模块(批量跑命令)
1. command 模块(简单命令,无 Shell 特性)
核心特点:不支持管道(|
)、重定向(>
),安全性高,适合执行基础命令。
需求场景 | 示例命令 | 说明 |
---|---|---|
所有节点查看当前时间 | ansible all -m command -a 'date' | 验证节点是否在线,时间是否同步 |
webservers 组查看内存使用 | ansible webservers -m command -a 'free -h' | 批量检查 Web 节点内存负载 |
执行命令前先切到 /opt 目录 | ansible dbservers -m command -a 'chdir=/opt ls -l' | 先进入 /opt,再执行 ls -l ,避免路径错误 |
文件不存在时才创建 | ansible all -m command -a 'creates=/opt/test.txt touch /opt/test.txt' | 仅当 /opt/test.txt 不存在时,才执行 touch 创建文件(避免覆盖) |
文件存在时才删除 | ansible all -m command -a 'removes=/opt/test.txt rm -f /opt/test.txt' | 仅当 /opt/test.txt 存在时,才执行 rm 删除文件(避免报错) |
2. shell 模块(复杂命令,支持 Shell 特性)
核心特点:调用被管理端的 /bin/bash
,支持管道、重定向、变量,适合复杂操作。
需求场景 | 示例命令 | 说明 | |||
---|---|---|---|---|---|
批量修改 test 用户密码 | `ansible all -m shell -a 'echo "123456" | passwd --stdin test'` | 通过管道自动输入密码,避免手动交互(CentOS 系统适用) | ||
查看所有节点 nginx 进程数 | `ansible webservers -m shell -a 'ps aux | grep nginx | grep -v grep | wc -l'` | 过滤掉 grep 自身进程,仅统计 nginx 实际进程数 |
重定向日志到文件 | ansible dbservers -m shell -a 'df -h > /opt/disk_usage.log' | 将磁盘使用情况写入 /opt/disk_usage.log ,后续可查看 | |||
解析网卡 IP(ens33) | `ansible all -m shell -a 'ifconfig ens33 | awk "NR==2 {print $2}"'` | \$2 转义 $2 ,避免被本地 Shell 解析,正确获取 IP 地址 | ||
统计 /var/log 目录大小 | `ansible all -m shell -a 'du -sh /var/log/* | sort -rh'` | 按大小倒序排列日志目录,快速定位大日志文件 |
四、系统管理类模块(用户、定时任务、主机名)
1. user 模块(批量管理系统用户)
核心特点:创建 / 删除用户、设置 UID / 组、配置登录 Shell,比手动 useradd
更规范。
需求场景 | 示例命令 | 说明 |
---|---|---|
创建普通用户 test01 | ansible all -m user -a 'name=test01 comment="Test User" shell=/bin/bash' | 附带注释(comment),指定登录 Shell 为 /bin/bash |
创建系统用户 mysql | ansible dbservers -m user -a 'name=mysql system=yes uid=306 shell=/sbin/nologin' | 系统用户(system=yes),UID=306,禁止登录(/sbin/nologin) |
修改 test01 所属组 | ansible all -m user -a 'name=test01 group=mysql groups=wheel' | 主组设为 mysql,附加组设为 wheel(获得 sudo 权限) |
锁定 test01 用户 | ansible all -m user -a 'name=test01 state=present password_lock=yes' | 锁定用户,防止登录(state=present 表示保留用户,仅锁定) |
删除 test01 及家目录 | ansible all -m user -a 'name=test01 state=absent remove=yes' | state=absent 表示删除用户,remove=yes 表示同时删除家目录 |
2. group 模块(批量管理用户组)
核心特点:创建 / 删除用户组、设置 GID,配合 user 模块实现权限隔离。
需求场景 | 示例命令 | 说明 |
---|---|---|
创建系统组 mysql | ansible dbservers -m group -a 'name=mysql system=yes gid=306' | 系统组(system=yes),GID=306,后续用于 mysql 用户主组 |
创建普通组 dev | ansible all -m group -a 'name=dev gid=1000' | 普通用户组,GID=1000,用于开发人员权限管理 |
修改组 mysql 的 GID | ansible dbservers -m group -a 'name=mysql gid=307' | 已存在的组,修改 GID 为 307(需确保 GID 未被占用) |
删除普通组 dev | ansible all -m group -a 'name=dev state=absent' | state=absent 表示删除组(需确保组内无用户,否则需先调整用户组) |
3. cron 模块(批量管理定时任务)
核心特点:添加 / 删除定时任务,支持分钟 / 小时 / 日 / 月 / 周配置,避免手动编辑 crontab
。
需求场景 | 示例命令 | 说明 |
---|---|---|
每分钟执行 echo 测试 | ansible webservers -m cron -a 'name="test_cron" minute="*/1" job="/bin/echo helloworld >> /opt/cron_test.log"' | 输出追加到日志文件,避免覆盖,任务名 “test_cron” 用于后续删除 |
每天凌晨 2 点备份 MySQL | ansible dbservers -m cron -a 'name="mysql_bak" hour=2 minute=0 job="mysqldump -u root test > /opt/mysql_bak_$(date +\%Y\%m\%d).sql"' | 按日期命名备份文件(\%Y 转义 %Y ),避免重名 |
每周日晚 10 点清理日志 | ansible all -m cron -a 'name="log_clean" weekday=0 hour=22 minute=0 job="rm -rf /var/log/*.log"' | weekday=0 表示周日,清理所有 .log 日志文件 |
临时禁用定时任务 | ansible webservers -m cron -a 'name="test_cron" state=present disabled=yes' | disabled=yes 表示注释任务(保留配置,暂不执行) |
删除 “test_cron” 任务 | ansible webservers -m cron -a 'name="test_cron" state=absent' | 按任务名删除,必须与创建时的 name 一致 |
4. hostname 模块(批量修改主机名)
核心特点:直接修改被管理端主机名,无需手动执行 hostnamectl
。
需求场景 | 示例命令 | 说明 |
---|---|---|
改 dbservers 组主机名为 mysql01/mysql02 | ansible 192.168.10.15 -m hostname -a 'name=mysql01' ansible 192.168.10.16 -m hostname -a 'name=mysql02' | 单节点修改,适合不同节点设不同主机名 |
改 webservers 组主机名为 web01-web03 | ansible 192.168.10.12 -m hostname -a 'name=web01' ansible 192.168.10.13 -m hostname -a 'name=web02' | 按功能 + 序号命名,便于识别节点角色 |
五、文件操作类模块(复制、权限、链接)
1. copy 模块(管理端→被管理端传文件 / 内容)
核心特点:复制文件、设置权限 / 属主、直接写入内容,支持覆盖 / 增量复制。
需求场景 | 示例命令 | 说明 |
---|---|---|
复制管理端 /etc/fstab 到被管理端 | ansible all -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root group=root mode=640' | 目标文件属主 root、权限 640(仅 owner 读写,group 读) |
直接生成文件内容 | ansible webservers -m copy -a 'content="server { listen 80; }" dest=/opt/nginx_test.conf mode=644' | 无需本地文件,直接将 Nginx 配置内容写入目标文件 |
复制目录(含子文件) | ansible dbservers -m copy -a 'src=/opt/mysql_conf/ dest=/etc/mysql/ remote_src=no' | remote_src=no 表示源目录在管理端,复制到被管理端 /etc/mysql/ |
仅当源文件更新时才复制 | ansible all -m copy -a 'src=/opt/test.sh dest=/opt/test.sh force=no' | force=no 表示 “源文件比目标新才复制”,避免重复覆盖 |
复制时保留文件属性 | ansible all -m copy -a 'src=/opt/test.sh dest=/opt/ preserve=yes' | preserve=yes 保留源文件的权限、修改时间等属性 |
2. file 模块(管理文件 / 目录属性、创建链接)
核心特点:修改权限 / 属主、创建文件 / 目录、建立软链接,功能比 copy 更灵活。
需求场景 | 示例命令 | 说明 |
---|---|---|
创建空文件 | ansible all -m file -a 'path=/opt/empty.txt state=touch mode=644' | state=touch 表示创建空文件,权限 644 |
创建目录(含父目录) | ansible all -m file -a 'path=/opt/ansible/log state=directory mode=755' | state=directory 表示创建目录,父目录不存在则自动创建(类似 mkdir -p) |
修改文件属主和权限 | ansible dbservers -m file -a 'path=/opt/mysql_bak.sql owner=mysql group=mysql mode=600' | 仅 mysql 用户可读写(600),保证备份文件安全 |
创建软链接 | ansible webservers -m file -a 'path=/opt/nginx.conf src=/etc/nginx/nginx.conf state=link' | 建立软链接 /opt/nginx.conf → /etc/nginx/nginx.conf |
删除文件 / 目录(递归) | ansible all -m file -a 'path=/opt/old_dir state=absent' | state=absent 表示删除,目录会递归删除(类似 rm -rf) |
六软件与服务类模块(装软件、启服务)
1. yum 模块(RPM 系统批量装软件)
核心特点:安装 / 卸载 / 更新 RPM 包,自动处理依赖,比手动 yum
更高效。
需求场景 | 示例命令 | 说明 |
---|---|---|
安装 nginx | ansible webservers -m yum -a 'name=nginx state=present' | state=present 表示安装(默认,可省略),自动装依赖 |
卸载 httpd | ansible webservers -m yum -a 'name=httpd state=absent' | state=absent 表示卸载,同时删除依赖(需谨慎,避免删关键包) |
安装指定版本的 mysql | ansible dbservers -m yum -a 'name=mysql-server-5.7 state=present' | 指定版本 5.7,避免安装最新版导致兼容性问题 |
更新所有软件包 | ansible all -m yum -a 'name=* state=latest' | state=latest 表示更新到最新版(生产环境建议先测试,避免兼容性问题) |
安装 EPEL 源(CentOS 7) | ansible all -m yum -a 'name=epel-release state=present' | 安装 EPEL 源,获取更多第三方软件包(如 nginx、ansible 本身) |
2. service 模块(批量管理系统服务)
核心特点:启动 / 停止 / 重启服务、设置开机自启,支持 systemd 和 sysvinit。
需求场景 | 示例命令 | 说明 |
---|---|---|
启动 nginx 并设开机自启 | ansible webservers -m service -a 'name=nginx state=started enabled=yes' | state=started 启动服务,enabled=yes 设为开机自启 |
重启 mysql 服务 | ansible dbservers -m service -a 'name=mysqld state=restarted' | state=restarted 重启服务(配置修改后生效) |
停止 httpd 服务 | ansible webservers -m service -a 'name=httpd state=stopped enabled=no' | state=stopped 停止服务,enabled=no 取消开机自启 |
重载 nginx 配置 | ansible webservers -m service -a 'name=nginx state=reloaded' | state=reloaded 重载配置(无需重启服务,适合在线更新配置) |
查看服务状态 | ansible all -m service -a 'name=nginx state=started' | 虽不直接返回状态,但执行失败(如服务未启动)会提示,间接验证状态 |
七、信息收集类模块(查节点信息)
1. setup 模块(收集被管理端硬件 / 系统信息)
核心特点:获取节点 CPU、内存、IP、系统版本等信息(称为 Facts),支持筛选。
需求场景 | 示例命令 | 说明 |
---|---|---|
收集所有节点完整信息 | ansible all -m setup | 输出所有 Facts 信息(内容多,适合保存到文件分析) |
筛选 IPv4 地址 | ansible all -m setup -a 'filter=*ipv4' | 仅输出含 “ipv4” 的信息,快速获取所有节点 IP 地址 |
筛选 CPU 核心数 | ansible all -m setup -a 'filter=*processor_vcpus' | 查看每个节点的 CPU 核心数,评估硬件负载能力 |
筛选系统版本 | ansible all -m setup -a 'filter=*distribution_version' | 查看系统版本(如 CentOS 7.9、Ubuntu 20.04),便于版本兼容判断 |
筛选内存总量 | ansible all -m setup -a 'filter=*memtotal_mb' | 查看内存总量(MB),快速识别内存不足的节点 |
2. script 模块(批量执行管理端本地脚本)
核心特点:将管理端的 Shell/Python 脚本推送到被管理端执行,无需手动传脚本。
需求场景 | 示例命令 | 说明 |
---|---|---|
执行本地 Shell 脚本 | ansible all -m script -a '/opt/monitor_disk.sh' | 管理端的 /opt/monitor_disk.sh 脚本,在所有被管理端执行 |
脚本带参数执行 | ansible dbservers -m script -a '/opt/mysql_backup.sh 7' | 给脚本传参数 “7”(表示保留 7 天备份),脚本内用 $1 接收 |
执行 Python 脚本 | ansible all -m script -a '/opt/check_process.py' | 支持 Python |
八、Inventory 主机清单与变量配置
1 主机清单高级分组(灵活管理节点)
支持 “连续 IP / 主机名简写” 和 “组嵌套”,减少重复配置:
ini
# 1. 连续 IP 简写(匹配 192.168.10.12-15)
[webservers]
192.168.10.1[2:5]:2222 # 非默认SSH端口(2222)
# 2. 连续主机名简写(匹配 db-a 到 db-f)
[dbservers]
db-[a:f].example.org
# 3. 组嵌套(将 nginx、apache 归为 webs 大组)
[nginx]
192.168.10.20-22
[apache]
192.168.10.30-33
[webs:children] # 大组包含子组
nginx
apache
2 常用 Inventory 变量(简化连接配置)
变量用于定义节点的 “连接参数”“权限配置”,避免重复输入,核心变量如下:
变量名 | 含义说明 | 适用场景 |
---|---|---|
ansible_host | 节点实际 IP(主机名无法解析时用) | 主机名无法 DNS 解析时 |
ansible_port | SSH 端口(默认 22) | 节点 SSH 端口非默认(如 2222) |
ansible_user | SSH 登录用户名(如 root/admin) | 非 root 用户登录时 |
ansible_password | SSH 密码(未配置免密时用,不推荐明文) | 临时测试环境无免密时 |
ansible_become | 是否提升权限(yes/no,类似 sudo) | 需执行 root 操作(如装软件)时 |
ansible_become_user | 提升后的目标用户(如 root) | 切换到特定用户执行操作时 |
3 变量配置方式(优先级:主机变量 > 组变量 > 全局变量)
主机变量(仅对单个节点生效)
[webservers]
# 192.168.10.14 节点:SSH 22端口、root登录、密码abc1234
192.168.10.14 ansible_port=22 ansible_user=root ansible_password=abc1234
组变量(对组内所有节点生效)
# webservers 组所有节点:默认 root 登录、密码abc1234
[webservers:vars]
ansible_user=root
ansible_password=abc1234
# 所有节点:默认 SSH 22端口
[all:vars]
ansible_port=22
九、总结
Ansible 是一款 “让运维更高效、更简单” 的自动化工具,其核心在于 “无客户端架构 + 模块化设计 + 极简语法”。通过 Inventory 管理节点、模块实现功能、Playbook 编排任务,可轻松应对从几台到上千台节点的批量管理需求。
无论是中小团队快速落地自动化,还是大型企业构建复杂运维体系,Ansible 都是性价比极高的选择 —— 入门门槛低,功能覆盖全,扩展能力强,是运维工程师必备的核心工具之一。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919748.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!