什么是 Ansible 模块?它是如何运作的?

复制 URL

Ansible® 模块是一个用于在本地计算机、应用编程接口(API)或远程主机上执行操作的小型程序。模块通常以 Python 代码的形式表示,并且会包含一些元数据,这些元数据定义了在何时、何处执行特定自动化任务以及哪些用户可以执行相应任务。Ansible 自动化中心Ansible Galaxy 等存储库中有数千个 Ansible 模块可供下载,不过,您也可以自己创建自定义模块,并与企业内或更大的 Ansible 社区中的其他 Ansible 用户共享。

模块可执行各种用例所需的 IT 功能,其中包括网络连接、置备、安全防护、云管理、用户管理、配置管理和通信。想要理解 Ansible 模块如何帮助您实现这些用例及其他用例的自动化,首先要了解模块与 Ansible 自动化的其他关键组件(包括任务、play、playbook 和角色)之间的关系。

  • 任务:定义要应用于托管主机的操作,但不会指定要应用于的主机。您可以在任务中调用模块来在某个主机上执行操作,但主机需要在任务之外、更高层次的 play 级别指定。
  • Play:作为 Ansible 执行的核心单元,play 包含一个任务列表,且将该列表映射到特定的托管主机。play 还包含变量,在更复杂的用例中,可能还包含角色。
  • Ansible Playbook包含一个或多个 play。Playbook 是用人类可读的 YAML 语言编写的,理解简单,共享方便。
  • Ansible 角色打包了 Ansible 各种内容(包括任务、处理程序、变量、插件、模板和文件),以便在 play 中使用。Ansible 角色可导入到 play 中,在其他 play 或 playbook 中重复使用,还可将其与其他自动化用户共享。
  • 内容集:捆绑的 Ansible 内容包,用于帮助自动化开发人员更快地完成工作并提高工作效率。内容集是打包和共享模块的首选方式。
  • 插件基于 Ansible 核心功能构建的代码段,通常在控制节点上执行。虽然模块是插件的一种,但它们通常是在目标位置上执行任务,而非在控制节点上执行任务。 

可以这样打比方:如果任务是需要完成的作业,模块就是实际完成这些作业所需的工具。任务用于定义需要完成的操作,模块在托管主机上执行以完成相应操作,完成后则以 JSON 格式收集返回值。

模块通常存储在 playbook 的库中,且在 playbook 执行关联任务时运行,但也可能包含在角色或内容集中。将 Ansible 角色导入 playbook 后,角色目录中的模块将执行相应角色中包含的一个或多个任务。在单个 play 中编写的模块只能使用一次,包含在角色中的模块则在每次调用 playbook 中的角色时都会执行。

以下 3 个示例模块包含在 Ansible Core 中,也是所有 Ansible 安装项的一部分:

  • dnf 模块ansible.builtin.dnf):使用 dnf 软件包管理器(Fedora 的默认软件包管理器)安装、升级和删除软件包和组。

  • 服务模块ansible.builtin.service):管理远程主机上的服务。示例操作包括但不限于启动、停止和重启服务。

  • 命令模块ansible.builtin.command):在目标位置执行命令。

如果现有 Ansible 模块不足以满足您的自动化用例,您可以创建自己的模块来完成特定作业。虽然创建模块的过程可能会因所需自动化任务的复杂程度而有所不同,但您可以通过以下方式开发自己的模块

  1. 在存储库中创建一个库目录。
  2. 在库目录中使用 Python 或您偏好的编程语言创建一个模块文件。
  3. 在库目录中开发一个用于测试的 playbook。
  4. 执行 playbook 以测试模块。

模块应简洁明了,旨在解决非常具体的问题,因此,它们易于测试、使用、重复使用和共享。模块还应提供一个定义的接口,该接口接受参数并且是幂等的,这意味着如果模块检测到节点的当前状态与预期的最终状态相匹配,则不会进行任何更改。

如果用户刚开始接触 Ansible 内容开发或希望简化模块创建过程,可以使用 Content Builder 等社区工具,该工具可为网络连接、安全防护、云内容等用例生成模块及其他 Ansible 插件。

