我正在尝试将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'
...
答案 0 :(得分:0)
作为一种解决方法,您可以添加allow_duplicates: false
以防止Ansible使用相同的参数两次运行相同的角色。
显然,模块循环两次:一次使用主机,另一次使用指定的项目。由于它应该针对所有主机运行操作,因此外部循环执行两次。
它是处于预览状态的新模块,此行为可能应该是文件问题。
Ansible有一个内部参数BYPASS_HOST_LOOP
来避免这种情况,这个机制可能应该被这个模块使用。
答案 1 :(得分:0)
我遇到了同样的问题而且allow_duplicates: False
没有改变任何内容。
似乎在游戏中设置serial: 1
并且它以某种方式解决了它。这是一种可能适用于少数主机的解决方法。