集合结构
集合是一种简单的 数据结构。 除非你拥有属于其中某个目录的特定内容,否则这些目录都不需要。 集合在集合的根级别需要一个 galaxy.yml
文件。 此文件包含 Galaxy 和其他工具打包、构建和发布集合所需的所有元数据。
集合目录和文件
集合可以包含这些目录和文件
collection/
├── docs/
├── galaxy.yml
├── meta/
│ └── runtime.yml
├── plugins/
│ ├── modules/
│ │ └── module1.py
│ ├── inventory/
│ └── .../
├── README.md
├── roles/
│ ├── role1/
│ ├── role2/
│ └── .../
├── playbooks/
│ ├── files/
│ ├── vars/
│ ├── templates/
│ └── tasks/
└── tests/
注意
Ansible 仅接受
.md
扩展名作为README
文件和/docs
文件夹中的任何文件。有关集合结构的示例,请参阅 ansible-collections GitHub 组织。
并非所有目录都已投入使用。 这些是为将来功能保留的占位符。
galaxy.yml
集合必须包含一个 galaxy.yml
文件,该文件包含构建集合工件所需的信息。 有关详细信息,请参阅 集合 Galaxy 元数据结构。
docs 目录
使用 docs
文件夹来描述如何使用集合提供的角色和插件、角色需求等。
对于经过认证的集合,自动化中心会显示在主 docs
目录中没有子目录的以 Markdown 编写的文档。 不会将此文档发布到 docs.ansible.com。
对于包含在 Ansible PyPI 包中的社区集合,docs.ansible.com 会显示以 reStructuredText (.rst) 编写的文档,这些文档位于 docsite/rst/ 子目录中。 在 docs/docsite/extra-docs.yml
中定义额外文档的结构
---
sections:
- title: Scenario Guide
toctree:
- scenario_guide
集合文档的索引页面会显示你在 docs/docsite/extra-docs.yml
中定义的标题,并链接到你的额外文档。 例如,请参阅 community.docker 集合仓库 和 community.docker 集合文档。
你可以使用 docs/docsite/links.yml
文件向集合索引页面和插件页面添加更多链接。 这会在 描述和通信 标题下填充链接,并在各个插件页面的末尾添加链接。 有关此文件结构和用法的完整描述,请参阅 collection_template links.yml 文件。
插件和模块文档
将插件和模块的具体文档嵌入到 Python 文档字符串中。 使用 ansible-doc
查看集合中插件的文档
ansible-doc -t lookup my_namespace.my_collection.lookup1
命令 ansible-doc
需要完全限定的集合名称 (FQCN) 来显示特定插件的文档。 在此示例中,my_namespace
是 Galaxy 命名空间,my_collection
是该命名空间中的集合名称。
注意
Ansible 集合的 Galaxy 命名空间在 galaxy.yml
文件中定义。 它可能与 GitHub 组织或仓库名称不同。
plugins 目录
在此处添加“按插件类型”划分的特定子目录,包括 module_utils
,它不仅可供模块使用,还可以通过使用它们的 FQCN 供大多数插件使用。 这是在不必须在每个剧本中导入角色的情况下分发模块、查找、过滤器等的另一种方式。
集合中的 Vars 插件不会自动加载,始终需要通过使用它们的完全限定的集合名称来显式启用。 有关详细信息,请参阅 启用 vars 插件。
集合中的缓存插件可用于事实缓存,但不支持清单插件。
module_utils
在集合中使用 module_utils
进行编码时,Python import
语句需要考虑 FQCN 以及 ansible_collections
约定。 最终的 Python 导入将类似于 from ansible_collections.{namespace}.{collection}.plugins.module_utils.{util} import {something}
以下示例片段显示了使用默认 Ansible module_utils
和集合提供的 module_utils
的 Python 和 PowerShell 模块。 在此示例中,命名空间为 community
,集合为 test_collection
。 在 Python 示例中,所讨论的 module_util
被称为 qradar
,因此 FQCN 为 community.test_collection.plugins.module_utils.qradar
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_text
from ansible.module_utils.six.moves.urllib.parse import urlencode, quote_plus
from ansible.module_utils.six.moves.urllib.error import HTTPError
from ansible_collections.community.test_collection.plugins.module_utils.qradar import QRadarRequest
argspec = dict(
name=dict(required=True, type='str'),
state=dict(choices=['present', 'absent'], required=True),
)
module = AnsibleModule(
argument_spec=argspec,
supports_check_mode=True
)
qradar_request = QRadarRequest(
module,
headers={"Content-Type": "application/json"},
not_rest_data_keys=['state']
)
请注意,从 __init__.py
文件导入某些内容需要使用文件名
from ansible_collections.namespace.collection_name.plugins.callback.__init__ import CustomBaseClass
在 PowerShell 示例中,所讨论的 module_util
被称为 hyperv
,因此 FQCN 为 community.test_collection.plugins.module_utils.hyperv
#!powershell
#AnsibleRequires -CSharpUtil Ansible.Basic
#AnsibleRequires -PowerShell ansible_collections.community.test_collection.plugins.module_utils.hyperv
$spec = @{
name = @{ required = $true; type = "str" }
state = @{ required = $true; choices = @("present", "absent") }
}
$module = [Ansible.Basic.AnsibleModule]::Create($args, $spec)
Invoke-HyperVFunction -Name $module.Params.name
$module.ExitJson()
roles 目录
集合角色与现有角色基本相同,但有一些限制
角色名称现在仅限于包含小写字母数字字符,以及
_
,并且必须以字母开头。集合中的角色不能再包含插件。 插件必须位于集合
plugins
目录树中。 每个插件都可供集合中的所有角色访问。
角色的目录名称用作角色名称。 因此,目录名称必须符合上述角色名称规则。 如果角色名称不符合这些规则,则导入 Galaxy 的集合将失败。
你可以将“传统角色”迁移到集合,但它们必须遵循上述规则。 如果它们不符合要求,你可能需要重命名角色。 你将不得不将任何基于角色的插件移至集合特定的目录,或将其链接到这些目录。
注意
对于直接从 GitHub 仓库导入到 Galaxy 的角色,在角色的元数据中设置 role_name
值会覆盖 Galaxy 使用的角色名称。 对于集合,该值会被忽略。 导入集合时,Galaxy 使用角色目录作为角色名称,并忽略 role_name
元数据值。
playbooks 目录
在之前的版本中,您可以使用从命令行到剧本文件的完整路径来引用此目录中的剧本。在 ansible-core 2.11 及更高版本中,您可以使用 FQCN,namespace.collection.playbook
(带或不带扩展名),从命令行或 import_playbook
中引用剧本。这将使剧本处于“集合上下文”,就像您在剧本中添加了 collections: [ namespace.collection ]
一样。
您可以拥有大多数预期的子目录,例如 files/
、vars/
或 templates/
,但没有 roles/
,因为这些已在集合中处理。
此外,集合中的剧本遵循与任何剧本相同的指南,但以下几点调整除外。
目录:它必须位于
playbooks/
目录中。主机:主机应定义为变量,以便剧本用户不会错误地对整个清单运行剧本(如果主机设置为 all)。例如 -
hosts: '{{target|default("all")}}'
。
要运行剧本,用户现在可以使用以下命令:ansible-playbook --e 'targets=webservers'
或 ansible-playbook --limit webservers
。无论哪种方式,集合所有者都应在 docs/
文件夹或 README
文件中记录他们的剧本以及如何使用它们。
tests 目录
Ansible 集合与 Ansible 本身一样,通过使用 ansible-test 实用程序进行测试,该实用程序作为 Ansible 2.9.0 及更高版本的一部分发布。由于 Ansible 集合使用与 Ansible 本身相同的工具进行测试,通过使用 ansible-test,所有 Ansible 开发人员文档都适用于编写集合测试,只需记住一个关键概念。
有关如何使用 ansible-test
测试集合的具体信息,请参阅 测试集合。
阅读 测试 Ansible 文档时,会有一些内容适用于通过 git 克隆从源代码运行 Ansible,这是 Ansible 开发人员的典型做法。但是,Ansible 集合作者通常不会从源代码运行 Ansible,而是从稳定版本运行,并且创建集合不需要从源代码运行 Ansible。因此,当在整个 测试 Ansible 文档中出现有关处理 ansible-test 二进制路径、命令完成或环境变量的引用时;请记住,Ansible 集合测试不需要这样做,因为安装包含 ansible-test 的 Ansible 稳定版本预计会为您设置这些内容。
meta 目录
runtime.yml
集合可以在集合的 meta
目录中的 runtime.yml
文件中存储一些额外的元数据。 runtime.yml
文件支持顶层键
requires_ansible:
使用集合所需的 Ansible Core (ansible-core) 版本。多个版本可以用逗号分隔。
requires_ansible: ">=2.10,<2.11"
注意
虽然该版本在内部是一个 PEP440 版本说明符,但 Ansible 会偏离 PEP440 行为,从 Ansible 版本中截断预发行版段。这意味着 Ansible 2.11.0b1 与
requires_ansible: ">=2.11"
兼容。plugin_routing:
集合中 Ansible 需要从其他位置加载或已弃用/删除的内容。
plugin_routing
的顶层键是插件类型,每个插件名称作为子键。要为插件定义一个新位置,请将redirect
字段设置为另一个名称。要弃用插件,请使用deprecation
字段提供自定义警告消息和删除版本或日期。如果插件已重命名或移动到新位置,则还应提供redirect
字段。如果插件将被完全删除,则可以使用tombstone
来表示致命错误消息和删除版本或日期。plugin_routing: inventory: kubevirt: redirect: community.general.kubevirt my_inventory: tombstone: removal_version: "2.0.0" warning_text: my_inventory has been removed. Please use other_inventory instead. modules: my_module: deprecation: removal_date: "2021-11-30" warning_text: my_module will be removed in a future release of this collection. Use another.collection.new_module instead. redirect: another.collection.new_module podman_image: redirect: containers.podman.podman_image module_utils: ec2: redirect: amazon.aws.ec2 util_dir.subdir.my_util: redirect: namespace.name.my_util
import_redirection
Python 导入语句及其重定向位置的名称映射。
import_redirection: ansible.module_utils.old_utility: redirect: ansible_collections.namespace_name.collection_name.plugins.module_utils.new_location
action_groups
组及其包含的动作插件和模块名称的映射。它们还可能在列表中包含一个特殊的“metadata”字典,该字典可用于包含来自其他组的动作。
action_groups: groupname: # The special metadata dictionary. All action/module names should be strings. - metadata: extend_group: - another.collection.groupname - another_group - my_action another_group: - my_module - another.collection.another_module
execution_environments.yml
如果您的集合有要求,您可以在 meta
目录中的 execution-environment.yml
文件中指定它们。这确保用户在构建包含您的集合的 执行环境 时,不需要手动添加这些要求。有关详细信息,请参阅 集合级元数据指南。
另请参阅
- 分发集合
了解如何打包和发布您的集合
- 为 Ansible 维护的集合贡献代码
为选定的集合贡献代码的指南
- 邮件列表
开发邮件列表
- 实时聊天
如何加入 Ansible 聊天频道