自动化运维工具 Ansible 集中化管理服务器

目录

[一、Ansible 概述与运行机制](#一、Ansible 概述与运行机制)

[1.1 什么是 Ansible?](#1.1 什么是 Ansible?)

[1.2 Ansible 工作机制](#1.2 Ansible 工作机制)

核心流程(轻量执行,无残留)

[核心组成(5 大组件,各司其职)](#核心组成(5 大组件,各司其职))

[1.3 Ansible 角色(Role)------ 复杂任务模块化](#1.3 Ansible 角色(Role)—— 复杂任务模块化)

[二、实战:Ansible 环境安装与配置](#二、实战:Ansible 环境安装与配置)

[2.1 环境规划(3 节点示例)](#2.1 环境规划(3 节点示例))

[2.2 管理端安装 Ansible(仅需 3 步)](#2.2 管理端安装 Ansible(仅需 3 步))

[2.3 Ansible 默认目录结构](#2.3 Ansible 默认目录结构)

[2.4 关键配置:主机清单(hosts)](#2.4 关键配置:主机清单(hosts))

[关键配置:SSH 免密登录(核心前提)](#关键配置:SSH 免密登录(核心前提))

三、命令执行类模块(批量跑命令)

[1. command 模块(简单命令,无 Shell 特性)](#1. command 模块(简单命令,无 Shell 特性))

[2. shell 模块(复杂命令,支持 Shell 特性)](#2. shell 模块(复杂命令,支持 Shell 特性))

四、系统管理类模块(用户、定时任务、主机名)

[1. user 模块(批量管理系统用户)](#1. user 模块(批量管理系统用户))

[2. group 模块(批量管理用户组)](#2. group 模块(批量管理用户组))

[3. cron 模块(批量管理定时任务)](#3. cron 模块(批量管理定时任务))

[4. hostname 模块(批量修改主机名)](#4. hostname 模块(批量修改主机名))

五、文件操作类模块(复制、权限、链接)

[1. copy 模块(管理端→被管理端传文件 / 内容)](#1. copy 模块(管理端→被管理端传文件 / 内容))

[2. file 模块(管理文件 / 目录属性、创建链接)](#2. file 模块(管理文件 / 目录属性、创建链接))

六软件与服务类模块(装软件、启服务)

[1. yum 模块(RPM 系统批量装软件)](#1. yum 模块(RPM 系统批量装软件))

[2. service 模块(批量管理系统服务)](#2. service 模块(批量管理系统服务))

七、信息收集类模块(查节点信息)

[1. setup 模块(收集被管理端硬件 / 系统信息)](#1. setup 模块(收集被管理端硬件 / 系统信息))

[2. script 模块(批量执行管理端本地脚本)](#2. script 模块(批量执行管理端本地脚本))

[八、Inventory 主机清单与变量配置](#八、Inventory 主机清单与变量配置)

[1 主机清单高级分组(灵活管理节点)](#1 主机清单高级分组(灵活管理节点))

[2 常用 Inventory 变量(简化连接配置)](#2 常用 Inventory 变量(简化连接配置))

[3 变量配置方式(优先级:主机变量 > 组变量 > 全局变量)](#3 变量配置方式(优先级:主机变量 > 组变量 > 全局变量))

主机变量(仅对单个节点生效)

组变量(对组内所有节点生效)

九、总结


一、Ansible 概述与运行机制

1.1 什么是 Ansible?

Ansible 是基于 Python 开发的开源自动化运维工具,主打 "轻量、无客户端、易上手",可实现批量命令执行、配置管理、应用部署等功能,对比 SaltStack、Puppet 等工具,核心优势如下:

  • 无客户端:被管理端无需安装 Agent,仅通过 SSH 通信;
  • 语法简单:用 YAML 写 Playbook(任务剧本),Jinja2 做模板;
  • 功能灵活:支持内置模块、自定义模块,适配云计算 / 大数据场景。

行业背景:2013 年成立,2015 年被红帽以 1-1.5 亿美元收购,联合创始人均为红帽前员工。

1.2 Ansible 工作机制

核心流程(轻量执行,无残留)
  1. 管理端通过 Inventory(主机清单) 识别被管理节点;
  2. 根据用户指令(命令 / Playbook),将 Modules(功能模块) 通过 SSH 推送到被管理端;
  3. 被管理端执行模块任务,结果通过 SSH 回传管理端;
  4. 任务完成后,模块自动从被管理端删除,无后台进程残留。
核心组成(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 都是性价比极高的选择 ------ 入门门槛低,功能覆盖全,扩展能力强,是运维工程师必备的核心工具之一。

相关推荐
三坛海会大神5552 小时前
Ansible详解(一)Ansible简介和基础命令及操作
运维·ansible
東雪蓮☆2 小时前
Ansible Playbook 编写与模块详解
linux·运维·网络·ansible
和光同尘20232 小时前
CentOS7搭建ELK日志分析系统
运维·elasticsearch·云原生·kubernetes·centos·kibana·logstash
科技那些事儿3 小时前
海外代理IP软件哪家好?高性价比海外代理IP服务商平台
服务器·网络·tcp/ip
神秘面具男033 小时前
NFS 服务器 iSCSI 服务器
运维·服务器
iconball3 小时前
个人用云计算学习笔记 --17(DNS 服务器)
linux·运维·笔记·学习·云计算
iconball3 小时前
个人用云计算学习笔记 --16(DHCP 服务器)
linux·运维·笔记·学习·云计算
cpsvps3 小时前
容器主机名解析在香港服务器内部网络的调试方案
运维·服务器·网络
Lin_Aries_04213 小时前
部署 Jenkins 服务器
运维·服务器·docker·容器·云计算·jenkins