与其他类型的 Ansible 内容一样,Ansible 模块可共享。订阅红帽® Ansible 自动化平台后,您可以将模块打包到内容集,然后将其上传至 Ansible 自动化中心,或者通过私有的自动化中心在整个企业内共享。您还可以将模块发布到 Ansible Galaxy 上,这是一个供社区用户共享 Ansible 内容的免费存储库。

模块不仅仅在 playbook 执行基础任务时发挥着至关重要的作用,对于希望采用更先进、更主动的事件驱动型自动化进行 IT 管理方式的企业,模块也派得上用场。

事件驱动型自动化将 IT 事件中的数据连接至自动化操作,减少了团队通过手动步骤来应对或修复的需要。事件是指影响服务交付或 IT 基础架构管理的任何事件。

Event-Driven Ansible 是红帽 Ansible 自动化平台的一项功能,也是面向希望利用事件驱动型自动化的自动化团队的一款综合解决方案,它使用 Ansible Rulebook 通过您定义的相应操作(包括执行 playbook、角色、模板和模块)来响应事件。Rulebook 使用有条件的“if-this-then-that”指令来帮助您自动执行日常任务,例如在出现停机时运行用于修复的 playbook。

当来自事件源的数据满足 rulebook 中定义的条件时,Ansible 自动化平台将触发您事先定义的操作,其中可能包括运行整个 playbook 或运行单个模块以执行非常具体的操作,具体响应完全取决于您希望在事件发生时执行什么操作以及您在 rulebook 中定义的操作。

下方的示例演示了在来自 webhook 源的事件满足 rulebook 中定义的条件时如何触发调试模块。

rulebook.yml

--- - name: Listen for events on a webhook hosts: all ## 定义事件源 sources: - ansible.eda.webhook: host: 0.0.0.0 port: 5000 ## 定义所寻找的条件 rules: - name: Say Hello condition: event.payload.message == "Ansible is super cool" ## 定义满足条件时应执行的操作 action: run_playbook: name: say-what.yml 

playbook say-what.yml

- hosts: localhost connection: local tasks: - debug: msg: "Thank you, my friend!" 

在本例中,rulebook 指定了在满足定义的条件时 say-what.yml playbook 执行的操作。由于调试模块包含在 say-what.yml playbook 中,因此,每次执行 playbook 时都会运行该模块。

作为 Ansible 自动化平台的一部分,Event-Driven Ansible 提供了实现快速高效的 IT 服务交付所需的事件处理功能,且无需人工干预即可完成任务,让企业有时间专注于价值更高的项目。

由于事件驱动型自动化通常依靠第三方监控工具来识别事件何时发生,因此,您可以充分利用能集成到正在使用的平台和工具的 Ansible 内容,更轻松地过渡到更高效的自动化工作流。订阅红帽 Ansible 自动化平台后,您可以访问以 Ansible 内容集的形式提供的数千个捆绑模块、角色、插件和文档。其中包括红帽 Ansible 认证内容以及由红帽及我们的合作伙伴提供的 Ansible 验证内容,所有内容均可通过 Ansible 自动化中心下载。

扩展阅读

文章

Ansible 基础知识入门

Ansible 是一种对 IT 流程自动化的工具,如置备和配置管理等流程。希望能通过这篇 Ansible 关键概念的介绍,帮助您了解 Ansible 的基础知识。

文章

什么是业务流程管理?

业务流程管理(BPM)是指对端到端业务流程进行建模、分析和优化,以实现战略业务目标。

文章

为什么选择红帽实现自动化?

红帽 Ansible 自动化平台中包含了在团队间分享自动化以及实现企业级自动化所需的各种工具。

详细了解自动化

产品

红帽的战略顾问将从大局出发,以战略性视角审视企业发展,分析您当前面临的业务挑战,并提供全面、低成本、高效益的解决方案,帮助您轻松应对各项挑战。

无论您处于自动化之旅的哪个阶段,这个实施企业级自动化的平台都能助您一臂之力

相关资源

培训

免费培训课程

Ansible 必备:轻松实现自动化之技术概览

免费培训课程

针对 SAP 的红帽 Ansible 自动化