Выполнение ansible задач на указанных c хостах - PullRequest
1 голос
/ 05 августа 2020

У меня есть группа хостов:

[hosts]
host1
host2
host3

Я хотел бы запустить какой-нибудь скрипт только на одном из заданных хостов (неважно, на каком), а затем во второй задаче запустить другой скрипт, но только на двух оставшихся хостах, на которых предыдущая задача не была выполнена.

- name: Task to be run on any host from given group of host
  shell: sth
  .
  .

- name: Task to be run on the other 2 hosts from the same group
  shell: sth else
  .
  .

Я знаю, что это может быть достигнуто, например. используя serial, хотя других идей нет. Буду признателен за любую помощь!

1 Ответ

1 голос
/ 05 августа 2020

Есть и другие варианты.

  1. Выполните один раз первую задачу в блоке и поместите имя inventory_hostname в переменную. Запустите следующую задачу в l oop без первого хоста. Например,
- name: Play1
  hosts: all
  gather_facts: false
  tasks:
    - block:
        - name: Task to be run on any host from given group of host
          command: echo {{ inventory_hostname }}
          register: result_first
        - set_fact:
            first_host: "{{ inventory_hostname }}"
      run_once: true
    - name: Task to be run on the other 2 hosts from the same group
      command: echo {{ item }}
      register: result_others
      loop: "{{ groups.all|difference([first_host]) }}"
      delegate_to: "{{ item }}"
      run_once: true

    - debug:
        msg:
          - "{{ result_first.stdout }}"
          - "{{ result_others.results|map(attribute='stdout')|list }}"
      run_once: true

дать

ok: [host1] => 
  msg:
  - host1
  - - host2
    - host3

Следующий вариант - создать группу хостов без первого. Этот подход не требует делегирования. Например,
- name: Play2
  hosts: all
  gather_facts: false
  tasks:
    - block:
        - name: Task to be run on any host from given group of host
          command: echo {{ inventory_hostname }}
          register: result_first
        - set_fact:
            first_host: "{{ inventory_hostname }}"
        - add_host:
            name: "{{ item }}"
            groups: my_group_without_first_host
            result_first: "{{ result_first }}"
          loop: "{{ groups.all|difference([first_host]) }}"
      run_once: true

- hosts: my_group_without_first_host
  gather_facts: false
  tasks:
    - name: Task to be run on the other 2 hosts from the same group
      command: echo {{ inventory_hostname }}
      register: result_others
    - debug:
        msg:
          - "{{ result_first.stdout }}"
          - "{{ result_others.stdout }}"

дать

ok: [host2] => 
  msg:
  - host1
  - host2
ok: [host3] => 
  msg:
  - host1
  - host3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...