Ansible Playbook使用案例
Ansible Loop 循环Ansible 的loop循环功能允许您对一组数据项重复执行同一任务从而简化批量操作。本节将通过创建用户账户的实例演示loop的基本用法及其进阶应用。1. 1 基础循环创建用户以下 Playbook 使用loop在目标主机组db上创建两个用户user1和user2--- - hosts: db tasks: - name: Add the users ansible.builtin.user: name: {{ item }} state: present loop: - user1 - user21.2 进阶循环创建用户并设置密码若需为每个用户设置密码可将循环项改为字典列表通过item.user和item.pass分别引用用户名和密码--- - hosts: db tasks: - name: Add the users with password ansible.builtin.user: name: {{ item.user }} password: {{ item.pass | password_hash(sha512) }} state: present loop: - {user: user1, pass: pass1} - {user: user2, pass: pass2}1.1.3 验证用户创建结果执行完成后可通过以下命令验证用户是否成功创建并查看密码哈希[roothost1 ~]# cat /etc/shadow同时检查/home目录下是否已生成对应的用户家目录[roothost1 ~]# cd /home/ [roothost1 home]# ls kyy user1 user2 [roothost1 home]# ll total 0 drwx------ 4 kyy kyy 111 Aug 14 15:21 kyy drwx------ 2 user1 user1 62 Aug 15 17:44 user1 drwx------ 2 user2 user2 62 Aug 15 17:44 user21.4 跨主机组测试将目标主机组改为web并设置gather_facts: no以跳过事实收集可快速验证循环在不同环境下的执行效果--- - hosts: web gather_facts: no tasks: - name: Add the users with password ansible.builtin.user: name: {{ item.user }} password: {{ item.pass | password_hash(sha512) }} state: present loop: - {user: user1, pass: pass1} - {user: user2, pass: pass2}1.5 登录验证最后通过 SSH 登录新创建的用户账户确认账户可正常使用继续验证一下 [rootserver2 ~]# cd /home/ [rootserver2 home]# ls kyy user1 user2 [rootserver2 home]# cd user1/ [rootserver2 user1]# ll total 0 [rootserver2 user1]# ssh user1localhost The authenticity of host localhost (::1) cant be established. ED25519 key fingerprint is SHA256:0Hrk3R1SBGwunSQd57OJRVNVRibsQASR8UfHIS121c. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added localhost (ED25519) to the list of known hosts. user1localhosts password: [user1server2 ~]$ pwd /home/user1 [user1server2 ~]$ ll -d /home/user1 drwx------. 2 user1 user1 62 Aug 15 18:07 /home/user1tags在 Ansible 中tags标签是一个强大的功能它允许您为 playbook 中的任务task或整个 play 打上标记从而在执行时可以选择性地运行特定部分而不是运行整个 playbook。这在大型、复杂的自动化场景中尤其有用可以显著提高执行效率和灵活性。tags 的核心概念与用途主要用途包括选择性执行只运行带有特定标签的任务跳过其他任务。环境适配为开发、测试、生产环境定义不同的标签按需执行。功能模块化将 playbook 按功能如“安装”、“配置”、“启动”划分标签便于维护和调试。跳过已知问题临时跳过某些可能失败或不需要的任务。[kyyserver1 ansible]$ vim test.yml [kyyserver1 ansible]$ ansible-playbook test.yml --list-tags playbook: test.yml play #1 (lamp): lamp TAGS: [] TASK TAGS: [t1, t2, t3] play #2 (localhost): localhost TAGS: [] TASK TAGS: []--- - hosts: web #vars: # - http_port: 80 tasks: - name: Install the Apache ansible.builtin.yum: name: httpd state: present tags: t1 - name: Start service httpd, if not started ansible.builtin.service: name: httpd state: started enabled: yes tags: t2 name: create index.html ansible.builtin.copy: content: {{ ansible_hostname }}\n dest: /var/www/html/index.html tags: t3总而言之tags 是 Ansible 实现精细化、高效化自动化管理的核心工具之一熟练掌握其用法能显著提升运维工作的灵活性与可靠性。rescue在 Ansible 中rescue 是错误处理机制的关键组成部分通常与block和always结合使用构成一个完整的异常处理结构。当block中的任务执行失败时Ansible 会跳过该block内剩余的任务转而执行rescue部分用于捕获错误、记录日志或执行恢复操作。无论block和rescue的执行结果如何always部分都会被执行常用于清理资源或发送通知。3.1 基本语法与结构一个典型的block、rescue与always组合结构如下所示block主任务块包含两个主要任务1) 使用yum模块安装指定软件包2) 使用service模块启动该软件包对应的服务。这两个任务是期望正常执行的核心逻辑。rescue错误恢复块如果block中的任何一个任务失败Ansible 会跳过block中剩余的任务转而执行rescue块。这里它做了两件事1) 使用debug模块记录失败信息2) 尝试安装一个备用的软件包fallback-{{ package_name }}作为降级方案。always始终执行块无论block成功还是失败也无论rescue是否执行always块中的任务都会执行。这里它负责清理临时文件/tmp/{{ package_name }}.tmp确保不会留下垃圾数据。- name: Handle package installation with error recovery block: - name: Install the package ansible.builtin.yum: name: {{ package_name }} state: present - name: Start the service ansible.builtin.service: name: {{ package_name }} state: started rescue: - name: Log the failure ansible.builtin.debug: msg: Failed to install or start {{ package_name }} - name: Install a fallback package ansible.builtin.yum: name: fallback-{{ package_name }} state: present always: - name: Always clean up temporary files ansible.builtin.file: path: /tmp/{{ package_name }}.tmp state: absent总而言之rescue 机制为 Ansible Playbook 提供了强大的容错能力使得自动化脚本在面对不可预见的错误时能够优雅应对从而提升整体运维的可靠性与健壮性。facts组件在 Ansible 中facts事实是自动化任务执行的关键信息来源。它们是由 Ansible 在连接到目标主机后自动收集的系统信息包括主机名、IP 地址、操作系统版本、磁盘空间、内存使用情况等。这些信息以变量的形式存储可以在 Playbook 中直接引用从而实现动态、自适应的配置管理。默认情况下Ansible 会在每个 Play 开始时自动收集 facts。若需提升执行速度可通过gather_facts: no关闭此功能。对于需要精细控制或自定义信息的场景还可以使用setup模块手动收集或通过fact_caching缓存 facts 以加速后续 Playbook 运行。总而言之facts 是 Ansible 实现智能、上下文感知自动化的基石熟练掌握其收集、引用与缓存机制能极大提升 Playbook 的灵活性与可维护性。例如批量修改主机hosts文件--- - hosts: db tasks: - name: update hosts ansible.builtin.lineinfile: path: /etc/hosts line: {{ ansible_eth0.ipv4.address }} {{ ansible_hostname }}魔法变量 hostvars 与 groups在 Ansible 中hostvars和groups是两个强大的“魔法变量”它们提供了在 Playbook 执行期间动态访问主机信息和主机组结构的能力。本节将通过一个配置/etc/hosts文件的实例演示如何结合使用这两个变量。5.1 准备主机清单首先在 Ansible 的主机清单文件hosts中定义一个主机组[webservers]并添加若干成员[kyyserver1 ansible]$ vim hosts # 添加以下组 [webservers] server1 server2 host12. 创建模板任务 Playbook编写一个 Playbookgroup.yml使用template模块将 Jinja2 模板渲染到目标主机的/etc/hosts文件--- - hosts: webservers tasks: - name: test ansible.builtin.template: src: test.j2 dest: /etc/hosts5.3 编写 Jinja2 模板创建模板文件test.j2。该模板将循环遍历webservers组中的所有主机并使用hostvars获取每台主机的 IP 地址和主机名127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 {# 循环遍历 webservers 组中的每台主机 #} {% for host in groups[webservers] %} {{ hostvars[host].ansible_eth0.ipv4.address }} {{ hostvars[host].ansible_hostname }} {% endfor %}关键变量解析groups[webservers]返回属于webservers组的所有主机名列表。hostvars[host]一个字典包含了指定主机host的所有 facts 变量。这里我们获取其以太网接口 IP 地址ansible_eth0.ipv4.address和主机名ansible_hostname。5.4 执行与验证执行上述 Playbook 后目标主机上的/etc/hosts文件将被更新自动添加所有webservers组成员的 IP 与主机名映射。总结通过组合使用groups获取组内主机列表和hostvars获取特定主机的详细信息可以实现基于主机组结构的动态、批量配置这是编写灵活、可扩展的 Ansible Playbook 的核心技巧之一。

