当前位置: 首页 > news >正文

Ansible 核心模块与实操练习

Ansible 核心模块与实操练习

一、Ansible 模块基础

1.1 模块核心特性

  • 幂等性:多数模块支持幂等操作(多次执行结果一致,避免重复操作或系统异常)。
  • 安装第三方模块:通过 ansible-galaxy 工具安装,命令如下:
# 安装 community-general 模块集ansible-galaxy collection install http://ansible.example.com/materials/community-general-6.3.0.tar.gz -p collections/# 安装 ansible-posix 模块集ansible-galaxy collection install http://ansible.example.com/materials/ansible-posix-1.5.1.tar.gz -p collections/
  • 查看已安装模块
ansible-doc -l # 列出系统中所有已安装的 Ansible 模块

1.2 模块语法格式

ansible [受控主机名/组名] -m [模块名] -a '[模块参数键值对]'

二、常用核心模块详解

2.1 文件操作模块

(1)copy 模块
  • 功能:将本地文件复制到受控主机,支持设置权限、所有者、备份等。
  • 关键参数
    • src:本地源文件 / 目录路径(相对路径或绝对路径,目录加 / 仅复制内容,不加复制目录本身);
    • dest:远程目标路径(必须为绝对路径);
    • owner:远程文件的所有者(如 root);
    • group:远程文件的所属组(如 student);
    • mode:远程文件的权限(如 0644 或 u=rwx,g=rx,o=rx);
    • backup:复制前备份远程同名文件(yes/no,默认 no)。
  • 实操示例
  • 将本地 /etc/fstab 复制到 node1 的 /var/tmp 目录:
ansible node1 -m copy -a 'src=/etc/fstab dest=/var/tmp/fstab'
  • 复制文件并指定所有者、所属组和权限:
ansible node1 -m copy -a 'src=/etc/fstab dest=/var/tmp/fstab owner=root group=student mode=0644'
(2)file 模块
  • 功能:管理文件 / 目录的属性,包括创建、删除、修改权限、设置链接、调整 SELinux 上下文等。
  • 关键参数
    • path:目标文件 / 目录的路径(必须为绝对路径);
    • state:目标状态(directory 创目录、touch 创文件、link 创软链接、hard 创硬链接、absent 删除);
    • owner/group:所有者 / 所属组;
    • mode:权限(如 0755 或 g+w);
    • setype:SELinux 安全上下文类型(如 samba_share_t);
    • src:创建链接时的源文件路径(仅 state=link/hard 时需设置)。
  • 实操示例
  • 在 node1 上创建 /tmp/abc 文件:
ansible node1 -m file -a 'path=/tmp/abc state=touch'
  • 创建 /tmp/aa 目录并设置权限:
ansible node1 -m file -a 'path=/tmp/aa state=directory mode=0755'
  • 为 /tmp/bbb 创建软链接 /tmp/aa:
ansible node1 -m file -a 'src=/tmp/bbb dest=/tmp/aa state=link'
  • 修改 /tmp/fstab 的 SELinux 上下文为 samba_share_t:
ansible node1 -m file -a 'path=/tmp/fstab setype=samba_share_t'
(3)template 模块
  • 功能:复制带 Jinja2 变量的模板文件到受控主机,支持配置文件动态生成(如根据主机名、IP 调整配置)。
  • 关键参数
    • src:本地模板文件路径(如 /usr/share/doc/httpd/httpd-vhosts.conf);
    • dest:远程目标路径;
    • owner/group/mode:同 copy 模块;
    • validate:复制后、生效前执行语法校验命令(如 httpd -t -f %s,%s 指代目标文件)。
  • 实操示例

复制 httpd 虚拟主机模板到 node1 的配置目录,并设置权限:

ansible node1 -m template -a 'src=/usr/share/doc/httpd/httpd-vhosts.conf dest=/etc/httpd/conf.d/httpd-vhosts.conf owner=root group=root mode=0644'
(4)replace 模块
  • 功能:按正则表达式匹配文件内容,并替换为指定字符串,支持备份原文件。
  • 关键参数
    • path:目标文件路径;
    • regexp:待匹配的正则表达式(如 /var/www);
    • replace:替换后的内容(如 /www);
    • backup:替换前备份原文件(yes/no)。
  • 实操示例

将 node1 上 /tmp/test 文件中的 “ab” 替换为 “xx”,并备份原文件:

