Ansible:include_role在一个循环上运行了意外的次数

时间:2017-02-11 01:13:57

标签: ansible ansible-2.x ansible-role

我正在尝试将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'
...

2 个答案:

答案 0 :(得分:0)

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

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

它是处于预览状态的新模块,此行为可能应该是文件问题。

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

答案 1 :(得分:0)

我遇到了同样的问题而且allow_duplicates: False没有改变任何内容。 似乎在游戏中设置serial: 1并且它以某种方式解决了它。这是一种可能适用于少数主机的解决方法。