8

我们将庞大的 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 角色在我们的部署 playbook 运行时被多次执行,因此我们看到了该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

4 回答 4

3

假设您正在使用import_roleand/or include_role,直到Include_role 循环多次安装角色和依赖项得到修复,我建议您执行以下操作:

  1. 不要将您的依赖角色指定为依赖项。
  2. 仅在调用import_role和/或时指定它们include_role
于 2019-07-30T21:48:47.910 回答
1

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

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

- 名称:包括依赖角色
  包括角色:
    名称:萨默罗
  何时: has_it_run_fact 未定义
于 2021-04-29T16:51:00.753 回答
0

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

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

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

于 2019-01-23T18:39:47.603 回答
0

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

就像是

  • 名称:执行首次设置

    角色:abc

    注册:role_abc_var

    changed_when:“'abc 设置已执行'不在 role_abc_var.stdout 中”

有关清晰的解释,请参阅
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html

于 2019-01-24T07:03:01.630 回答