ansible node1 -m replace -a 'path=/tmp/test regexp="ab" replace="xx" backup=yes'
(5)fetch 模块
  • 功能:从受控主机拉取文件到控制节点(仅支持文件,不支持目录),默认按 “主机名 / 文件路径” 存储。
  • 关键参数
    • src:远程源文件路径(必须为绝对路径,且是文件);
    • dest:控制节点的存储目录(绝对路径);
    • flat:简化存储路径(yes 时直接存到 dest 目录,不创建主机名子目录)。
  • 实操示例
  • 拉取 node1 的 /etc/fstab 到控制节点 /tmp,按 “/tmp/node1/etc/fstab” 存储:
ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp'
  • 拉取文件并简化路径为 /tmp/fstab:
ansible node1 -m fetch -a 'src=/etc/fstab dest=/tmp/flat=yes'

2.2 软件包管理模块

(1)yum 模块
  • 功能:用于 RHEL/CentOS/Rocky Linux 等系统,管理 RPM 软件包(安装、卸载、更新)。
  • 关键参数
    • name:包名(单个包如 httpd,多个包用逗号分隔如 httpd,nginx);
    • state:包状态(present/installed 安装、latest 安装最新版、absent/removed 卸载)。
  • 实操示例
  • 在 node1 上安装 httpd:
ansible node1 -m yum -a 'name=httpd state=installed'
  • 卸载 node1 上的 httpd:
