5.Ansible-playbook-模块介绍(知识点补充)
5.(补充)Ansible-playbook模块介绍
playbook含义(回顾)
Playbook(剧本)是 Ansible 的核心功能之一,是一种用 YAML 格式编写的配置文件,用于定义一系列任务(task),实现对远程主机的批量配置、部署、管理等自动化操作。
与临时命令(ansible
命令)相比,Playbook 更适合复杂场景,支持任务编排、条件判断、循环、变量定义等高级功能,且可复用、可版本控制。
playbook基本格式
Playbook 采用 YAML 语法,基本结构由以下几个核心部分组成:
# 示例:一个简单的 Playbook
- name: 这是一个Playbook示例 # Play的名称(可选,用于说明作用)hosts: webservers # 目标主机/主机组(必填,来自inventory)remote_user: root # 远程执行用户(可选,默认使用ansible.cfg配置)become: yes # 是否提权(可选,yes表示使用sudo切换权限)vars: # 定义变量(可选)http_port: 80tasks: # 任务列表(必填,定义要执行的操作)- name: 安装nginx # 任务名称(可选,建议填写,便于调试)yum: # 模块名称(必填,指定要使用的Ansible模块)name: nginx # 模块参数(根据模块不同而变化)state: present # 确保nginx已安装- name: 启动nginx服务service:name: nginxstate: startedenabled: yes # 设置开机自启
核心字段说明:
hosts
:指定目标主机(必须),可填写主机名、IP 或 inventory 中定义的组名(如all
表示所有主机)。tasks
:任务列表(必须),每个任务用- name: ...
开头,包含模块名
和模块参数
。remote_user
:远程执行的用户(默认使用控制节点当前用户)。become
:是否切换到特权用户(如yes
表示使用sudo
提权,需配合become_user: root
指定目标用户)。vars
:定义变量,可在任务中通过{{ 变量名 }}
引用。roles
:引用角色(复杂场景使用,用于模块化组织任务)。
常用模块和参数
nsible 提供了数百个模块,覆盖系统管理、软件部署、文件操作等场景,以下是当前学习阶段常用模块和参数:
一、包管理类(软件安装 / 卸载)
用于管理不同 Linux 发行版的软件包,实现软件的安装、卸载和版本控制。
yum 模块
用于 RHEL、CentOS 等基于 RPM 的系统,管理软件包的安装、卸载、更新等操作。
- name: 安装指定版本的nginxyum:name: nginx-1.20.1 # 软件包名,可指定版本state: present # 状态:present(安装)、absent(卸载)、latest(最新版)update_cache: yes # 安装前更新缓存,类似yum makecache
apt 模块
用于 Debian、Ubuntu 等基于 Debian 的系统,管理软件包的生命周期。
- name: 安装最新版dockerapt:name: docker.io # 软件包名称state: latest # 状态:与yum模块一致update_cache: yes # 是否执行apt update更新源cache_valid_time: 3600 # 缓存有效期(秒)
二、服务管理类(服务启停 / 自启)
用于控制系统服务的运行状态,包括启动、停止、重启以及设置开机自启等。
service 模块
通用的服务管理模块,适用于大多数系统,可控制服务的运行状态和自启动设置。
- name: 确保nginx启动并开机自启service:name: nginx # 服务名称state: started # 状态:started(启动)、stopped(停止)、restarted(重启)、reloaded(重载)enabled: yes # 是否开机自启:yes(是)、no(否)
三、文件操作类(文件 / 目录 / 内容管理)
处理文件和目录的创建、删除、属性修改,以及文件的传输、同步、解压等操作。
file 模块
管理文件和目录的属性,包括创建、删除、权限设置、所有者修改等。
- name: 创建目录并设置权限file:path: /data/logs # 文件或目录的路径state: directory # 类型:directory(目录)、file(文件)、link(软链接)、absent(删除)mode: '0755' # 权限设置,八进制表示,需加引号owner: www # 所有者用户名group: www # 所属组名
copy 模块
将控制节点的本地文件复制到远程节点,并可设置文件权限、所有者等属性。
- name: 复制配置文件到远程copy:src: ./nginx.conf # 控制节点上的源文件路径dest: /etc/nginx/nginx.conf # 远程节点的目标路径mode: '0644' # 远程文件的权限owner: root # 远程文件的所有者backup: yes # 是否备份远程节点上的原有文件
template 模块
使用 Jinja2 模板生成远程文件,支持变量替换,适用于动态配置文件的生成。
- name: 生成动态配置文件template:src: ./nginx.conf.j2 # 控制节点上的模板文件(含{{变量}})dest: /etc/nginx/nginx.conf # 远程节点的目标路径mode: '0644' # 生成文件的权限variable_start_string: '[[[' # 自定义变量起始符号(默认{{)
synchronize 模块
基于 rsync 工具实现文件的同步,支持控制节点与远程节点之间的双向同步。
- name: 同步本地代码到远程synchronize:src: ./project/ # 源路径(控制节点或远程节点)dest: /opt/project/ # 目标路径(远程节点或控制节点)mode: push # 同步方向:push(本地到远程)、pull(远程到本地)delete: yes # 是否删除目标路径中源路径没有的文件
fetch 模块
从远程节点拉取文件到控制节点,通常用于获取日志、配置文件等。
- name: 拉取远程日志到本地fetch:src: /var/log/nginx/access.log # 远程节点上的文件路径(必须是文件)dest: ./logs/ # 控制节点上的保存路径(自动创建主机名子目录)flat: yes # 是否跳过主机名目录,直接保存到dest
unarchive 模块
解压压缩包,支持本地压缩包上传到远程节点后解压,或直接解压远程 URL 的压缩包。
- name: 从URL下载并解压unarchive:src: https://example.com/app.tar.gz # 压缩包路径(本地文件或远程URL)dest: /opt/ # 解压的目标目录remote_src: yes # src是否为远程路径:yes(是)、no(否)mode: '0755' # 解压后文件的权限
stat 模块
获取文件或目录的状态信息,如是否存在、权限、校验和等,用于条件判断。
- name: 检查文件是否存在stat:path: /etc/nginx/nginx.conf # 要检查的文件路径get_checksum: yes # 是否计算文件校验和follow: yes # 是否跟随软链接register: file_info # 将结果保存到变量
四、文件内容修改类(配置文件编辑)
用于精准修改文件内容,包括单行替换、批量替换、插入代码块等,避免手动编辑配置文件。
lineinfile 模块
匹配文件中的特定行并进行替换,或确保某行存在,适用于修改配置文件中的单行配置。
- name: 禁用SELinuxlineinfile:path: /etc/selinux/config # 目标文件路径regexp: '^SELINUX=' # 匹配行的正则表达式line: 'SELINUX=disabled' # 替换后的内容state: present # present(确保行存在)、absent(删除匹配行)
replace 模块
基于正则表达式批量替换文件中的内容,适用于需要全局替换的场景。
- name: 替换nginx端口配置replace:path: /etc/nginx/nginx.conf # 目标文件路径regexp: 'listen 80;' # 要匹配的内容(正则表达式)replace: 'listen 8080;' # 替换后的内容backup: yes # 是否备份原文件
blockinfile 模块
在文件中插入或替换一块内容,并通过标记注释标识,便于后续管理。
- name: 插入nginx虚拟主机配置blockinfile:path: /etc/nginx/nginx.conf # 目标文件路径block: | # 要插入的内容块server {listen 80;server_name example.com;}marker: "# {mark} ANSIBLE MANAGED BLOCK" # 内容块的标记注释state: present # present(插入)、absent(删除)
五、系统配置类(系统参数 / 安全设置)
用于系统级别的配置,包括防火墙规则、SELinux 设置、磁盘挂载、LVM 管理等。
firewalld 模块
管理 firewalld 防火墙的规则,配置端口、服务的访问权限。
- name: 允许80/tcp端口通过防火墙firewalld:port: 80/tcp # 端口(或使用service指定服务名,如http)permanent: yes # 是否永久生效:yes(重启后有效)、no(临时有效)immediate: yes # 是否立即生效(无需重启firewalld)state: enabled # enabled(允许)、disabled(拒绝)
sefcontext 模块
管理 SELinux 的安全上下文规则,设置文件或目录的 SELinux 类型。
- name: 设置web目录SELinux类型sefcontext:target: /var/www(/.*)? # 目标路径(支持通配符)setype: httpd_sys_content_t # SELinux类型state: present # present(添加规则)、absent(删除规则)reload: yes # 是否重载SELinux规则
mount 模块
管理文件系统的挂载点,包括临时挂载和永久挂载(写入 /etc/fstab)。
- name: 挂载/data分区mount:path: /data # 挂载点路径src: /dev/sdb1 # 设备或分区路径fstype: ext4 # 文件系统类型state: mounted # mounted(挂载并写入fstab)、unmounted(卸载)、absent(从fstab移除)
filesystem 模块
在磁盘分区上创建文件系统(格式化分区),支持多种文件系统类型。
- name: 格式化分区为xfsfilesystem:fstype: xfs # 文件系统类型(如ext4、xfs等)dev: /dev/sdb1 # 要格式化的设备路径force: no # 是否强制格式化(即使已有文件系统)
lvol 模块
管理 LVM(逻辑卷管理)中的逻辑卷,包括创建、删除、调整大小等。
- name: 创建10G逻辑卷lvol:vg: vg_data # 卷组名称lv: lv_app # 逻辑卷名称size: 10G # 逻辑卷大小(支持G、M等单位)state: present # present(创建)、absent(删除)
六、用户与权限类(用户 / 组管理)
用于管理系统用户、组以及数据库用户,设置用户属性和权限。
user 模块
管理系统用户,包括创建、删除用户,设置用户 ID、家目录、所属组等。
- name: 创建www用户user:name: www # 用户名uid: 1000 # 用户IDgroup: www # 主组groups: wheel,nginx # 附加组(逗号分隔)home: /home/www # 家目录路径shell: /bin/bash # 默认shellstate: present # present(创建)、absent(删除)
mysql_user 模块
管理 MySQL 数据库中的用户,包括创建、删除用户,设置密码和权限。
- name: 创建MySQL用户mysql_user:name: appuser # MySQL用户名password: '123456' # 用户密码host: '%' # 允许访问的主机(%表示所有主机)priv: 'appdb.*:ALL' # 权限设置(数据库.表:权限)state: present # present(创建)、absent(删除)
七、命令执行类(远程命令 / 脚本)
在远程节点执行命令或脚本,支持简单命令、复杂 shell 命令以及定时任务。
command 模块
在远程节点执行命令,不通过 shell 环境,不支持管道、重定向等 shell 特性。
- name: 查看nginx版本command: nginx -vregister: nginx_version # 将命令输出保存到变量creates: /etc/nginx # 若该文件/目录存在,则不执行命令
shell 模块
通过 shell 环境在远程节点执行命令,支持管道、重定向、变量等 shell 特性。
- name: 统计错误日志行数shell: cat /var/log/nginx/error.log | grep -c 'error'register: error_count # 保存命令输出到变量executable: /bin/bash # 指定使用的shell
cron 模块
管理远程节点的定时任务(crontab),添加、修改或删除定时任务。
- name: 添加日志清理任务cron:name: "clean logs" # 定时任务名称minute: "0" # 分钟(0-59)hour: "3" # 小时(0-23)weekday: "0" # 星期(0=周日,1=周一...6=周六)job: "find /var/log -name '*.log' -mtime +7 -delete" # 要执行的命令user: root # 任务所属用户
八、信息收集与调试类(系统信息 / 调试)
用于收集远程节点的系统信息、调试 Playbook,以及测试节点连通性。
setup 模块
收集远程节点的 facts 信息(系统、硬件、网络等信息),用于条件判断或变量引用。
- name: 收集主机IP信息setup:filter: ansible_default_ipv4 # 过滤信息,只收集默认IPv4相关信息register: ip_info # 保存结果到变量
gather_facts 模块
在 Play 级别控制是否收集 facts 信息,关闭可加快 Playbook 执行速度。
- name: 不收集facts加速执行hosts: webserversgather_facts: no # yes(默认,收集facts)、no(不收集)tasks:- name: 执行任务debug:msg: "不依赖facts的任务"
debug 模块
输出变量或自定义信息,用于 Playbook 的调试,查看变量值或执行状态。
- name: 打印主机IPdebug:msg: "主机IP: {{ ip_info.ansible_facts.ansible_default_ipv4.address }}" # 输出自定义消息
ping 模块
测试控制节点与远程节点的连通性,返回 “pong” 表示连通。
- name: 测试主机是否可达ping: # 无参数,成功返回pong
九、变量与任务组织类(变量管理 / 任务复用)
用于管理 Playbook 中的变量,以及组织和控制任务的执行流程。
vars 模块
在 Play 或任务中定义变量,用于存储常量、配置参数等,可在任务中通过 {{变量名}} 引用。
- name: 定义变量示例hosts: allvars:http_port: 80 # 定义变量http_portapp_name: myapp # 定义变量app_nametasks:- name: 使用变量debug:msg: "端口: {{ http_port }}" # 引用变量
include_vars 模块
从外部文件加载变量,实现变量的集中管理,便于维护。
- name: 加载变量文件include_vars:file: ./app_vars.yml # 变量文件路径name: app_vars # 为加载的变量添加前缀(可选)
meta 模块
控制 Playbook 的执行流程,如立即执行 handlers、提前结束 Play 等。
- name: 立即执行handlersmeta: flush_handlers # 立即执行已定义的handlers,不等待当前Play的所有任务完成- name: 结束当前Playmeta: end_play # 提前终止当前Play的执行
十、其他常用模块
git 模块
从 Git 仓库拉取代码到远程节点,支持指定分支、标签或提交 ID,可更新已有仓库。
- name: 拉取项目代码git:repo: https://github.com/example/project.git # Git仓库URLdest: /opt/project # 远程节点的目标目录version: main # 分支、标签或提交IDupdate: yes # 若目录已存在,是否更新代码
uri 模块
发送 HTTP 或 HTTPS 请求,可用于检查 API 状态、调用接口、下载文件等。
- name: 检查服务健康状态uri:url: http://localhost:8080/health # 请求的URLmethod: GET # HTTP方法(GET、POST等)status_code: 200 # 预期的状态码,不匹配则任务失败return_content: yes # 是否返回响应内容
如涉及版权问题,请联系作者处理!!!!!!!!