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

6 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
Run Code Online (Sandbox Code Playgroud)

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

剧本:

- name: Common Roles
  hosts: things
  roles:
    - A
    - B
    - C
Run Code Online (Sandbox Code Playgroud)

输出:

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

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

PLAY [Role C] 
...
TASK [yum-repo ...]
Run Code Online (Sandbox Code Playgroud)

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

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

clo*_*net 0

查看涵盖该主题的文档(角色复制和执行)

Ansible 努力采用最有效的方法,并避免多次运行某个角色,除非它使用的任何参数在您的 play 中每次声明时都不同。是否每次 yum 角色运行时都会配置不同的 yum 存储库?

不确定它在 Yum 角色的情况下有多相关,但是一种可能的策略是将通用的、一次性的内容拆分为单独的角色,然后使通用角色成为主要角色的依赖项。这会导致应用一次通用角色,然后针对参数中的每个差异多次调用主要角色。