在本地添加模块和插件

您可以通过添加自定义模块或插件来扩展 Ansible。您可以从头开始创建它们,也可以复制现有的模块或插件以供本地使用。您可以将本地模块或插件存储在 Ansible 控制节点上,并与您的团队或组织共享。您还可以通过将插件和模块包含在集合中,然后将集合发布到 Ansible Galaxy 来共享它们。

如果您正在使用本地模块或插件,但 Ansible 找不到它,那么本页就是您需要的全部内容。

如果您想创建一个插件或模块,请参阅 开发插件开发模块开发集合.

使用本地模块和插件扩展 Ansible 提供了一些快捷方式,例如

  • 您可以复制其他人的模块和插件。

  • 在编写新模块时,您可以选择任何您喜欢的编程语言。

  • 您不必克隆任何存储库。

  • 您不必打开拉取请求。

  • 您不必添加测试(尽管我们建议您这样做!)。

模块和插件:有什么区别?

如果您想为 Ansible 添加功能,您可能想知道您需要一个模块还是一个插件。以下是一些简要概述,帮助您了解您需要什么

  • 插件 扩展了 Ansible 的核心功能。大多数插件类型在控制节点上的 /usr/bin/ansible 进程内执行。插件为 Ansible 的核心功能提供选项和扩展:转换数据、记录输出、连接到库存等等。

  • 模块是一种在“目标”(通常是远程系统)上执行自动化任务的插件类型。模块作为独立脚本运行,Ansible 在控制节点之外的自己的进程中执行这些脚本。模块主要通过 JSON 与 Ansible 交互,接受参数并通过在退出之前将 JSON 字符串打印到标准输出返回信息。与其他插件(必须用 Python 编写)不同,模块可以使用任何语言编写;尽管 Ansible 仅提供 Python 和 Powershell 中的模块。

在集合中添加模块和插件

您可以通过 创建集合 来添加模块和插件。使用集合,您可以在任何剧本或角色中使用自定义模块和插件。您可以随时通过 Ansible Galaxy 轻松地共享您的集合。

本页面的其余部分介绍了使用本地独立模块或插件的其他方法。

在集合之外添加模块或插件

您可以配置 Ansible 以在特定位置加载独立的本地模块或插件,并使它们可用于所有剧本和角色(使用配置的路径)。或者,您可以使非集合的本地模块或插件仅对某些剧本或角色可用(使用相邻路径)。

为所有剧本和角色添加独立的本地模块

要自动加载独立的本地模块并使它们可用于所有剧本和角色,请使用 DEFAULT_MODULE_PATH 配置设置或 ANSIBLE_LIBRARY 环境变量。配置设置和环境变量采用冒号分隔的列表,类似于 $PATH。您有两个选择

  • 将您的独立本地模块添加到一个默认配置位置。有关详细信息,请参阅 DEFAULT_MODULE_PATH 配置设置。默认位置可能会在未经通知的情况下更改。

  • 将您的独立本地模块的位置添加到环境变量或配置中

要查看您当前的模块配置设置

ansible-config dump |grep DEFAULT_MODULE_PATH

将您的模块文件保存在这些位置之一后,Ansible 将加载它,您可以在任何本地任务、剧本或角色中使用它。

要确认 my_local_module 可用

  • 键入 ansible localhost -m my_local_module 以查看该模块的输出,或者

  • 键入 ansible-doc -t module my_local_module 以查看该模块的文档

注意

这适用于所有插件类型,但需要对每种插件类型进行特定配置和/或相邻目录,请参见下文。

注意

ansible-doc 命令可以从用 Python 或相邻 YAML 文件编写的模块中解析模块文档。如果您使用除 Python 之外的编程语言编写了一个模块,那么您应该在与模块文件相邻的 Python 或 YAML 文件中编写文档。 相邻的 YAML 文档文件

为选定的剧本或单个角色添加独立的本地模块

Ansible 会自动加载来自您剧本或角色相邻的特定目录中的所有可执行文件,作为模块。这些位置的独立模块仅对父目录中的特定剧本、剧本或角色可用。

  • 要仅在选定的剧本或剧本中使用独立模块,请将模块存储在包含剧本或剧本的目录中的名为 library 的子目录中。

  • 要仅在单个角色中使用独立模块,请将模块存储在该角色中的名为 library 的子目录中。

注意