ansible node1 -m yum -a 'name=httpd state=removed'
(2)yum_repository 模块
  • 功能:在受控主机上配置 YUM 仓库(生成 .repo 文件)。
  • 关键参数
    • file:.repo 文件名(如 server,最终路径为 /etc/yum.repos.d/server.repo);
    • name:仓库标识(.repo 文件中 [ ] 内的名称,如 BaseOS);
    • description:仓库描述(注释信息);
    • baseurl:仓库地址(如 http://ansible.example.com/rhel9/BaseOS);
    • enabled:是否启用仓库(yes/no);
    • gpgcheck:是否校验 GPG 签名(yes/no)。
  • 实操示例

在 node1 上配置 RHEL9 BaseOS 仓库:

ansible node1 -m yum_repository -a 'file=server name=a description=aa baseurl=http://ansible.example.com/rhel9/BaseOS enabled=yes gpgcheck=no'ansible node1 -m yum_repository -a 'file=server name=aa description=aaa baseurl=http://ansible.example.com/rhel9/AppStream enabled=yes gpgcheck=no'


 

2.3 系统管理模块
(1)user 模块
  • 功能:管理系统用户(创建、修改、删除、设置密码、调整权限等)。
  • 关键参数
    • name:用户名(必填,如 newbie);
    • uid:用户 UID(如 4000);
    • password:加密后的密码(需用 openssl passwd -1 密码 生成,如 $1$kinHW5tt$wPKePKs27g.NWDmbSc/D90);
    • state:present 创建、absent 删除;
    • createhome:是否创建家目录(yes/no,默认 yes);
    • update_password:密码更新策略(always 总是更新、on_create 仅创建时设置);
    • shell:用户登录 shell(如 /bin/bash、/sbin/nologin)。
  • 实操示例
  • 在 node1 上创建 UID 为 4000 的用户 newbie:
ansible node1 -m user -a 'name=newbie uid=4000 state=present'
  • 为用户 sl 设置密码(仅创建时生效):
ansible node1 -m user -a 'name=sl state=present password="$1$kinHW5tt$wPKePKs27g.NWDmbSc/D90" update_password=on_create'
(2)service 模块
  • 功能:管理系统服务(启动、停止、重启、重载配置、设置开机自启)。
  • 关键参数
    • name:服务名(如 httpd、firewalld);
    • state:服务状态(started 启动、stopped 停止、restarted 重启、reloaded 重载配置);
    • enabled:是否开机自启(yes/no)。
  • 实操示例

在 node1 上启动 httpd 服务并设置开机自启:

ansible node1 -m service -a 'name=httpd state=started enabled=yes'
(3)firewalld 模块
  • 功能:管理 firewalld 防火墙规则(开放端口 / 服务、设置富规则、配置区域等)。
  • 关键参数
    • service:开放的服务名(如 http、ssh,需 firewalld 预定义);
    • port:开放的端口(如 8080/tcp、53/udp);
    • permanent:规则是否永久生效(yes/no,默认 no,永久规则需重启 firewalld 或用 immediate=yes 立即生效);
    • state:enabled 添加规则、disabled 删除规则;
    • immediate:是否立即应用规则(yes/no,配合 permanent=yes 使用);
    • rich_rule:富规则(精细控制,如允许特定网段访问)。
  • 实操示例
  • 允许 http 服务永久生效并立即应用:
ansible node1 -m firewalld -a 
'service=http 
permanent=yes 
state=enabled 
immediate=yes'
  • 允许 192.168.100.0/24 网段访问 http 服务:
ansible node1 -m firewalld -a 
'zone=public 
rich_rule="rule family=ipv4 source address=192.168.100.0/24 service name=http accept" permanent=yes 
state=enabled 
immediate=yes'
(4)cron 模块
  • 功能:管理系统定时任务(添加、删除、修改)。
  • 关键参数
    • name:任务名称(唯一标识,删除时需指定);
    • user:执行任务的用户(如 root、sl);
    • job:任务命令(如 test ab、/usr/bin/backup.sh);
    • minute/hour/day/month/weekday:时间参数(分别对应分、时、日、月、周,* 表示所有,*/5 表示每 5 单位);
    • state:present 添加、absent 删除。
  • 实操示例

为 sl 用户添加 “每 5 分钟执行 test ab” 的定时任务:

ansible node1 -m cron -a 
'name=test_ab 
user=sl 
minute="*/5" 
job="test ab" 
state=present'

2.4 存储管理模块

(1)parted 模块
  • 功能:管理磁盘分区(创建、删除分区,支持 MBR 和 GPT 分区表)。
  • 关键参数
    • device:磁盘路径(如 /dev/vdb、/dev/sdc);
    • number:分区号(如 1、2);
    • part_type:分区类型(primary 主分区、logical 逻辑分区,MBR 最多 4 个主分区);
    • part_start:分区起始位置(如 10MiB、1GiB);
    • part_end:分区结束位置(如 1010MiB、5GiB);
    • state:present 创建分区、absent 删除分区。
  • 实操示例

在 node2 的 /dev/vdb 上创建 1000MiB 的主分区(起始 10MiB,结束 1010MiB):

ansible node2 -m parted -a 
'device=/dev/vdb 
number=1 
part_type=primary 
part_start=10MiB 
part_end=1010MiB 
state=present'
(2)filesystem 模块
  • 功能:格式化磁盘分区为指定文件系统(如 ext4、xfs、btrfs)。
  • 关键参数
    • dev:分区 / 设备路径(如 /dev/vdb1、/dev/datastorage/database);
    • fstype:文件系统类型(ext4、xfs、btrfs 等);
    • force:强制格式化(yes/no,默认 no,谨慎使用,会清空数据)。
  • 实操示例

将 node2 的 /dev/vdb1 格式化为 ext4 文件系统:

ansible node2 -m filesystem -a 'dev=/dev/vdb1 fstype=ext4'
(3)mount 模块
  • 功能:管理文件系统挂载(临时挂载、永久挂载到 /etc/fstab)。
  • 关键参数
    • path:挂载点路径(如 /testdir、/lv,需提前创建);
    • src:设备 / 分区路径或 UUID(UUID 更稳定,如 UUID=c06d4819-fa79-4218-ae6f-6cd33176f4cd);
    • fstype:文件系统类型(需与格式化类型一致);
    • state:mounted 挂载并写入 /etc/fstab、unmounted 卸载、present 仅写入 /etc/fstab 不挂载。
  • 实操示例

将 node2 的 /dev/vdb1(UUID 为 c06d4819-fa79-4218-ae6f-6cd33176f4cd)永久挂载到 /testdir:

ansible node2 -m mount -a 
'src="UUID=c06d4819-fa79-4218-ae6f-6cd33176f4cd" 
path=/testdir 
fstype=ext4 
state=mounted'
(4)lvg 模块
  • 功能:管理 LVM 卷组(创建、扩展、删除卷组,添加 / 移除物理卷)。
  • 关键参数
    • vg:卷组名(如 datastorage);
    • pvs:物理卷列表(如 /dev/vdb3、/dev/sdc1,多个用逗号分隔);
    • pesize:PE(物理扩展单元)大小(如 4MiB、8MiB,默认 4MiB);
    • state:present 创建卷组、absent 删除卷组、extended 扩展卷组(添加物理卷)。
  • 实操示例

在 node3 上创建卷组 datastorage,使用物理卷 /dev/vdb3:

ansible node3 -m lvg -a 'vg=datastorage pvs=/dev/vdb3'
(5)lvol 模块
  • 功能:管理 LVM 逻辑卷(创建、扩展、缩小、删除逻辑卷)。
  • 关键参数
    • lv:逻辑卷名(如 database);
    • vg:所属卷组名(如 datastorage);
    • size:逻辑卷大小(如 800M、2GiB,扩展时可加 + 如 +500M);
    • resizefs:扩展 / 缩小时是否同步调整文件系统(yes/no,默认 no,扩展时建议设为 yes);
    • state:present 创建、absent 删除、resized 调整大小。
  • 实操示例
  • 在 node3 的 datastorage 卷组上创建 800M 的逻辑卷 database:
ansible node3 -m lvol -a 'lv=database size=800M vg=datastorage'
  • 将逻辑卷 database 扩展到 1600M,并同步扩展文件系统:
ansible node3 -m lvol -a 'lv=database size=1600M vg=datastorage resizefs=yes'

2.5 网络与工具模块

(1)get_url 模块
  • 功能:从 HTTP/HTTPS/FTP 服务器下载文件到受控主机。
  • 关键参数
    • url:下载地址(如 http://ansible.example.com/files/test.tar.gz);
    • dest:受控主机的目标路径(绝对路径,如 /tmp/test.tar.gz);
    • owner/group/mode:同 copy 模块;
    • backup:目标文件存在时是否备份(yes/no);
    • validate_certs:HTTPS 下载时是否校验证书(yes/no,默认 yes)。
  • 实操示例

下载文件到 node1 的 /tmp 目录:

ansible node1 -m get_url -a 
'url=http://ansible.example.com/files/test.tar.gz 
dest=/tmp/test.tar.gz'
(2)sefcontext 模块
  • 功能:管理 SELinux 安全上下文规则(永久生效,区别于 file 模块的临时调整)。
  • 关键参数
    • target:目标路径正则(如 /share(/.*)? 表示 /share 及子目录);
    • setype:SELinux 上下文类型(如 httpd_sys_content_t、samba_share_t);
    • state:present 添加规则、absent 删除规则。
  • 实操示例

为 node1 的 /share 目录及子目录添加永久 SELinux 规则(类型为 samba_share_t):

ansible node1 -m sefcontext -a 'target="/share(/.*)?" setype=samba_share_t state=present'# 应用规则(配置后需执行,否则不生效)ansible node1 -m shell -a 'restorecon -Rv /share'
(4)debug 模块
  • 功能:输出调试信息(打印变量值、自定义消息,用于 Playbook 排错)。
  • 关键参数
    • msg:自定义消息(如 "httpd service started successfully");
    • var:待打印的变量(如 ansible_hostname、result,无需加引号);
    • verbosity:调试级别(0-4,级别越高输出越详细,默认 0)。
  • 实操示例
  • 输出自定义成功消息:
ansible node1 -m debug -a 'msg="httpd service started successfully"'
  • 打印 node1 的主机名变量:
ansible node1 -m debug -a 'var=ansible_hostname'

三、Ansible 实操练习

3.1 练习 1:Node1 部署 httpd 服务

目标:安装 httpd 服务,网页文件存于 /www,通过 curl http://node1 访问到内容 welcome to luoqi。

  • 安装 httpd 服务
ansible node1 -m yum -a 'name=httpd state=present'
  • 创建网页目录并设置 SELinux 上下文(确保 httpd 有权访问):
ansible node1 -m file -a 
'path=/www 
state=directory 
setype=httpd_sys_content_t'
  • 生成网页文件(内容为 welcome to luoqi):
ansible node1 -m copy -a 
'content="welcome to luoqi" 
dest=/www/index.html'
  • 修改 httpd 配置(将默认根目录 /var/www 替换为 /www,并备份原配置):
ansible node1 -m replace -a 
'path=/etc/httpd/conf/httpd.conf 
regexp="/var/www" 
replace="/www" 
backup=yes'
  • 启动 httpd 并设置开机自启
ansible node1 -m service -a 'name=httpd state=started enabled=yes'
  1. 验证结果

在控制节点执行以下命令,预期返回 welcome to luoqi:

curl http://node1

3.2 练习 2:Node2 创建分区并挂载

目标:在 node2 上创建 1000MiB 分区,格式化为 ext4,永久挂载到 /testdir。

  • 创建磁盘分区(假设使用空闲磁盘 /dev/vdb,分区号 1,起始 10MiB,结束 1010MiB):
ansible node2 -m parted -a 
'device=/dev/vdb 
number=1 
part_type=primary 
part_start=10MiB 
part_end=1010MiB 
state=present'
  • 格式化分区为 ext4
ansible node2 -m filesystem -a 'dev=/dev/vdb1 fstype=ext4'
  • 创建挂载点 /testdir
ansible node2 -m file -a 'path=/testdir state=directory mode=0755'
  • 查看分区 UUID(永久挂载推荐用 UUID,避免磁盘路径变化导致挂载失败):
ansible node2 -m shell -a 'blkid /dev/vdb1'# 记录输出的 UUID,示例:UUID=c06d4819-fa79-4218-ae6f-6cd33176f4cd
  • 永久挂载分区(写入 /etc/fstab 并立即挂载):
ansible node2 -m mount -a 
'src="UUID=c06d4819-fa79-4218-ae6f-6cd33176f4cd" 
path=/testdir 
fstype=ext4 
state=mounted'
  • 验证结果

执行以下命令,查看 /dev/vdb1 是否挂载到 /testdir:

ansible node2 -m shell -a 'df -Th'

3.3 练习 3:Node3 创建 LVM 并挂载

目标:在 node3 上创建卷组 datastorage、逻辑卷 database(800M),格式化为 xfs,永久挂载到 /lv。

  • 创建物理卷分区(假设使用 /dev/vdb,创建分区 3,大小足够容纳 800M 逻辑卷):
ansible node3 -m parted -a 
'device=/dev/vdb 
number=3 
part_type=primary 
part_start=2530MiB 
part_end=4530MiB 
state=present'
  • 创建卷组 datastorage(使用分区 /dev/vdb3):
ansible node3 -m lvg -a 'vg=datastorage pvs=/dev/vdb3'
  • 创建逻辑卷 database(大小 800M,属于 datastorage 卷组):
ansible node3 -m lvol -a 'lv=database size=800M vg=datastorage'
  • 格式化逻辑卷为 xfs
ansible node3 -m filesystem -a 'dev=/dev/datastorage/database fstype=xfs'
  • 创建挂载点 /lv
ansible node3 -m file -a 'path=/lv state=directory mode=0755'
  • 查看逻辑卷 UUID
ansible node3 -m shell -a 'blkid /dev/datastorage/database'# 记录 UUID,示例:UUID=d2e22769-1a3f-40fc-b25c-cf8025b9f0b1
  • 永久挂载逻辑卷
ansible node3 -m mount -a 
'src="UUID=d2e22769-1a3f-40fc-b25c-cf8025b9f0b1" 
path=/lv 
fstype=xfs 
state=mounted'
  • 验证结果

执行以下命令,查看 /dev/mapper/datastorage-database 是否挂载到 /lv:

ansible node3 -m shell -a 'df -Th'

http://www.dtcms.com/a/353255.html

相关文章:

  • 使用Python自动化VS 2022的C++项目构建流程
  • 数据结构青铜到王者第六话---栈(Stack)
  • 使用 ROS2 构建客户端-服务器通信:一个简单的计算器示例
  • 2024年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Vue3音频组件开发与使用指南
  • PythonDay38
  • 虚拟机逃逸攻防演练
  • 【项目】分布式Json-RPC框架 - 抽象层与具象层实现
  • 借助 LAMBDA 公式,实现单元格区域高效转换
  • 云计算资源分配问题
  • 【CVE-2025-49113】(内附EXP) 通过 PHP 对象反序列化在 Roundcube 中执行身份验证后远程代码
  • MongoDB Shell
  • 解决.env.production 写死 IP 的问题:Vue + config.json 运行时加载方案
  • vsCode如何自定义编辑器背景色
  • 元宇宙与医疗健康:重构诊疗体验与健康管理模式
  • 硬件开发_基于物联网的儿童座椅系统
  • Milvus + Reranker 混合搜索技术方案详细文档
  • 低空无人机系统关键技术与应用前景:SmartMediaKit视频链路的基石价值
  • SyncBackPro 备份及同步软件中的脚本功能简介
  • 直播预告|鸿蒙原生开发与智能工具实战
  • 【译】模型上下文协议(MCP)现已在 Visual Studio 中正式发布
  • ERP如何帮助工业制造行业实现多厂调配
  • 第38次CCF-CSP认证——月票发行(chatgpt5 vs deepseekv3.1)
  • GitHub 宕机自救指南:应急预案与替代平台
  • 锐捷交换机:IF-MIB::ifName 的oid是多少
  • Python包发布与分发策略:从开发到生产的最佳实践(续)
  • 项目:烟雾报警器
  • 高并发内存池(10)-PageCache获取Span(中)
  • 【LeetCode每日一题】48. 旋转图像 240. 搜索二维矩阵 II
  • C/C++ 数据结构 —— 线索二叉树