Ansible:在循环上包含_角色,循环运行次数意外

Ansible:在循环上包含_角色,循环运行次数意外,ansible,ansible-2.x,ansible-role,Ansible,Ansible 2.x,Ansible Role,我正在尝试对项目使用include_角色 --- - hosts: cluster tasks: - block: - name: Execute test role include_role: name: testrole with_items: - 'one' ... 我的角色是 --- - name: Just debugging debug: ... 问题在于,似乎每个主机对每个项目运行该

我正在尝试对项目使用include_角色

---
- 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'
...

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


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

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


Ansible有一个内部参数
旁路\u主机\u循环
,以避免这种情况,此模块可能应该使用此机制。

我也有同样的问题,并且
允许重复:False
没有改变任何内容。
似乎在游戏中设置了
serial:1
,它以某种方式解决了这个问题。这是一个可能适用于少数主机的解决方案

谢谢你的建议。似乎这两种解决方法都不适合我。。。我将用两种解决方法的结果编辑原始帖子这很奇怪,因为我用你的剧本测试了
allow_duplicates:false
,它确实有效。看来你没有把所有的东西都展示出来。也许我把它放错地方了。我应该把它加在哪里?这个街区是为了营救(真正的角色)。然而,我只是使用这个模拟角色来测试。顺便说一句,我的角色是/etc/ansible/roles/testrole/tasks/main.yml;您如何运行您的角色?是的,我正在运行该角色,并且
允许重复:false
会改变行为。它对我不起作用。我已经在ansible的存储库中找到了一张罚单:
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