我希望自己的角色可以重用且自成体系。为了可重用,每个角色都遵循“单个抽象级别”范式进行重点工作。这会导致许多小的“原子”角色,并在其上构建协调角色层以提供更复杂的抽象。
要自成体系,每个角色都应声明其对其他角色的依赖性。我不希望将此类依赖关系紧密绑定到顶级剧本(例如,通过综合playbook/roles/requirements.yml
)。角色应完全负责管理(声明)其依赖的角色。通过abc_role/meta/main.yml
可以很容易地通过“ dependencies”数组中的整个对象来完成此操作。
一切都很好- ,Ansible Tower不仅担负了外部依赖角色,例如从公共或私有(自定义)存储库中, 它也可以运行角色 。塔的“拉外部角色”发生在预作业中,该作业递归地遵循所有依赖项并将其收集到剧本的“角色”目录中。这是启动作业模板本身之前的100%。 Ansible的专家也将相同的依赖声明用作角色的“任务”序列,但没有使用角色进行任何协调的好处。这是“使以后可用”功能和“先执行某些任务”功能的不幸组合。
想要分离这两个功能的一个简单原因是,我可以担任一个角色(即,它可以从任何地方安装),但只能根据动态主机值有条件地执行。 (即使有可能将角色的任务流置于“ dependencies []”中,这些项目似乎也没有遵守“ when:”条件节。因此,依赖关系的条件不在表中。)
根据https://github.com/ansible/ansible/issues/35905 “允许不执行角色依赖性” -我的这种愿望具有一定的公认价值。不幸的是,#35905的评论/对话没有提供直接的解决方案或缓解措施(我可以找到)。
但是我真的想要一个具有所需属性的解决方案。是的,我想要我想要的。
所以我流着血淋了一下脑袋,诅咒了我的质朴祖先,最后得到log(deps^tags)
作为{42}- et voila!的能量集!(请参阅下面的自拍照答案。 )
答案 0 :(得分:1)
只需使用“标签:[从不]”来增强abc_role/meta/main.yml
〜“ dependencies:”的每个元素
这正是我想要的:
对于“我想看到一个实际的例子”人群-
===== abc_role/meta/main.yml =====
galaxy_info:
# boring stuff elided...
dependencies:
- src: ssh://git@repos-galore.example.com/projectum/subrollio.git
scm: git
tags: [never] # <<<=== This is the key bit
我已经对此进行了测试,并且效果很好。
_______________
< AWX 6.1.0.0 >
---------------
\ ^__^
\ (oo)\_______
(__) A )\/\
||----w |
|| ||
Ansible 2.8.2
编辑:实际上,这在实践中不太可行。
它确实按照描述的那样工作,但是当通过显式标签(例如,从剧本)选择了父角色时,则在父依赖项数组 中列出的子角色是 < / strong>执行,尽管有一个“标签:[从不]”元素。
我仍在尝试通过修改标签或以某种方式操纵它们来恢复我的方法,当我有明确的答案时,将更新此帖子。同时,我想阐明我发现和描述的解决方案的(非常)严格的限制-并且(希望永恒的希望)可能会从我们的社区中得到更好的答案...
重新编辑
在通过大量的标签组合 plus 遍历角色依赖项数组上的各种敲击事件后,我放弃了一些Ansible资料,我的追求。
一年多以前,@ bcoca(我认为是Ansible的贡献者之一)说,“安装但不执行” meta关键字是一个不错的选择,但是从那以后,对功能的要求就不再受到关注。像死鱼一样闻起来(意思是:这不可能完成)。
因此,它又回到了(非常烦人的)“膨胀了剧本的require.yml及其所有需要传递的角色”的方法,然后仅处理随之而来的代码维护疯狂问题。这是一种做事的丑陋方式,但至少可以使其正常工作。