Ansible 集合的角色依赖性处理

pap*_*ito 12 ansible

创建 ansible 角色时,您可以在中指定依赖项meta/main.yml如下所示

\n
dependencies:\n- role: papanito.xxx\n
Run Code Online (Sandbox Code Playgroud)\n

我该怎么做,如果papanito.xxx如果转换成集合或者让我们换个说法:如何告诉我的角色,它依赖于集合中的模块/角色?

\n

如果我跑ansible-playbook使用某个角色的命令,该角色依赖于集合中的角色,则会出现以下错误:

\n
ERROR! the role \'papanito.xxx\' was not found in ansible.legacy:\n/home/papanito/Workspaces/devenv/roles:\n/home/papanito/.ansible/roles:\n/usr/share/ansible/roles:\n/etc/ansible/roles:\n/home/papanito/Workspaces/devenv/roles:\n/home/papanito/Workspaces/devenv\n
Run Code Online (Sandbox Code Playgroud)\n

正如我所看到的,ansible 检查这些角色的路径,但是,集合存储在/home/papanito/.ansible/collections/ansible_collections/.

\n

我怀疑这与提到有关ansible.legacy,但是我没有配置类似的东西 - 至少是故意的。

\n

使用role: the_namespace.the_collection.the_role并不能解决问题,但我仍然遇到同样的错误。

\n

进一步的文档

\n
\n

在角色内,您可以collections使用 role\xe2\x80\x99s 中的 collections 关键字来控制哪个 Ansible 搜索角色内的任务meta/main.yml

\n
\n

所以我更新了meta/main.yml

\n
dependencies:\n- role: papanito.xxx\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行剧本时,这仍然会导致与上面完全相同的错误。

\n

pap*_*ito 7

所以显然这并没有得到真正的支持。详细说明可以在问题#76030中找到

独立角色并不意味着依赖于集合,就像集合并不意味着依赖于独立角色一样。

技术上可以实现,但需要用户手动解决依赖关系。

因此,集合应该只依赖于集合,而独立角色应该只依赖于独立角色。

在评论中,您还可以找到一些关于为什么未实现此功能的更多技术细节:

目前,角色和集合依赖关系在 ansible-galaxy 中完全分开处理,因为角色的结构不如集合。角色依赖关系构建器不会创建完整的依赖关系树,仅考虑当前安装的内容。角色没有版本控制架构,可以在安装时重命名,支持额外的源类型等,因此第一步是协调这些差异,包括对独立角色进行一些向后不兼容的更改,例如需要语义版本控制。完成后,可以移植 ansible-galaxy 中的角色依赖关系解析,以与集合相同的方式解析完整的依赖关系树(仍然与集合完全分离,仅使用通用代码)。

ansible-galaxy 不考虑集合中的角色,因此 Galaxy/AH 下一步是检查集合内容并支持查询集合角色内的依赖关系信息(以及角色集合要求)。否则,所有潜在的集合/角色候选者都需要下载到临时位置,只是为了在安装之前检查其中的跨类型要求并找到与其他所有内容兼容的最佳候选者。