Пропустить другие хосты, если первый хост доступен в Ansible - PullRequest
0 голосов
/ 02 марта 2020

У меня есть файл, состоящий из IP-адреса, который я использую ниже, чтобы сделать этот инвентарь для моих задач

ips.text

192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4

main.yml

    - name: Add Instance IP Addresses to temporary inventory groups
      shell: cat ~/ips.text
      register: serverlist
    - debug: msg={{ serverlist.stdout_lines }}
    - name: Add Instance IP Addresses to temporary inventory groups
    add_host
        groups: working_hosts
        hostname: "{{item}}"
      with_items: "{{ serverlist.stdout_lines }}"

- hosts: working_hosts
  become: yes

Теперь я хочу сделать так, как если бы 192.168.0.1 достижимо, тогда он должен пропустить остальные ips из этого файла, и если 192.168.0.1 недоступен, затем идет только к следующему 192.168.0.2 .

Как мы можем достичь этого?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Q: "Если 192.168.0.1 достижим, тогда следует пропустить остальные IP-адреса."

A: Давайте wait_for_connection на всех хостах в block и сохранить статус соединения в переменной reachable. Затем используйте переменную reachable, чтобы создать группу доступных хостов reachable и запустить новую игру с первым хостом из группы groups.reachable.0. Например

- name: Test reachable hosts
  hosts: working_hosts
  gather_facts: false
  vars:
    connection_timeout: "10"
  tasks:
    - block:
        - wait_for_connection:
            timeout: "{{ connection_timeout }}"
      rescue:
        - set_fact:
            reachable: false
        - meta: clear_host_errors
        - meta: end_host
    - set_fact:
        reachable: true

    - add_host:
        name: '{{ item }}'
        groups: 'reachable'
      loop: "{{ hostvars|dict2items|json_query('[?value.reachable].key') }}"
      run_once: true

- hosts: "{{ groups.reachable.0 }}"
  tasks:
    - debug:
        msg: "{{ inventory_hostname }}"
0 голосов
/ 03 марта 2020

Ну, закажите своего хозяина так, как вы хотите, в инвентаре, поставьте gather_facts: yes и run_once: yes задач, и у вас все хорошо go:

---
- hosts: all
  gather_facts: yes
  tasks:
  - debug:
      var: ansible_hostname
    run_once: yes

Запустите это playbook на множестве хостов, причем первые несколько в вашем списке выключены, и вы увидите, что задание выполняется только на первом хосте, который отвечает.

Другой вариант аналогичен предложенному Владимиром, но с использованием (отсутствие) результатов из gather_facts:

---
- hosts: all
  gather_facts: yes
  tasks:
  - set_fact:
      first_good_host: "{{ ansible_play_hosts | map('extract', hostvars) | list | json_query(query) | first }}"
    run_once: yes
    delegate_to: localhost
    vars:
      query: "[?ansible_facts!=''].inventory_hostname"

  - debug:
      var: first_good_host
    delegate_to: localhost

  - add_host:
      name: '{{ first_good_host }}'
      groups: 'reachable'
    run_once: yes

- hosts: reachable
  gather_facts: yes
  tasks:
  - debug:
      msg: "{{ inventory_hostname }}"

Удачи!

...