在本地添加模块和插件

你可以通过添加自定义模块或插件来扩展 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 命令适用于大多数插件类型,但不适用于操作、过滤器或测试插件。有关更多详细信息,请参阅 ansible-doc

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

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

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

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

警告:

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

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

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