当被列为依赖项时,如何防止ansible角色多次运行?

时间:2019-01-23 18:22:13

标签: ansible ansible-role

我们将庞大的ansible工作空间分解为可以独立运行的单个简单角色。它们都取决于我们提供存储库等的yum角色,并且所有角色(A,B,C)都将其列在meta.yml中:

./roles_galaxy/A/meta/main.yml:
dependencies:
  - name: yum-repo
    src: foo

./roles_galaxy/B/meta/main.yml:
dependencies:
  - name: yum-repo
    src: foo

./roles_galaxy/C/meta/main.yml:
dependencies:
  - name: yum-repo
    src: foo

但是,这会导致在运行部署剧本时多次执行yum-repo角色,因此我们看到yum-repo角色的多次执行。我们不希望它这样做,因为它会占用额外的时间并重复运行:

剧本:

- name: Common Roles
  hosts: things
  roles:
    - A
    - B
    - C

输出:

PLAY [Role A] 
...
TASK [yum-repo ...]

PLAY [Role B] 
...
TASK [yum-repo ...]

PLAY [Role C] 
...
TASK [yum-repo ...]

我在allow_duplicates = false中尝试过ansible.cfg,但是我认为这不是正确的解决方案,因为它仍然可以执行多次。

如果需要更多信息,我很乐意尝试提供它的清理版本。当前正在运行ansible-2.5.5。

4 个答案:

答案 0 :(得分:1)

假设您使用的是import_role和/或include_role,直到确定Include_role loop installs role and dependencies multiple times为止,我建议您进行以下操作:

  1. 不要将您的依赖角色指定为依赖项。
  2. 仅在对import_role和/或include_role的调用中指定它们。

答案 1 :(得分:1)

一年多过去了,ansible 重复检测仍然失败。

我设置了一个 ansible fact,然后在其他角色中,使用

- name: include dependancy role
  include_role:
    name: somerole
  when: has_it_run_fact is not defined

答案 2 :(得分:0)

检出docs which cover this subject (Role Duplication and Execution)

Ansible努力寻求最有效的方法,并避免多次扮演角色,除非游戏中每次声明,否则除非它使用的任何参数都是不同的。是不是每次您的yum角色都运行时,它配置了另一个yum存储库?

不确定在Yum角色的情况下有多重要,但是一种可行的策略是将一个或多个杂物分解为一个单独的角色,然后将其设为a dependency of the main role。这将导致一次应用一个通用角色,然后针对参数中的每个差异应用任意数量的主要角色调用。

答案 3 :(得分:0)

每当运行剧本时都使用寄存器变量

类似

  • 名称:执行首次设置

    角色:abc

    注册:role_abc_var

    changed_when:“角色abc_var.stdout中未执行'abc安装已完成'”

有关详细说明,请参见
 https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html