具有角色范围自定义模块的 Ansible 集合
Ansible collection with role-scope custom modules
我正在尝试将我的一堆 Ansible 剧本、角色、任务等转换成正式的 Ansible Collection 以更好地支持重用和模块化。
TL;DR 是我在打包包含自定义模块角色的集合时遇到问题。以前,我可以从角色中的任何任务文件调用角色的自定义模块,而无需完全限定的集合名称 (FQCN)。但是,将角色打包为集合的一部分后,Ansible 表示它无法解析角色的自定义模块名称。
在此集合中,我拥有以下所有内容:
- 剧本,
foobook.yml
- 自定义模块,
my_baz_module
- 一个角色,
bar_role
bar_role
、my_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
集合角色中的运输模块是deliberately not supported;您必须将它们作为正常的收集模块包括在内。如果您希望使用子目录来指示该模块不供外部使用,则可以,例如通过将其放置在 plugins/modules/internal/my_bar_module.py
并调用 mynamespace.mycollection.internal.my_bar_module
.
我正在尝试将我的一堆 Ansible 剧本、角色、任务等转换成正式的 Ansible Collection 以更好地支持重用和模块化。
TL;DR 是我在打包包含自定义模块角色的集合时遇到问题。以前,我可以从角色中的任何任务文件调用角色的自定义模块,而无需完全限定的集合名称 (FQCN)。但是,将角色打包为集合的一部分后,Ansible 表示它无法解析角色的自定义模块名称。
在此集合中,我拥有以下所有内容:
- 剧本,
foobook.yml
- 自定义模块,
my_baz_module
- 一个角色,
bar_role
bar_role
、my_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
集合角色中的运输模块是deliberately not supported;您必须将它们作为正常的收集模块包括在内。如果您希望使用子目录来指示该模块不供外部使用,则可以,例如通过将其放置在 plugins/modules/internal/my_bar_module.py
并调用 mynamespace.mycollection.internal.my_bar_module
.