Получить факты, когда переменная определена в hostvars - PullRequest
0 голосов
/ 17 января 2020

ansible 2.9.1

У меня inventory:

[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 }}"

ОБНОВЛЕНИЕ , RESOLVE

add:

run_once: True

1 Ответ

0 голосов
/ 17 января 2020

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

A: Есть другие варианты. Например, либо используйте 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
...