Получить факты, когда var определен в hostvars

ansible 2.9.1

У меня есть 2_:

[group1]
server1 master=yes
server2 master=no
server3 master=no

Как получить ansible_fqdn с master=yes от server2, server3?

Пример:

server2 или server3 факты:

...
master_server: server1
...

Я так думаю, но это не сработало:

- name: set fact
  set_fact:
    master_server: {{ ansible_fqdn }}
  when: master == 'yes'
  delegate_to: "{{ item }}"
  loop: "{{ ansible_play_hosts }}"

ОБНОВЛЕНИЕ. РЕШИТЬ

добавлять:

run_once: True

person imsysmem    schedule 17.01.2020    source источник
comment
Просто измените порядок ваших хостов в группе (что может произойти по любой причине...), и ваше решение полностью сломается. Не говоря уже о том, что у вас в группе может быть несколько мастеров (т.е. по регионам или по окружению).   -  person Zeitounator    schedule 17.01.2020


Ответы (1)


В: "Как получить ansible_fqdn с master=yes с server2, server3?"

О: Вариантов больше. Например, либо используйте selectattr

- hosts: group1
  tasks:
    - set_fact:
        master_server: "{{ (groups.group1|
                            map('extract', hostvars)|
                            selectattr('master', 'eq', True)|
                            list|
                            first).ansible_fqdn }}"
      run_once: true
    - debug:
        var: master_server

или используйте json_query

- hosts: group1
  tasks:
    - set_fact:
        master_server: "{{ groups.group1|
                           map('extract', hostvars)|
                           list|
                           json_query('[?master].ansible_fqdn')|
                           first }}"
      run_once: true
    - debug:
        var: master_server

Оба варианта дают

ok: [test_02] => {
    "master_server": "test_01.example.org"
}
ok: [test_01] => {
    "master_server": "test_01.example.org"
}
ok: [test_03] => {
    "master_server": "test_01.example.org"
}


Инвентарь, использованный в примерах

$ cat hosts
group1:
  hosts:
    test_01:
      master: yes
      ansible_fqdn: test_01.example.org
    test_02:
      master: no
      ansible_fqdn: test_02.example.org
    test_03:
      master: no
      ansible_fqdn: test_03.example.org
person Vladimir Botka    schedule 17.01.2020