相关新闻

从OpenClaw到Hermes Agent:AI Agent开发框架的开发者体验演进

从OpenClaw到Hermes Agent:AI Agent开发框架的开发者体验演进

1. 项目概述:一场开发者工具的“静默迁徙”最近在AI Agent开发圈里,我观察到一个挺有意思的现象:身边不少老伙计,包括一些之前对OpenClaw推崇备至的朋友,都开始默默地转向了另一个工具——Hermes Agent。这不像是一场轰…

2026/8/16 5:11:27 阅读更多 →
LeetCode刷题的本质:从应试技巧到工程能力的深度转化策略

LeetCode刷题的本质:从应试技巧到工程能力的深度转化策略

1. 这篇文章真正要解决的问题如果你是一名正在准备技术面试的开发者,或者是一名计算机专业的学生,那么“刷LeetCode”这个词对你来说一定不陌生。它几乎是通往大厂Offer的必经之路,是无数人投入数百小时甚至上千小时去重复练习的“标准动作”…

2026/8/16 5:11:27 阅读更多 →
DM数据库触发器深度解析:从原理到实战的完整指南

DM数据库触发器深度解析:从原理到实战的完整指南

一、DM数据库触发器基础概念 1.1 触发器的定义与核心价值 DM数据库触发器是一种与表或视图关联的特殊存储过程,当对表执行INSERT、UPDATE或DELETE操作时自动触发执行。触发器无需手动调用,能够帮助开发者实现复杂的业务规则强制执行、数据变更审计以及数…

