具有角色范围自定义模块的可靠集合



我正试图将我的一堆Ansible剧本、角色、任务等转换为一个正式的Ansible集合,以更好地支持重用和模块化。

TL;DR是我在打包包含角色的集合时遇到问题,该角色包含自定义模块。以前,我可以在没有完全限定的集合名称(FQCN(的情况下从角色中的任何任务文件调用角色的自定义模块。然而,由于角色被打包为集合的一部分,Ansible表示无法解析角色的自定义模块名称。


在这个集合中,我拥有以下所有内容:

  • 剧本,foobook.yml
  • 自定义模块my_baz_module
  • 角色,bar_role
  • bar_rolemy_bar_role_module中的自定义模块

这导致以下目录结构:

mynamespace/
─ mycollection/
|─ playbooks/
|  ─ foobook.yml
├─ plugins/
|  ─ modules/
|     ─ my_baz_module.py
─ roles/
─ bar_role/
├─ tasks/
|  ─ main.yml
─ library/
─ my_bar_role_module.py

这个结构允许我使用ansible-playbook mynamespace.mycollection.foobook ...运行剧本,并在该剧本中使用role: mynamespace.mycollection.bar_role访问角色。在角色或剧本中,我可以调用使用my_baz_module的任务,如下所示:

- name: My task 
mynamespace.mycollection.my_baz_module:
...

然而,在roles/bar_role/tasks/main.yml中,我无法调用以下任何一个任务,或者我得到以下错误:

# method one
- name: My task
my_bar_role_module:
...
# method two
- name: My task
mynamespace.mycollection.my_bar_role_module:
...
# method three, though I didn't expect this to work (and it didn't)
- name: My task
mynamespace.mycollection.bar_role.my_bar_role_module:
...
# Error from method one
ERROR! couldn't resolve module/action 'my_bar_role_module'. This often indicates a misspelling, missing collection, or incorrect module path.
# Error from method two
ERROR! couldn't resolve module/action 'mynamespace.mycollection.my_bar_role_module'. This often indicates a misspelling, missing collection, or incorrect module path.

需要明确的是:这是一个与向集合结构过渡直接相关的变化。在将这些内容移动到集合之前,我可以从bar_role中的任何任务文件调用my_bar_role_module,而不会出现任何问题。是否有任何方法可以在不单独打包角色或将my_bar_role_module移动到集合范围插件目录的情况下支持这种结构?

编辑:该剧本将与ansible-playbook mynamespace.mycollection.foobook一起推出。下面是一个示例:

# foobook.yml
- hosts: localhost
roles:
- role: mynamespace.mycollection.bar_role

故意不支持集合角色内的运输模块;您必须将它们作为普通收集模块包括在内。如果您希望使用子目录来指示模块不用于外部用途,例如将其放置在plugins/modules/internal/my_bar_module.py并调用mynamespace.mycollection.internal.my_bar_module

最新更新