这适用于所有插件类型,但需要对每种插件类型进行特定配置和/或相邻目录,请参见下文。

警告

包含在集合中的角色不能包含任何模块或其他插件。集合中的所有插件都必须位于集合 plugins 目录树中。该树中的所有插件都可用于集合中的所有角色。如果您正在开发新的模块,我们建议您在 集合 中分发它们,而不是在角色中分发它们。

在集合之外在本地添加非模块插件

您可以配置 Ansible 以在指定位置加载独立的本地插件,并使它们可用于所有剧本和角色。或者,您可以使独立的本地插件仅对特定剧本或角色可用。

注意

虽然模块是插件,但适用于其他插件类型的目录名称和环境变量的命名模式不适用于模块。请参阅 在集合之外添加模块或插件.

为所有剧本和角色添加本地非模块插件

要自动加载独立的本地插件并使其可用于所有剧本和角色,请使用配置文件设置或环境变量来指定要添加的插件类型。这些配置文件设置和环境变量采用冒号分隔的列表,类似于 $PATH。您有两个选择

  • 将您的本地插件添加到一个默认配置的位置中。有关插件类型的正确配置设置的详细信息,请参见 配置设置。默认位置可能会在未经通知的情况下发生变化。

  • 将您的本地插件的位置添加到环境变量或配置中
    • 相关的 ANSIBLE_plugin_type_PLUGINS 环境变量 - 例如,$ANSIBLE_INVENTORY_PLUGINS$ANSIBLE_VARS_PLUGINS

    • 相关的 plugin_type_PATH 配置设置,其中大多数以 DEFAULT_ 开头 - 例如,DEFAULT_CALLBACK_PLUGIN_PATHDEFAULT_FILTER_PLUGIN_PATHBECOME_PLUGIN_PATH

要查看您当前的非模块插件配置设置

ansible-config dump |grep plugin_type_PATH

在将您的插件文件添加到这些位置之一后,Ansible 会加载它,您可以在任何本地模块、任务、剧本或角色中使用它。有关环境变量和配置设置的更多信息,请参见 Ansible 配置设置

要确认 plugins/plugin_type/my_local_plugin 是否可用

  • 键入 ansible-doc -t <plugin_type> my_local_lookup_plugin 以查看该插件的文档 - 例如,ansible-doc -t lookup my_local_lookup_plugin

ansible-doc 命令适用于大多数插件类型,但不适用于 action、filter 或 test 插件。有关更多详细信息,请参见 ansible-doc

为选定的剧本或单个角色添加独立的本地插件

Ansible 会自动加载您剧本或角色相邻的某些目录中的所有插件,从名为插件类型的目录中分别加载每种类型的插件。这些位置中的独立插件仅对父目录中的特定剧本、剧本或角色可用。

  • 要仅在选定的剧本或剧本中使用独立插件,请将插件存储在包含剧本的目录中的正确 plugin_type 子目录中(例如,callback_pluginsinventory_plugins)。这些目录必须使用 _plugins 后缀。有关插件类型的完整列表,请参见 使用插件

  • 要仅在单个角色中使用独立插件,请将插件存储在该角色内的正确 plugin_type 子目录中(例如,cache_pluginsstrategy_plugins)。当作为角色的一部分交付时,该插件会在角色执行后立即可用。这些目录必须使用 _plugins 后缀。有关插件类型的完整列表,请参见 使用插件

警告

包含在集合中的角色不能包含任何插件。集合中的所有插件必须位于集合的 plugins 目录树中。该树中的所有插件都可用于集合中的所有角色。如果您正在开发新的插件,我们建议将它们分发到 集合 中,而不是角色中。

警告

某些插件类型在 Ansible 执行的早期阶段需要,例如回调、清单和缓存。这些插件类型不能动态加载,必须存在于配置路径中或在配置中被 FQCN 引用。

使用 ansible.legacy 访问 ansible.builtin 模块的自定义版本

如果您需要覆盖 ansible.builtin 模块之一并且正在使用 FQCN,则需要在完全限定的集合名称 (FQCN) 中使用 ansible.legacy。例如,如果您拥有自己的 copy 模块,您将像 ansible.legacy.copy 那样访问它。有关如何将自定义模块与集合中的角色一起使用的详细信息,请参见 使用 ansible.legacy 从基于集合的角色访问本地自定义模块