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