Как выбрать первый хост с одинаковым значением переменной?
В файле hosts есть такая секция:
[postgresql]
pg-alpha-01 postgresql_instance=alpha
pg-alpha-02 postgresql_instance=alpha
pg-beta-a postgresql_instance=beta
pg-beta-b postgresql_instance=beta
pg-beta-c postgresql_instance=beta
На этих хостах инициализируется master-slave postgresql и при инициализации мне нужно один из хостов группы (у которых одинаковый postgresql_instance) выбрать в качестве мастера. И так как неважно какой это будет хост, то пусть будет просто первым из списка.
Ответы (1 шт):
Автор решения: Sheridan
→ Ссылка
Сначала думал просто задать вопрос, но посчитал неуважительным сначала не потрудиться самостоятельно. И в итоге всё получилось.
Плейбук:
---
- hosts: postgresql
gather_facts: no
tasks:
- name: Search first host
set_fact:
f_init_master_host: "{{ v_init_master_host }}"
f_init_master_host_is_current_host: "{{ v_init_master_host == inventory_hostname }}"
vars:
v_init_master_host: "{{ groups['postgresql'] | map('extract', hostvars) | selectattr('postgresql_instance', 'equalto', postgresql_instance) | map(attribute='inventory_hostname') | list | first }}"
- debug:
msg: "First host for {{ inventory_hostname }}: {{ f_init_master_host }}"
- debug:
msg: "Current host is master: {{ f_init_master_host_is_current_host }}"
Результат:
TASK [debug] ************
ok: [pg-alpha-01] =>
msg: 'First host for pg-alpha-01: pg-alpha-01'
ok: [pg-alpha-02] =>
msg: 'First host for pg-alpha-02: pg-alpha-01'
ok: [pg-beta-a] =>
msg: 'First host for pg-beta-a: pg-beta-a'
ok: [pg-beta-b] =>
msg: 'First host for pg-beta-b: pg-beta-a'
ok: [pg-beta-c] =>
msg: 'First host for pg-beta-c: pg-beta-a'
TASK [debug] ************
ok: [pg-alpha-01] =>
msg: 'Current host is master: True'
ok: [pg-alpha-02] =>
msg: 'Current host is master: False'
ok: [pg-beta-a] =>
msg: 'Current host is master: True'
ok: [pg-beta-b] =>
msg: 'Current host is master: False'
ok: [pg-beta-c] =>
msg: 'Current host is master: False'