Ansible Playbook - Импортировать Playbook pass Имя хоста для каждого в группе - Обнаружена рекурсивная петля

пожалуйста, во-первых, извините мой вопрос. Я искал и потратил время на просмотр Как перебирать группу инвентаря в доступном ? и Ansible перебирают хосты в инвентаре группа задается переменной стиля вопросов.

Поэтому постараюсь, чтобы вопрос оставался простым.

Инвентарь выглядит так: (это все примеры, адаптированные для лучшего объяснения ..)

[GroupA]
host1 country=USA
host2 country=USA
host3 country=UK

Поэтому я хочу передать группу только без хостов, чтобы playbook выполнялся на каждом хосте. Однако как часть playbook, во-первых, мне нужно запустить скрипт на другом сервере (в зависимости от страны) и передать имя хоста этому скрипту.

В ходе тестирования я обнаружил «inventory_hostname», так что даже если я не передал хост, а передал группу, я мог поместить имя хоста в переменную.

Когда я собрал все это вместе и начал с import_playbook (потому что этот playbook предназначен для другого сервера), я увидел:

Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while templating '{{ runninghost }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: An unhandled exception occurred while templating '{{ v_host_name }}'. Error was a <class 'ansible.errors.AnsibleError'>, original message: recursive loop detected in template string: {{ v_host_name }}

У меня есть сценарий, в котором есть несколько условных обозначений, основанных на "стране".

- hosts: "{{ v_world }}"

   vars:
    v_world: "{{ v_world }}"
    hostvalue : "{{ inventory_hostname }}"

 - import_playbook: country-stuff-USA.yml
   vars:
    v_host_name: "{{ hostvalue }}"
   when: hostvars[groups[v_world][0]]['country'] == "USA"

 - import_playbook: country-stuff-UK.yml
   vars:
    v_host_name: "{{ hostvalue }}"
   when: hostvars[groups[v_world][0]]['country']  == "UK"


country-stuff-USA.yml

---
 - hosts: "world-server-usa.world"
   vars:
     runninghost: "{{ v_host_name }}"

   roles:
   - role: world_peace-usa
     poll: 0
     vars:
      hostvalue: "{{ runninghost }}"

country-stuff-UK.yml

---
 - hosts: "world-server-usa.world"
   vars:
     runninghost: "{{ v_host_name }}"

   roles:
   - role: world_peace-uk
     poll: 0
     vars:
      hostvalue: "{{ runninghost }}"      

world_peace-uk ( main.yml )

- name: world_peace-uk
  shell: ksh /mountA/scriptuk.sh -host={{hostvalue}} 

world_peace-uk ( main.yml )

- name: world_peace-usa
  shell: ksh /mountA/scriptusa.sh -host={{hostvalue}} 

Есть предположения ? Я уверен, что делаю что-то очень неправильное с этой комбинацией ... но я не мог придумать лучшего способа использовать группы, кроме как передать имя хоста в скрипт в другом поле.

Большое спасибо за чтение!


person Gripsiden    schedule 26.06.2019    source источник


Ответы (1)


Вы слишком усложняете свою проблему, вам следует использовать делегирование всякий раз, когда вы необходимо выполнить задачу на другом хосте, отличном от указанного в игре. Например:

---

- hosts: running_hosts

  tasks:
  - name: tasks to execute on another host
    module: ...
    delegate_to: other_host

  - name: tasks to execute on the running host
    module: ...

Что касается получаемой вами ошибки, это потому, что v_world ссылается на себя в заявлении v_world: "{{ v_world }}"

person Alassane Ndiaye    schedule 26.06.2019
comment
Большое спасибо за ответ. Я догадался, что я слишком усложняю, я буквально подхожу к этому, как к Lego Blocks, исходя из моего отсутствия опыта. Попробую это и дам вам знать. - person Gripsiden; 27.06.2019