2026/8/16 5:11:27 阅读更多 →

最新新闻

Minecraft版本全解析:Java版与基岩版核心差异、版本号逻辑与实战选择指南

Minecraft版本全解析:Java版与基岩版核心差异、版本号逻辑与实战选择指南

1. 项目概述:为什么我们需要理清Minecraft的版本脉络?如果你是一名Minecraft玩家,无论是刚入坑的新手,还是玩了多年的老鸟,大概率都曾对它的版本号感到过困惑。打开启动器,你可能会看到“Java版”、“基岩版…

2026/8/16 5:54:49 阅读更多 →
STM32F103入门实战:从开发环境搭建到GPIO、串口、定时器核心外设精讲

STM32F103入门实战:从开发环境搭建到GPIO、串口、定时器核心外设精讲

1. 从零开始:为什么STM32F10x是嵌入式入门的绝佳选择如果你刚刚接触单片机,或者从51、Arduino这类平台过来,准备踏入“32位机”的世界,那么STM32F10x系列几乎是你绕不开的第一站。我当年也是从这个系列入手的,它就像嵌…

2026/8/16 5:54:49 阅读更多 →
ESP32智能小车实战:从零搭建循迹避障跟随机器人

ESP32智能小车实战:从零搭建循迹避障跟随机器人

这次我们来看一个基于 ESP32 的智能小车项目,它集成了循迹、避障和跟随三大核心功能。这个项目不是停留在概念阶段,而是可以直接动手搭建、烧录代码并跑起来的完整方案。对于想学习嵌入式开发、机器人控制或物联网应用的朋友来说,这是一个非常…

2026/8/16 5:54:49 阅读更多 →
OpenClaw开源机器人框架:架构、社区治理与可持续实践深度解析

OpenClaw开源机器人框架:架构、社区治理与可持续实践深度解析

1. 项目概述:OpenClaw 自我研究报告的诞生与价值最近,清华大学发布了一份名为《OpenClaw 自我研究报告 2026》的文档,在技术圈和开源社区里引起了不小的讨论。这份报告之所以引人注目,是因为它并非一个传统的学术论文或产品发布&a…

2026/8/16 5:54:49 阅读更多 →
AI Coding 时代,我们缺的不是更强的模型,而是让 Agent 站稳的「地形」

AI Coding 时代,我们缺的不是更强的模型,而是让 Agent 站稳的「地形」

⭐ Terrain 开源地址:https://github.com/sopaco/terrain(MIT License) 给 AI Agent 铺好「地图 道路 路标」的高性能工程环境开源方案,欢迎 Star / Issue 过去两年,我们见证了 AI 编程从「帮我写个函数」进化到「接…

2026/8/16 5:54:49 阅读更多 →
AI智能办公助手:从工具到伙伴的架构解析与应用实践

AI智能办公助手:从工具到伙伴的架构解析与应用实践

1. 从“工具”到“伙伴”:AI智能办公助手的价值跃迁最近在团队内部做技术分享,聊到AI在办公场景的落地,大家讨论最多的还是ChatGPT、Copilot这类通用聊天或代码补全工具。但一个很现实的问题是:这些工具虽然强大,却像一…

2026/8/16 5:53:49 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →