Ansible ------核心模块
文章目录
- [Ansible ------核心模块](#Ansible ——核心模块)
- 前言
- [Ansible 完整知识体系](#Ansible 完整知识体系)
-
- [一、Ansible 概述与运行机制](#一、Ansible 概述与运行机制)
-
- [1. 核心定义与优势](#1. 核心定义与优势)
- [2. 核心组成](#2. 核心组成)
- [3. 工作机制](#3. 工作机制)
- [二、Ansible 环境安装与配置](#二、Ansible 环境安装与配置)
-
- [1. 环境示例](#1. 环境示例)
- [2. 安装步骤(CentOS 7 系统)](#2. 安装步骤(CentOS 7 系统))
- [3. 核心目录结构](#3. 核心目录结构)
- [4. 关键配置操作](#4. 关键配置操作)
-
- [(1)主机清单(hosts 文件)](#(1)主机清单(hosts 文件))
- [(2)免密 SSH 配置(核心,避免每次输入密码)](#(2)免密 SSH 配置(核心,避免每次输入密码))
- [(3)ansible.cfg 关键配置(避坑必备)](#(3)ansible.cfg 关键配置(避坑必备))
- [三、Inventory 主机清单与变量配置](#三、Inventory 主机清单与变量配置)
-
- [1. 变量作用](#1. 变量作用)
- [2. 常用核心变量](#2. 常用核心变量)
- [3. 变量配置示例](#3. 变量配置示例)
- [四、Ansible 核心模块示例](#四、Ansible 核心模块示例)
-
- [1. command 模块(远程执行命令,不支持管道/重定向)](#1. command 模块(远程执行命令,不支持管道/重定向))
- [2. shell 模块(远程执行命令,支持 Shell 特性)](#2. shell 模块(远程执行命令,支持 Shell 特性))
- [3. cron 模块(管理远程主机计划任务)](#3. cron 模块(管理远程主机计划任务))
- [4. user 模块(管理远程主机系统用户)](#4. user 模块(管理远程主机系统用户))
- [5. group 模块(管理远程主机用户组)](#5. group 模块(管理远程主机用户组))
- [6. copy 模块(复制本地文件到远程,或直接写入内容)](#6. copy 模块(复制本地文件到远程,或直接写入内容))
- [7. file 模块(管理文件属性、创建/删除文件/链接)](#7. file 模块(管理文件属性、创建/删除文件/链接))
- [8. hostname 模块(修改远程主机名)](#8. hostname 模块(修改远程主机名))
- [9. ping 模块(检测被控端连通性)](#9. ping 模块(检测被控端连通性))
- [10. yum 模块(管理远程主机 RPM 软件包)](#10. yum 模块(管理远程主机 RPM 软件包))
- [11. service 模块(管理远程主机系统服务)](#11. service 模块(管理远程主机系统服务))
- [12. script 模块(远程执行管理端本地 Shell 脚本)](#12. script 模块(远程执行管理端本地 Shell 脚本))
- [13. setup 模块(收集被控端系统信息,即 Facts)](#13. setup 模块(收集被控端系统信息,即 Facts))
- 五、关键注意事项与总结
-
- [1. 核心命令格式](#1. 核心命令格式)
- [2. 实操避坑要点](#2. 实操避坑要点)
- 总结
前言
在云计算与大数据时代,运维工作早已告别 "单机手动操作" 的模式,自动化、集中化、模块化成为运维效率提升的核心关键词。Ansible 作为一款由 Python 编写的开源自动化运维工具,凭借 "无需被控端客户端、基于 SSH 协议通信、配置简洁灵活" 等核心优势,迅速成为运维领域的主流选择,广泛应用于批量部署、配置管理、任务编排等场景。
Ansible 完整知识体系
一、Ansible 概述与运行机制
1. 核心定义与优势
Ansible 是一款面向类 Unix 系统的自由开源自动化运维工具,由 Python 编写,与 SaltStack、Puppet、Chef 相比,核心优势如下:
- 轻量级:被控端无需安装客户端,仅依赖 SSH 协议通信
- 配置简洁:支持 YAML 和 Jinja2 模板语言,任务编排直观
- 集中化管理:主从模式,仅需在管理端安装即可管控多节点
- 扩展性强:支持 API 自定义模块(Python 开发),兼容云计算、大数据平台
- 无状态执行:模块推送至被控端执行后自动删除,无残留文件
2. 核心组成
| 组件 | 功能描述 |
|---|---|
| Ansible | 核心引擎,负责任务调度、节点通信与模块分发 |
| Modules | 执行具体操作的核心单元,含内置模块(如 ping、yum)和自定义模块 |
| Plugins | 补充功能模块,包括连接插件(SSH 通信)、邮件插件、日志插件等 |
| Playbooks | 剧本文件,以 YAML 格式定义多任务编排、依赖关系与状态管理 |
| Inventory | 主机清单,记录被控端的 IP、分组、SSH 连接参数等配置 |
| Roles | 模块化管理复杂 Playbook,支持任务复用、外部变量加载,有严格目录结构要求 |
3. 工作机制
- 管理端通过 SSH 协议与被控端建立连接
- 将指定模块(如 yum、copy)推送到被控端
- 被控端执行模块指令,生成执行结果
- 执行完成后,模块自动删除,结果反馈至管理端
- 可结合 SVN 等版本控制工具管理自定义模块与 Playbook
二、Ansible 环境安装与配置
1. 环境示例
| 节点类型 | IP 示例 | 角色职责 |
|---|---|---|
| 管理端 | 192.168.10.23 | 安装 Ansible,执行自动化任务 |
| 被控端 | 192.168.10.14/15 | 接收管理端指令,执行具体操作 |
2. 安装步骤(CentOS 7 系统)
bash
# 1. 安装 EPEL 源(解决依赖包获取问题)
yum install -y epel-release
# 2. 安装 Ansible 核心程序
yum install -y ansible
3. 核心目录结构
/etc/ansible/
├── ansible.cfg # 全局配置文件(关键参数可修改,如禁用主机密钥检查)
├── hosts # 主机清单(必配,定义被控端分组与连接信息)
└── roles/ # 公共角色目录(存放可复用的 Role 模块)
4. 关键配置操作
(1)主机清单(hosts 文件)
支持分组、端口指定、主机范围匹配,基础配置示例:
ini
# 基础分组配置
[webservers] # 网站服务器组
192.168.10.14 # 单个被控端 IP
192.168.10.1[2:5] # 范围匹配(192.168.10.12-192.168.10.15)
192.168.10.16:2222 # 非默认 SSH 端口(冒号后指定端口)
[dbservers] # 数据库服务器组
db-[a:f].example.org # 字母匹配(db-a 至 db-f 共 6 台主机)
# 组嵌套配置(父组包含子组)
[nginx]
192.168.10.20-22
[apache]
192.168.10.30-33
[webs:children] # webs 组包含 nginx 和 apache 子组
nginx
apache
(2)免密 SSH 配置(核心,避免每次输入密码)
bash
# 1. 管理端生成 SSH 密钥(一路回车,设置空密码)
ssh-keygen -t rsa
# 2. 推送公钥到被控端(两种方式)
# 方式一:手动输入被控端密码(适合少量节点)
ssh-copy-id root@192.168.10.14
# 方式二:sshpass 自动输入密码(适合批量部署)
sshpass -p '被控端root密码' ssh-copy-id root@192.168.10.14
(3)ansible.cfg 关键配置(避坑必备)
ini
[defaults]
host_key_checking = False # 禁用 SSH 主机密钥交互(解决 yes/no 弹窗)
timeout = 10 # 设置 SSH 连接超时时间(默认 10 秒)
[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s # 保持连接复用,提升效率
三、Inventory 主机清单与变量配置
1. 变量作用
通过变量统一配置被控端连接参数(如 SSH 用户名、端口),避免重复编写,支持主机变量、组变量、全局变量。
2. 常用核心变量
| 变量名 | 含义说明 |
|---|---|
| ansible_host | 被控端 IP 地址(当主机名无法解析时使用) |
| ansible_port | SSH 连接端口(默认 22,非默认需指定) |
| ansible_user | SSH 登录用户名(如 root、admin) |
| ansible_password | SSH 登录密码(未使用免密时配置) |
| ansible_ssh_private_key_file | 私钥文件路径(免密登录时指定) |
| ansible_become | 是否提升权限(如 sudo,值为 yes/no) |
| ansible_become_method | 权限提升方式(sudo/su/runas) |
| ansible_become_user | 提升后的目标用户(如 root) |
| ansible_become_password | 权限提升密码(如 sudo 密码) |
3. 变量配置示例
(1)主机变量(单个被控端专属配置)
ini
[webservers]
192.168.10.14 ansible_port=22 ansible_user=root ansible_password=abc1234
(2)组变量(组内所有被控端统一配置)
ini
[webservers:vars] # webservers 组所有节点生效
ansible_user=root
ansible_password=abc1234
[all:vars] # 所有被控端全局生效
ansible_port=22
四、Ansible 核心模块示例
每个模块均提取文档原生示例,附加参数解释、执行逻辑和应用场景,兼顾理论与实操。
1. command 模块(远程执行命令,不支持管道/重定向)
示例命令
bash
ansible all -m command -a "chdir=/home ls ./"
注释
all:目标对象(所有被控端,可替换为组名webservers、IP192.168.10.14)chdir=/home:执行命令前先切换到/home目录(command 模块核心参数)ls ./:实际执行的命令(列出当前目录内容)- 核心逻辑:在所有被控端的
/home目录下执行ls命令,不支持|(管道)、>(重定向)等 Shell 特性 - 适用场景:简单无复杂语法的远程命令执行(如查看日期、目录列表)
2. shell 模块(远程执行命令,支持 Shell 特性)
示例命令
bash
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'
注释
dbservers:目标组(仅对数据库服务器组执行)echo 123456:生成密码字符串(123456)|:管道符(Shell 特性,command 模块不支持,这是选择 shell 模块的核心原因)passwd --stdin test:通过标准输入给test用户设置密码(批量修改用户密码常用)- 核心逻辑:给
dbservers组所有被控端的test用户统一设置密码为 123456,利用 Shell 管道符实现批量操作 - 适用场景:需要管道、重定向、变量解析等 Shell 特性的复杂命令
3. cron 模块(管理远程主机计划任务)
示例命令
bash
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'
注释
webservers:目标组(仅对 web 服务器组执行)minute="*/1":执行频率(每分钟执行 1 次,*表示所有单位,*/n表示每隔 n 单位)job="/bin/echo helloworld":计划任务执行的命令(输出 helloworld)name="test crontab":计划任务名称(唯一标识,后续删除需用此名称)state=present:默认参数(可省略),表示「添加」计划任务(删除用state=absent)- 核心逻辑:给所有 web 服务器添加每分钟执行 1 次的计划任务,任务名为
test crontab - 补充删除命令:
ansible webservers -m cron -a 'name="test crontab" state=absent'
4. user 模块(管理远程主机系统用户)
示例命令
bash
ansible dbservers -m user -a 'name="test01" uid=306 system=yes group=mysql'
注释
name="test01":用户名(必选参数,创建/删除用户的核心标识)uid=306:指定用户 UID(唯一标识,避免与现有用户冲突)system=yes:创建为系统用户(系统用户 UID 通常小于 1000,默认no为普通用户)group=mysql:指定用户基本组为mysql(需提前通过 group 模块创建该组)- 核心逻辑:在
dbservers组所有被控端创建系统用户test01,UID=306,归属于mysql组 - 补充删除命令:
ansible dbservers -m user -a 'name="test01" state=absent'(加remove=yes可删除家目录)
5. group 模块(管理远程主机用户组)
示例命令
bash
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'
注释
name=mysql:用户组名称(必选参数,创建/删除组的核心标识)gid=306:指定组 GID(组唯一标识,避免与现有组冲突)system=yes:创建为系统组(系统组 GID 通常小于 1000,默认no为普通组)- 核心逻辑:在
dbservers组所有被控端创建系统组mysql,GID=306 - 适用场景:先创建专属组(如数据库组、web 组),再将用户加入组,实现权限隔离
6. copy 模块(复制本地文件到远程,或直接写入内容)
示例命令
bash
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
注释
src=/etc/fstab:管理端本地源文件路径(需确保文件存在)dest=/opt/fstab.bak:被控端目标路径(绝对路径,文件名为fstab.bak)owner=root:远程文件属主为root用户mode=640:远程文件权限为640(所有者可读可写,组可读,其他无权限)- 核心逻辑:将管理端的
/etc/fstab文件复制到所有数据库服务器的/opt目录备份,同时设置属主和权限 - 补充写入内容:
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'(无需本地文件,直接写入字符串)
7. file 模块(管理文件属性、创建/删除文件/链接)
示例命令
bash
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
注释
path=/opt/fstab.link:被控端目标路径(要创建的软链接文件)src=/opt/fstab.bak:被链接的原始文件(需已存在于被控端)state=link:操作类型(创建软链接,state=touch创建空文件,state=absent删除文件)- 核心逻辑:在所有数据库服务器上创建
/opt/fstab.link软链接,指向/opt/fstab.bak文件 - 其他用法:修改文件权限
ansible dbservers -m file -a 'path=/opt/fstab.bak mode=644'
8. hostname 模块(修改远程主机名)
示例命令
bash
ansible dbservers -m hostname -a "name=mysql01"
注释
name=mysql01:被控端新主机名(唯一参数)- 核心逻辑:将
dbservers组所有被控端的主机名统一修改为mysql01(实际部署建议按节点区分,如mysql01/mysql02) - 注意:修改后需重新登录被控端才能看到新主机名,Ansible 后续通信不受影响
9. ping 模块(检测被控端连通性)
示例命令
bash
ansible all -m ping
注释
all:目标对象(所有被控端)- 无额外参数:ping 模块仅检测 SSH 连通性,无需附加参数
- 核心逻辑:通过 SSH 协议测试管理端与被控端的连接状态,成功返回
"ping": "pong" - 适用场景:验证 Ansible 环境是否配置成功(实操核心测试命令)
10. yum 模块(管理远程主机 RPM 软件包)
示例命令
bash
ansible webservers -m yum -a 'name=httpd'
注释
webservers:目标组(仅对 web 服务器组执行)name=httpd:要安装的软件包名称(httpd 即 Apache 服务)state=present:默认参数(可省略),表示「安装」软件包(卸载用state=absent)- 核心逻辑:给所有 web 服务器批量安装 httpd 服务,自动处理依赖关系
- 卸载命令:
ansible webservers -m yum -a 'name=httpd state=absent'
11. service 模块(管理远程主机系统服务)
示例命令
bash
ansible webservers -m service -a 'enabled=true name=httpd state=started'
注释
enabled=true:设置服务开机自启(false为关闭自启)name=httpd:要管理的服务名称(需与系统服务名一致)state=started:服务操作(started启动、stopped停止、restarted重启)- 核心逻辑:给所有 web 服务器启动 httpd 服务,并设置开机自启
- 查看状态:
ansible webservers -a 'systemctl status httpd'(默认使用 command 模块)
12. script 模块(远程执行管理端本地 Shell 脚本)
示例命令
bash
# 第一步:管理端创建脚本并加执行权限
vim test.sh
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh
# 第二步:远程执行脚本
ansible webservers -m script -a 'test.sh'
注释
- 前提:管理端需提前创建脚本并赋予执行权限(
chmod +x test.sh) test.sh:管理端本地脚本路径(相对路径或绝对路径均可)- 核心逻辑:将管理端的
test.sh脚本推送到所有 web 服务器,自动执行,结果写入被控端/opt/script.txt - 适用场景:批量执行复杂 Shell 逻辑(无需在被控端单独创建脚本)
13. setup 模块(收集被控端系统信息,即 Facts)
示例命令
bash
ansible dbservers -m setup -a 'filter=*ipv4'
注释
dbservers:目标组(仅收集数据库服务器信息)filter=*ipv4:筛选参数(仅返回 IPv4 相关信息,*为通配符)- 核心逻辑:收集
dbservers组所有被控端的 IPv4 地址信息,不筛选则返回完整系统信息(CPU、内存、网卡、系统版本等) - 适用场景:获取被控端配置信息(如批量获取 IP、系统版本),为后续任务编排提供数据支持
五、关键注意事项与总结
1. 核心命令格式
bash
ansible <目标> -m <模块> -a <参数> # 完整格式
ansible <目标> -a <命令> # 省略 -m 时,默认使用 command 模块
- 目标:可指定 IP、组名(如
webservers)、all(所有被控端)
2. 实操避坑要点
- 免密认证失败:检查被控端
/root/.ssh目录权限为 700,authorized_keys文件权限为 600,且sshd_config开启PermitRootLogin yes - 主机密钥弹窗:修改
ansible.cfg中host_key_checking = False,全局禁用密钥检查 - 模块选择原则:简单命令用
command,需 Shell 特性用shell,批量操作(装软件、改服务)用对应功能模块(yum/service)
总结
Ansible 凭借「无客户端、SSH 通信、配置简洁、模块化」等特点,成为自动化运维首选工具,适用于批量部署、配置管理、任务编排等场景,尤其适合中小规模集群的集中化管理。