2017-02-11 24 views
0

я пытаюсь использовать include_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 

Почему это происходит и как я могу это исправить?

анзибль хозяева:

[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

В качестве временного решения вы можете добавить allow_duplicates: false предотвратить анзибль запуск ту же роль дважды с теми же параметрами.


Очевидно, что модуль зацикливается дважды: один раз с хостами, в другое время с указанными элементами. Поскольку предполагается запустить действие против всех узлов, внешний цикл выполняется дважды.

Это новый модуль в состоянии предварительного просмотра, и это поведение, вероятно, должно быть файлом как проблема.

Ansible имеет внутренний параметр BYPASS_HOST_LOOP, чтобы избежать таких ситуаций, и этот механизм, вероятно, должен использоваться этим модулем.

+0

Спасибо за предложения. Кажется, что ни обойти это не обойдется мне ... Я отредактирую исходное сообщение с результатами обоих обходных решений. –

+0

Странно, потому что я протестировал 'allow_duplicates: false' с вашей игрой, и это действительно сработало. Похоже, вы не показываете все. – techraf

+0

Возможно, я добавлю его в неправильное место. Где его добавить? –

0

У меня была та же проблема, и allow_duplicates: False ничего не изменил. Кажется, что установка serial: 1 на игру, и это как-то решило ее. Это обходной путь, который, вероятно, будет работать для небольшого числа хостов.

+0

Это не сработало для меня. Я уже собрал билет для него в недоступном репозитории: https://github.com/ansible/ansible/issues/21279 –