Ansible 的插件系统是一个核心组件,通过模块化、可插拔的代码提供扩展性。本页面解释了 Ansible 的插件架构如何工作,包括发现机制、加载过程和路由系统,这些系统允许插件被找到和执行。
有关模块等特定插件实现的信息,请参阅 模块系统。
Ansible 的插件系统通过为各种功能类型提供接口来实现可扩展性。插件是集成了 Ansible 核心的专用 Python 类,以定义明确的方式扩展其功能。
来源: lib/ansible/config/ansible_builtin_runtime.yml lib/ansible/plugins/lookup/template.py
Ansible 通过按特定顺序搜索预定义的一组目录来发现插件。这包括内置插件目录和用户定义的插件路径。
来源: lib/ansible/config/ansible_builtin_runtime.yml3-7 lib/ansible/plugins/lookup/template.py115-117
插件路由系统定义在 ansible_builtin_runtime.yml 中,它允许插件从一个位置重定向到另一个位置。这对于以下情况尤其重要:
路由配置将插件名称映射到其实际实现
plugin_routing:
connection:
redirected_local:
redirect: ansible.builtin.local
podman:
redirect: containers.podman.podman
modules:
formerly_core_ping:
redirect: testns.testcoll.ping
来源: lib/ansible/config/ansible_builtin_runtime.yml3-93
Ansible 包含多种插件类型,每种插件在架构中都有特定的用途
| 插件类型 | 目的 | 示例 |
|---|---|---|
| 操作 | 控制模块的执行流程 | template, copy, file |
| 连接 | 管理到目标主机的连接 | ssh, winrm, local |
| 过滤器 | 在模板中转换数据 | to_yaml, to_json, ipaddr |
| Lookup(查找) | 从外部源检索数据 | file, env, pipe, template |
| 模块 | 实现任务功能 | command, apt, yum, service |
| 策略 | 控制跨主机的任务执行 | linear, free, debug |
| 缓存 | 存储和检索缓存数据 | jsonfile, memory, redis |
| 模板 | 处理模板操作 | Jinja2 模板 |
来源: lib/ansible/plugins/lookup/template.py7-101 lib/ansible/plugins/cache/jsonfile.py7-41 lib/ansible/plugins/doc_fragments/template_common.py12-120
模板系统是插件的关键集成点,因为许多插件需要处理模板或使用模板化数据。 Templar 类提供了模板操作的接口
插件可以通过以下关键方法访问模板功能
template():递归处理模板evaluate_expression():评估可信表达式resolve_variable_expression():安全地解析变量引用来源: lib/ansible/template/__init__.py39-326 lib/ansible/plugins/lookup/template.py116-174
模板查找插件展示了插件如何与 Ansible 的核心系统集成
模板查找插件的关键点
来源: lib/ansible/plugins/lookup/template.py114-178
模板 Action 插件之类的 Action 插件展示了模板如何与任务执行集成
这种架构确保了模板渲染和文件操作之间的清晰分离。
来源: lib/ansible/plugins/action/template.py31-177
Cache 插件展示了更简单的插件结构
这个 JSON 文件缓存插件展示了缓存插件所需的最小接口:加载和存储数据的方法。
来源: lib/ansible/plugins/cache/jsonfile.py49-56
插件经常与 Ansible 的条件评估系统进行交互。 Conditional 类提供了条件执行的基础功能
插件可以使用条件根据变量值或表达式评估来控制其执行。
来源: lib/ansible/playbook/conditional.py26-39
开发自定义 Ansible 插件时,请遵循以下指南
所有插件都应遵循 Ansible 的编码标准,并设计为与未来 Ansible 版本兼容。
Ansible 的插件系统提供了一个灵活、可扩展的架构来添加功能。插件加载、路由和发现机制协同工作,支持丰富的内置和社区开发的插件生态系统。模板是许多插件的关键集成点,而模块化设计允许 Ansible 的功能不断演进。