Ansible:将变量值合并到新变量中
Ansible: Merge variable values into new variable
假设我有这样的库存:
database:
hosts:
database1:
ansible_host: 192.168.0.125
database2:
ansible_host: 192.168.0.126
database3:
ansible_host: 192.168.0.127
现在我必须替换一个文件中的字符串,该字符串还包含所有主机和未来主机的 IP 地址。所以简而言之,我需要一个看起来像这样的变量:
192.168.0.125,192.168.0.126,192.168.0.127
现在,我可以这样做:
库存:
database:
hosts:
database1:
ansible_host: 192.168.0.124
database2:
ansible_host: 192.168.0.126
database3:
ansible_host: 192.168.0.127
vars:
dbs: "{{ hostvars['database1']['ansible_host'] + ',' + hostvars['database2']['ansible_host'] + ',' + hostvars['database3']['ansible_host'] }}"
剧本:
- name: Show host's ip
debug:
msg: "{{ dbs }}"
但这显然不好,因为如果此列表中出现新实例,我将不得不将 manualla + ',' + hostvars['databaseX']['ansible_host']
添加到清单中,我希望避免这种情况。
你们能推荐一种方法来使用循环或项目列表来获取包含所有 IP 地址的变量中的字符串吗?
谢谢!
一个选项是在循环中构建 dbs
值:
- hosts: localhost
gather_facts: false
tasks:
- set_fact:
dbs: "{{ dbs + [hostvars[item].ansible_host] }}"
loop: "{{ groups.database }}"
vars:
dbs: []
- debug:
var: dbs
根据您的示例库存,这将产生:
TASK [debug] ********************************************************************************************
ok: [localhost] => {
"dbs": [
"192.168.0.125",
"192.168.0.126",
"192.168.0.127"
]
}
在清单中动态创建变量。例如
database:
hosts:
database1:
ansible_host: 192.168.0.124
database2:
ansible_host: 192.168.0.126
database3:
ansible_host: 192.168.0.127
vars:
dbs: "{{ groups.database|
map('extract', hostvars, 'ansible_host')|
join(',') }}"
假设我有这样的库存:
database:
hosts:
database1:
ansible_host: 192.168.0.125
database2:
ansible_host: 192.168.0.126
database3:
ansible_host: 192.168.0.127
现在我必须替换一个文件中的字符串,该字符串还包含所有主机和未来主机的 IP 地址。所以简而言之,我需要一个看起来像这样的变量:
192.168.0.125,192.168.0.126,192.168.0.127
现在,我可以这样做:
库存:
database:
hosts:
database1:
ansible_host: 192.168.0.124
database2:
ansible_host: 192.168.0.126
database3:
ansible_host: 192.168.0.127
vars:
dbs: "{{ hostvars['database1']['ansible_host'] + ',' + hostvars['database2']['ansible_host'] + ',' + hostvars['database3']['ansible_host'] }}"
剧本:
- name: Show host's ip
debug:
msg: "{{ dbs }}"
但这显然不好,因为如果此列表中出现新实例,我将不得不将 manualla + ',' + hostvars['databaseX']['ansible_host']
添加到清单中,我希望避免这种情况。
你们能推荐一种方法来使用循环或项目列表来获取包含所有 IP 地址的变量中的字符串吗?
谢谢!
一个选项是在循环中构建 dbs
值:
- hosts: localhost
gather_facts: false
tasks:
- set_fact:
dbs: "{{ dbs + [hostvars[item].ansible_host] }}"
loop: "{{ groups.database }}"
vars:
dbs: []
- debug:
var: dbs
根据您的示例库存,这将产生:
TASK [debug] ********************************************************************************************
ok: [localhost] => {
"dbs": [
"192.168.0.125",
"192.168.0.126",
"192.168.0.127"
]
}
在清单中动态创建变量。例如
database:
hosts:
database1:
ansible_host: 192.168.0.124
database2:
ansible_host: 192.168.0.126
database3:
ansible_host: 192.168.0.127
vars:
dbs: "{{ groups.database|
map('extract', hostvars, 'ansible_host')|
join(',') }}"