Ansible ——核心模块

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 主机清单与变量配置)
    • [四、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. 工作机制

  1. 管理端通过 SSH 协议与被控端建立连接
  2. 将指定模块(如 yum、copy)推送到被控端
  3. 被控端执行模块指令,生成执行结果
  4. 执行完成后,模块自动删除,结果反馈至管理端
  5. 可结合 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.cfghost_key_checking = False,全局禁用密钥检查
  • 模块选择原则:简单命令用command,需 Shell 特性用shell,批量操作(装软件、改服务)用对应功能模块(yum/service

总结

Ansible 凭借「无客户端、SSH 通信、配置简洁、模块化」等特点,成为自动化运维首选工具,适用于批量部署、配置管理、任务编排等场景,尤其适合中小规模集群的集中化管理。

相关推荐
叫致寒吧4 小时前
Ansible-Playbook 剧本编写
ansible
The star"'19 小时前
04-管理变量和事实
运维·云计算·ansible
tzhou6445220 小时前
自动化运维利器Ansible
运维·自动化·ansible
可爱又迷人的反派角色“yang”1 天前
ansible的概念及基本操作(一)
运维·ansible
乾元1 天前
网络遥测(Telemetry/gNMI)的结构化建模与特征化体系—— 从“采集指标”到“可被 AI 推理的状态向量”
运维·服务器·网络·人工智能·网络协议·华为·ansible
原神启动11 天前
Ansible(一)—— 自动化运维工具 Ansible:集中化管理服务器
运维·自动化·ansible
The star"'2 天前
02-Ansible 基本使用
运维·云计算·ansible
元气满满-樱2 天前
Ansible变量定义以及引用
ansible
Xyz996_2 天前
Ansible进行Nginx编译安装的详细步骤
运维·ansible