В кластере 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
.