我们将庞大的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。
答案 0 :(得分:1)
假设您使用的是import_role
和/或include_role
,直到确定Include_role loop installs role and dependencies multiple times为止,我建议您进行以下操作:
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