0

我正在尝试将 include_role 与项目一起使用

---
- hosts: cluster
  tasks:
    - block:
      - name: Execute test role
        include_role:
          name: testrole
        with_items:
        - 'one'
...

我的角色是

---
- name: Just debugging
  debug:
...

问题在于,每个主机似乎每个项目运行该角色 X 次,其中 X 是主机数。

PLAY [cluster] *****************************************************************

TASK [setup] *******************************************************************
ok: [thisNode]
ok: [dww]

TASK [Execute test role] *******************************************************

TASK [testrole : Just debugging] ***********************************************
ok: [thisNode] => {
    "msg": "Hello world!"
}
ok: [dww] => {
    "msg": "Hello world!"
}

TASK [testrole : Just debugging] ***********************************************
ok: [thisNode] => {
    "msg": "Hello world!"
}
ok: [dww] => {
    "msg": "Hello world!"
}

PLAY RECAP *********************************************************************
dww                        : ok=3    changed=0    unreachable=0    failed=0   
thisNode                   : ok=3    changed=0    unreachable=0    failed=0 

为什么会发生这种情况,我该如何解决?

Ansible 主机:

[cluster]
thisNode ansible_host=localhost ansible_connection=local
dww

我不能委派任务,因为在实际角色中,必须在每个主机中执行任务。

使用allow_duplicates: no仍然输出相同。

---
- hosts: cluster
  tasks:
    - name: Execute test role
      include_role:
        name: testrole
        allow_duplicates: False
      with_items:
      - 'one'
...
4

2 回答 2

0

我有同样的问题,allow_duplicates: False并没有改变任何东西。似乎serial: 1在剧本上的设置,它以某种方式解决了它。这是一种可能适用于少数主机的解决方法。

于 2017-03-03T10:51:39.377 回答
0

作为一种解决方法,您可以添加allow_duplicates: false以防止 Ansible 使用相同的参数两次运行相同的角色。


显然,该模块循环了两次:一次是主机,另一次是指定的项目。由于它应该对所有主机运行该操作,因此外部循环会执行两次。

这是一个处于预览状态的新模块,这种行为可能是文件问题。

Ansible 有一个内部参数BYPASS_HOST_LOOP来避免这种情况,这个机制可能应该被这个模块使用。

于 2017-02-11T01:57:21.137 回答