сравнить вывод команды на нескольких хостах и ​​запускать последующие задачи только на одном хосте на основе выходных данных - PullRequest
0 голосов
/ 23 апреля 2020

В кластере Galera я хочу найти узел с наивысшим порядковым номером (seqno), но не -1 или 0, в каждом узле я могу запустить его и получить it:

awk '/seqno/ {print $2}' /path/to/grastate.dat

Пример файла grastate.dat:

# GALERA saved state
version: 2.1
uuid:    05e3fb93-8258-11ea-bfcd-6bd729510d3a
seqno:   -1
safe_to_bootstrap: 0

Запуск:

---
- hosts: galera
  become: true
  gather_facts: no

  tasks:
  - name: find latest seqno
    shell: awk '/seqno/ {print $2}' /path/to/grastate.dat
    register: rs

  - debug: var=rs.stdout

Возвращает:

TASK [debug] ***************************************************************************************************************************
ok: [192.168.255.15] => {
    "rs.stdout": "-1"
}
ok: [192.168.255.16] => {
    "rs.stdout": "28"
}
ok: [192.168.255.17] => {
    "rs.stdout": "0"
}

Я могу получить seqno для каждого узла, но я не нашел способа сравнить его со значением из других узлов.

Из этого вывода я знаю, что B - это узел с самым высоким seqno (28):

# node               # seqno
A - 192.168.255.15   -1
B - 192.168.255.16   28
C - 192.168.255.17   0

Но как с ansible я бы сравнил выходные данные на узел и нашел бы узел с наибольшим seqno, а затем выполнил бы некоторые задачи только на этом указанном c узле .

Например, если бы у меня была глобальная переменная, скажем, highest_seqno, которая по умолчанию равна 0 и node (где я мог бы сохранить ansible_host), если бы я запускал playbooks последовательно, я мог бы сделать:

Для узла A seqno -1:

rs.stdout|int > highest_seqno?

Поскольку для узла A в качестве seqno значения -1, highest_seqno остается 0

Для узла B seqno 28:

rs.stdout|int > highest_seqno? yes so update variables
highest_seqno = 28
node = ansible_host from node B

Для узла C seqno 0:

rs.stdout|int > highest_seqno? No so no changes 

Ближайшее, что у меня есть, это:

  - set_fact:
      hseqno: "{{ ansible_play_hosts | map('extract', hostvars, 'rs') | map(attribute='stdout') | map('int') | list | max }}"

  - debug:
      msg: "{{ ansible_hostname }}"
    when: hseqno == rs.stdout

Он будет хранить в переменной hseqno наибольшее найденное значение seqno, и тогда я смогу запустить задачу на основе хоста, соответствующего этому значению, это работает путем извлечения значения max int, найденного в списке, но не сравнивая значения, моя цель найти способ сравнения значений потому, что не всегда мне нужно находить значение max.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...