Ansible Playbook - Импорт имени хоста Playbook pass для каждого в группе - Обнаружен рекурсивный цикл - PullRequest
0 голосов
/ 27 июня 2019

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

Итак, постараюсь сохранить вопрос простым.

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

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

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

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

Когда я все это поместилвместе и начали с 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 }}

У меня есть playbook, где у меня есть некоторые условия, основанные на "стране"

- 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}} 

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

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

1 Ответ

1 голос
/ 27 июня 2019

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

---

- 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 }}"

...