概述
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 模块
如果现有 Ansible 模块不足以满足您的自动化用例,您可以创建自己的模块来完成特定作业。虽然创建模块的过程可能会因所需自动化任务的复杂程度而有所不同,但您可以通过以下方式开发自己的模块:
- 在存储库中创建一个库目录。
- 在库目录中使用 Python 或您偏好的编程语言创建一个模块文件。
- 在库目录中开发一个用于测试的 playbook。
- 执行 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 ## Define our source for events sources: - ansible.eda.webhook: host: 0.0.0.0 port: 5000 ## Define the conditions we are looking for rules: - name: Say Hello condition: event.payload.message == "Ansible is super cool" ## Define the action we should take should the condition be met 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 自动化中心下载。
红帽官方博客
获取有关我们的客户、合作伙伴和社区生态系统的最新信息。