type
status
date
slug
summary
tags
category
icon
password
书籍
在Ansible中,使用循环(loop)可以简化任务编写,避免重复代码。以下是对你提供内容的整理,介绍如何使用简单循环来迭代项目列表。

数据结构

1. 单纯列表(List)

  • 访问方式: 使用 loop 结合 item
  • 示例:

    2. 字典(Dictionary)

    • 访问方式: 直接使用字典名和键
    • 示例:

      3. 多组字典的列表(List of Dictionaries)

      • 访问方式: 使用 loop 结合 item 和键
      • 示例:

        总结

        • 单纯列表: 使用 loopitem 来遍历每个元素。
        • 字典: 直接通过字典名和键来访问特定的值。
        • 多组字典的列表: 使用 loopitem 来遍历每个字典,并使用 item.键 来访问其中的值。
        这种方式使得处理不同类型的数据结构在 Ansible 中变得更加灵活和方便。

        利用循环迭代任务

        1. 确保服务正在运行

        使用循环可以避免为每个服务编写多个任务。可以通过定义一个包含所有服务的列表,来编写一个任务来确保这些服务都在运行。
        示例代码:
        在这个示例中,我们定义了一个变量 mail_services,它包含两个服务:postfixdovecot。然后,通过 loop 关键字迭代这个列表,确保每个服务都处于运行状态。

        2. 循环字典列表

        循环不仅限于简单的值列表,也可以处理字典列表。在以下示例中,列表中的每一项都是一个字典,包含两个键:namegroups
        示例代码:
        在这个示例中,我们定义了一个包含用户信息的字典列表。通过 loop 关键字,我们可以确保用户 janejoe 存在于指定的用户组中。
        在较早版本的Ansible中,循环关键字(如 with_itemswith_file)被广泛使用。尽管在Ansible 2.5及更高版本中引入了统一的 loop 关键字,但了解这些早期语法仍然很重要。以下是对较早样式的Ansible循环的整理和描述:

        较早样式的Ansible循环关键字

        1. with_items

        • 描述:用于迭代简单列表,例如字符列表或字符串列表。与 loop 的使用类似,with_items 也会将列表平化,并在每次迭代中将当前列表项保存到 item 变量中。
        示例代码:
        在这个示例中,with_items 用于迭代 data 列表中的每个用户,并输出每个用户的名字。

        2. with_file

        • 描述:用于迭代文件列表。在每次迭代中,item 变量将保存列表中对应文件的内容。
        示例代码:

        3. with_sequence

        • 描述:用于生成数字序列。可以接收参数以指定序列的起始值、结束值和步长。在每次迭代中,item 变量会保存生成序列中的某个值。
        示例代码:
        在这个示例中,with_sequence 生成从1到5的序列,并在每次迭代中输出当前的值。

        重要提示

        • 从Ansible 2.5开始,建议使用 loop 关键字来替代 with_itemswith_filewith_sequence。尽管如此,了解这些早期的语法依然很重要,以便在维护旧剧本时能够理解其逻辑。
        通过掌握这些循环关键字,您可以在Ansible剧本中有效地处理重复性任务。
        以下是对你提供的内容的整理,说明如何在Ansible中使用 registerloop 结合来存储循环任务的结果。

        使用 registerloop 结合

        在Ansible中,您可以使用 register 关键字来存储任务的输出结果,并通过 loop 对多个项目进行迭代。以下是一个示例剧本,展示了如何实现这一点。

        示例剧本:loop_register.yml

        运行示例

        您可以通过以下命令运行剧本:

        运行输出示例

        运行该剧本后,输出结果将显示如下:

        解释

        1. 注册结果:通过 register: echo_results,任务的输出结果被存储在 echo_results 变量中。
        1. 循环输出:在 Looping Echo Task 中,使用 looponetwo 进行迭代,执行 echo 命令。
        1. 调试输出Show echo_results variable 任务通过 ansible.builtin.debug 模块显示 echo_results 变量的内容,包括每次迭代的命令和状态。
        通过这种方式,您可以轻松地捕获并利用循环任务的结果,便于后续操作和调试。
        你的新示例 new_loop_register.yml 使用了 register 来存储循环任务的结果,并在后续任务中使用了这个结果。以下是对这个示例的详细解释以及与之前示例的区别。

        新示例解释:new_loop_register.yml

        关键区别

        1. 输出处理
            • 在这个新示例中,第二个任务 Show stdout from the previous task. 使用 loop 遍历 echo_results['results'],这意味着它将对之前的每个循环结果进行迭代,并打印每个结果的 stdout
            • 原示例中的第二个任务是直接显示 echo_results 变量的整个内容,而这个新示例则是针对每个结果的 stdout 进行输出。
        1. 格式化和引用
            • 在新示例中,使用了 {{ item['stdout'] }} 来获取每个结果的标准输出,这是针对循环结果中特定字段的引用。
            • 原示例中的 msg 是输出整个 echo_results 变量,未针对特定输出进行格式化。

        运行效果

        • 新示例输出将会更加细化,具体地展示每个迭代的标准输出,而不是整个结果的结构。
        • 这使得在调试和输出结果时更加清晰易读,尤其是在需要处理多个结果的场景中。

        总结

        新示例展示了如何利用注册的结果进行进一步的处理和展示,适用于需要从多个任务结果中提取特定信息的场景。这种方法使得剧本更加灵活且具有可读性。
         
         
        ansible_facts 是 Ansible 收集的关于远程主机的详细信息和系统状态的字典。它包括了操作系统、网络接口、硬件配置等多种系统信息。ansible_facts 的结构可以用树状图来表示,它由多个键值对组成,每个键代表一个类别或子类别的系统信息。以下是一个典型的 ansible_facts 树结构的表示法:
        这是一个简化的树状结构表示法。ansible_facts 的内容会根据具体的系统配置有所不同,但基本上会包含上述类别信息。

        使用 Ansible 条件语句实现有条件地运行任务

        Ansible 是一个强大的自动化工具,能够在不同的条件下有选择地执行任务。条件语句(Conditionals)允许我们根据特定变量、系统状态或外部命令的输出结果,控制任务的执行。在本文中,我们将详细介绍如何在 Ansible Playbook 中使用条件语句,以及一些实际应用场景。

        1. 基本布尔条件

        在 Ansible 中,可以通过布尔变量控制任务的执行。下面是一个简单的示例:
        目的: 根据布尔值 run_my_task 的值来决定是否执行 httpd 安装任务。设置为 true 执行,设置为 false 则跳过。

        2. 变量比较

        通过比较变量的值,可以控制任务是否执行。以下是一些常见的条件运算符:
        操作
        示例
        等于
        ansible_facts['machine'] == "x86_64"
        小于
        min_memory < 128
        大于
        min_memory > 256
        小于等于
        min_memory <= 256
        大于等于
        min_memory >= 512
        不等于
        min_memory != 512
        变量存在
        min_memory is defined
        变量不存在
        min_memory is not defined
        示例:使用变量比较来控制任务执行。
        目的: 先通过 free -m 获取内存信息,然后根据内存是否大于等于指定的 min_memory 来决定是否安装 httpd

        3. 命令输出评估

        可以通过捕获命令的输出,并根据返回的结果来决定是否执行后续任务。
        目的: 通过命令检查程序是否安装,根据命令返回码 (rc),决定是否继续执行任务。

        4. 评估 CPU 数量

        有时,我们需要根据受管主机的硬件资源来决定是否执行某些任务。以下是如何基于 CPU 数量来控制任务的执行:
        目的: 通过 nproc 获取 CPU 核心数,只有当 CPU 数量达到要求时,才会执行 Web 服务的部署。

        5. 组合条件语句

        有时需要同时检查多个条件,Ansible 支持使用 andor 来组合条件。
        • OR 条件:只要其中一个条件为真,任务就会执行。
        • AND 条件:所有条件必须为真,任务才会执行。
        • 组合 AND 和 OR 条件:使用括号分组复杂条件。
        目的: 根据多个条件组合来决定任务执行,确保满足特定操作系统和版本的任务条件。

        6. 循环和条件的结合

        Ansible 允许将循环和条件结合使用。以下示例展示了如何在循环中应用条件语句:
        目的: 通过循环检查每个挂载点,只有在根目录有足够可用空间时,才会安装 MariaDB。

        7. 结合条件控制服务状态

        以下示例展示了如何根据服务的状态来有条件地执行任务:
        目的: 只有当 Postfix 服务正在运行时,才会重启 HTTPD 服务。

        总结

        Ansible 的条件语句为任务的有条件执行提供了极大的灵活性。通过使用 ansible_facts 提供的变量比较、命令输出评估、布尔变量、组合条件等方式,可以根据受管主机的状态动态决定是否运行某些任务。这些特性使得 Ansible Playbook 更加高效和智能,满足复杂的自动化需求。

        练习:

        以下是加上了备注说明目的的整理版Ansible Playbook:

        1. inventory 文件

        备注:
        • database_devdatabase_prod 定义了开发和生产环境的主机组,分别对应不同的服务器。这些主机将根据不同的任务来执行操作。

        2. playbook.yml 文件


        3. 运行Playbook的命令

        1. 首先,进入 control-flow 目录:
          1. 使用 ansible-navigator 运行 Playbook:

            4. 文件和任务详细说明

            inventory 文件

            • inventory 文件用于定义环境中的主机列表。database_dev 是开发环境的主机组,而 database_prod 是生产环境的主机组。Ansible 会根据主机组不同,在各自的环境中执行不同的任务。

            playbook.yml 文件

            1. 开发环境任务
                • 安装MariaDB软件包:通过 dnf 模块安装 mariadb-serverpython3-PyMySQL。这些包是 MariaDB 数据库和 Python MySQL 接口的必要组件。
                • 启动MariaDB服务:确保 MariaDB 服务启动并设置为开机自启。这样可以在服务器启动时自动启用数据库服务。
            1. 生产环境任务
                • 与开发环境相似的任务,但安装 MariaDB 包的任务有附加条件:仅当操作系统为 RedHat 时才会执行。这个条件确保只有在正确的操作系统下执行安装操作,避免在不兼容的系统上执行无效操作。
                • 启动MariaDB服务:同样确保 MariaDB 服务已启动并设置为开机自启,确保数据库服务在生产环境下始终可用。
             
             
            相关文章
            RHCE 9版本考试资料
            Lazy loaded image
            40.总复习-4 实验手册:galaxy角色配置与部署
            Lazy loaded image
            39.总复习-3 实验手册:配置 RHEL 系统角色和用户管理
            Lazy loaded image
            38.总复习-2 实验手册:Ansible Web 服务器配置和测试
            Lazy loaded image
            37.总复习-1 实验手册:配置和运行Ansible脚本
            Lazy loaded image
            36:总复习
            Lazy loaded image
            12:实施任务控制-2 实施处理程序10:管理变量和事实-4 开放实验
            Loading...
            みなみ
            みなみ
            一个普通的干饭人🍚
            最新发布
            第1回:イントロダクション
            2025-4-21
            TOKYO自習島
            2025-4-21
            第1回:イントロダクション
            2025-4-18
            第1回:オリエンテーション/意思決定と会計情報
            2025-4-18
            建物業法の基本と免許-59問
            2025-4-10
            宅建士过去问速刷:小南小白陪你拿证-001
            2025-4-7
            公告

            🎉 欢迎访问我的博客 🎉

            🙏 感谢您的支持 🙏

            📅 本站自 2024年9月1日 建立,致力于分享我在 IT・MBA・不动产中介 等领域的学习与实践经验,并推动 线上线下学习会 的自主开展。

            📚 主要内容

            💻 IT・系统与开发

            • 系统管理:Red Hat 等
            • 容器与编排:Kubernetes、OpenShift
            • 云计算:AWS、IBM Cloud
            • AI 入门:人工智能基础与实践
            • 技术笔记与考证经验

            🏠 不动产 × 宅建士

            • 宅建士考试笔记

            🎓 MBA 学习笔记

            • 管理学、经济学、财务分析等

            🔍 快速查找内容(标签分类)

            由于网站目前没有专门的设计,可能会导致查找信息不便。为了更快找到你感兴趣的内容,推荐使用以下标签功能 进行搜索!
            📌 定期更新,欢迎常来看看!
            📬 有任何建议或想法,也欢迎留言交流!