Ansible 在hostvars中定义var时获取事实

Ansible 在hostvars中定义var时获取事实,ansible,ansible-inventory,ansible-facts,Ansible,Ansible Inventory,Ansible Facts,ansible 2.9.1 我有库存: [group1] server1 master=yes server2 master=no server3 master=no 如何使用master=yes从server2,server3获取ansible\u fqdn 例如: server2或server3事实: ... master_server: server1 ... 我想是的,但它不起作用: - name: set fact set_fact: master_server: {{

ansible 2.9.1

我有
库存

[group1]
server1 master=yes
server2 master=no
server3 master=no
如何使用
master=yes
server2
server3
获取
ansible\u fqdn

例如:

server2
server3
事实:

...
master_server: server1
...
我想是的,但它不起作用:

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

加:

Q:“如何从服务器2、服务器3获取master=yes的ansible_fqdn?”

答:还有更多的选择。例如,使用
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\u查询

- 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

只需更改组中主机的顺序(可能出于任何原因…),您的解决方案就会完全崩溃。没有提到你的团队中可能有几个大师(即按地区或按环境)。
$ 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