我希望我的角色是可重用的和独立的。为了可重用,每个角色都按照“单一抽象级别”范式完成一项重点工作。这导致了许多小的“原子”角色,在它们之上构建了协调角色层以提供更复杂的抽象。
为了自包含,每个角色都应该声明它对其他角色的依赖。我不希望这种依赖关系与顶级剧本紧密绑定(例如通过 omnibus playbook/roles/requirements.yml)。角色应该完全负责管理(声明)它所依赖的角色。这很容易通过abc_role/meta/main.yml在“依赖项”数组中使用合适的整体来完成。
一切都很好-除了那Ansible塔不仅拉动外部依赖的角色,例如从公共或私人(自定义)库,它也运行中的作用。“拉取外部角色”由 Tower 在 pre-job 中进行,该工作递归地跟踪所有依赖项并将它们收集到剧本的“角色”目录中。这是在启动作业模板本身之前 100%。Ansible 本身也使用相同的依赖声明作为角色的“预任务”序列 - 但没有使用角色的任何协调的好处。这是“供以后使用”功能和“首先执行某些任务”功能的不幸混淆。
想要分离这两个功能的一个简单原因是,我可以有一个可用的角色(即它是从任何地方安装的),但只能根据动态主机值有条件地执行它。(即使可以将角色的任务流放入“dependencies[]”,这些项目似乎也不遵守“when:”条件节。因此,依赖项的条件不在表中。)
根据https://github.com/ansible/ansible/issues/35905 “允许不执行角色依赖项” - 我的这个愿望具有一些公认的价值。不幸的是,#35905 的评论/对话没有提供直接的解决方案或缓解措施(我能找到)。
但我真的想要一个具有我想要的属性的解决方案。是的,我想要我想要的。
所以我撞得头破血流,诅咒我的原生质血统,最后衍生log(deps^tags)为{42}的幂集 -瞧!(见下面我的自拍答案。)