Ansible角色依赖性-安装但尚未运行-怎么办?

时间:2019-08-20 20:50:03

标签: ansible dependencies ansible-role

我希望自己的角色可以重用且自成体系。为了可重用,每个角色都遵循“单个抽象级别”范式进行重点工作。这会导致许多小的“原子”角色,并在其上构建协调角色层以提供更复杂的抽象。

要自成体系,每个角色都应声明其对其他角色的依赖性。我不希望将此类依赖关系紧密绑定到顶级剧本(例如,通过综合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!的能量集!(请参阅下面的自拍照答案。 )

1 个答案:

答案 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及其所有需要传递的角色”的方法,然后仅处理随之而来的代码维护疯狂问题。这是一种做事的丑陋方式,但至少可以使其正常工作。