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

Ansible Playbook使用案例

Ansible Loop 循环

Ansible 的loop循环功能允许您对一组数据项重复执行同一任务,从而简化批量操作。本节将通过创建用户账户的实例,演示loop的基本用法及其进阶应用。

1. 1 基础循环:创建用户

以下 Playbook 使用loop在目标主机组db上创建两个用户(user1user2):

--- - hosts: db tasks: - name: Add the users ansible.builtin.user: name: "{{ item }}" state: present loop: - user1 - user2

1.2 进阶循环:创建用户并设置密码

若需为每个用户设置密码,可将循环项改为字典列表,通过item.useritem.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 验证用户创建结果

执行完成后,可通过以下命令验证用户是否成功创建并查看密码哈希:

[root@host1 ~]# cat /etc/shadow

同时检查/home目录下是否已生成对应的用户家目录:

[root@host1 ~]# cd /home/ [root@host1 home]# ls kyy user1 user2 [root@host1 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 user2

1.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 登录新创建的用户账户,确认账户可正常使用:

继续验证一下 [root@server2 ~]# cd /home/ [root@server2 home]# ls kyy user1 user2 [root@server2 home]# cd user1/ [root@server2 user1]# ll total 0 [root@server2 user1]# ssh user1@localhost The authenticity of host 'localhost (::1)' can't be established. ED25519 key fingerprint is SHA256:0Hrk3R+1SBGwunSQd57OJRVNVRibsQASR8UfHIS121c. 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. user1@localhost's password: [user1@server2 ~]$ pwd /home/user1 [user1@server2 ~]$ ll -d /home/user1 drwx------. 2 user1 user1 62 Aug 15 18:07 /home/user1

tags

在 Ansible 中,tags(标签)是一个强大的功能,它允许您为 playbook 中的任务(task)或整个 play 打上标记,从而在执行时可以选择性地运行特定部分,而不是运行整个 playbook。这在大型、复杂的自动化场景中尤其有用,可以显著提高执行效率和灵活性。

tags 的核心概念与用途

主要用途包括:

  • 选择性执行:只运行带有特定标签的任务,跳过其他任务。

  • 环境适配:为开发、测试、生产环境定义不同的标签,按需执行。

  • 功能模块化:将 playbook 按功能(如“安装”、“配置”、“启动”)划分标签,便于维护和调试。

  • 跳过已知问题:临时跳过某些可能失败或不需要的任务。

[kyy@server1 ansible]$ vim test.yml [kyy@server1 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 是错误处理机制的关键组成部分,通常与blockalways结合使用,构成一个完整的异常处理结构。当block中的任务执行失败时,Ansible 会跳过该block内剩余的任务,转而执行rescue部分,用于捕获错误、记录日志或执行恢复操作。无论blockrescue的执行结果如何,always部分都会被执行,常用于清理资源或发送通知。

3.1 基本语法与结构

一个典型的blockrescuealways组合结构如下所示:

  • 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 中,hostvarsgroups是两个强大的“魔法变量”,它们提供了在 Playbook 执行期间动态访问主机信息和主机组结构的能力。本节将通过一个配置/etc/hosts文件的实例,演示如何结合使用这两个变量。

5.1 准备主机清单

首先,在 Ansible 的主机清单文件(hosts)中定义一个主机组[webservers],并添加若干成员:

[kyy@server1 ansible]$ vim hosts # 添加以下组 [webservers] server1 server2 host1

2. 创建模板任务 Playbook

编写一个 Playbook(group.yml),使用template模块将 Jinja2 模板渲染到目标主机的/etc/hosts文件:

--- - hosts: webservers tasks: - name: test ansible.builtin.template: src: test.j2 dest: /etc/hosts

5.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 的核心技巧之一。

http://www.jsqmd.com/news/1402704/

相关文章:

  • 从OpenClaw看AI Agent架构:任务规划、工具调用与自主执行
  • IntelliJ IDEA自动导包与优化导入配置全解析
  • 2026年全球高分子材料行业:研发专用丙烯酸应用价值解析分享
  • AI漫剧后处理全链路工程实战:防抖补帧、色彩统一、超分修复、成片压制完整代码方案
  • 电赛平衡车循迹控制:从PID算法到STM32嵌入式系统实现
  • 漫剧带货脚本怎么写?知漫剧剧情植入教程
  • Windows激活错误0xC004C003:许可证验证失败的系统性排查与修复指南
  • SSH 认证代理:ssh‑agent 命令完整详解(密钥代理管理实战)
  • Epoll模型
  • 个人微信API如何改变传统微信应用?4个技术优势让开发效率翻倍
  • Cursor 起草 + GPT 终审:省下 60% 成本后,我连夜关了回灌机制
  • 2026年评价高的GEO关键词优化服务商推荐,行业全景分析 - 工业设备
  • DB2存储过程SQLSTATE 22018错误:数据类型转换失败的系统排查与解决方案
  • WPS打不出英文引号?从输入法到系统设置的完整排查指南
  • 从零打造双核智能车:STM32+ESP32-S3硬件设计与固件开发全攻略
  • 深入解析AXI事务属性:缓存、保护与QoS配置实战指南
  • 基于腾讯云ClawPro构建企业级微信AI助手:从架构设计到实战部署
  • 自产自装景观亭厂家的优势分析
  • 缓存剔除算法 (LRU / LFU / ARC / LIRS) 深度剖析
  • 三星SCX-3406W无线打印配置全攻略:从网络连接到多设备打印
  • 自动化的暑假记录
  • 2026铁氟龙高温布十大热门厂家真实横评,选定再拍不交智商税 - 工业设备
  • DM数据库触发器深度解析:从原理到实战的完整指南
  • 论文AI率过高问题及DeepSeek降AI率实战方案
  • 低成本构建AI数据分析系统:DeepSeek V4与Codex集成实战指南
  • 虚拟键值表系统:从输入事件到业务逻辑的解耦实践
  • 从模型幻觉到工程实践:构建生产级大语言模型Prompt的完整指南
  • IBM Storwize V7000后台命令全解析:从基础操作到自动化运维实战
  • 【一个小游戏教你拿捏面向对象】
  • 《骑马与砍杀2》DLL文件修改指南:从反编译到实战,轻松调整游戏核心机制