变量
操作列表过滤器zip和zip_longest
zip
使两个列表元素递归的融合,生成一个新的列表。新列表元素个数以list1和list2中元素个数较少者为准。
如果文字描述不懂,看下面示例就懂了:
- name: give me list combo of two lists
debug:
msg: "{{ [1,2,3] | zip(['a','b','c','d','e']) | list }}"
转换结果为:
"msg": [
[
1,
"a"
],
[
2,
"b"
],
[
3,
"c"
]
]
例如:
---
- hosts: zookeeper
vars:
- inventory_hostname_list: "{{ groups.zookeeper }}"
- ansible_host_list: "{{ groups.zookeeper | map('extract', hostvars, 'ansible_host') }}"
- myid_list: "{{ groups.zookeeper | map('extract', hostvars, 'myid') }}"
- zookeeper_port_list: "{{ groups.zookeeper | map('extract', hostvars, 'zookeeper_port') }}"
tasks:
- name: "拼接获取zk集群地址"
set_fact:
zookeeper_cluster: "{{ ansible_host_list | zip(zookeeper_port_list) | map('join', ':') | join(',') }}"
- name: "打印变量"
debug:
msg: "{{ zookeeper_cluster }}"
转换结果为:
TASK [拼接获取zk集群地址] ********************************************************************************************************************************************
ok: [zookeeper1] => {
"msg": "192.168.8.141:2181,192.168.8.142:2181,192.168.8.143:2181"
}
ok: [zookeeper2] => {
"msg": "192.168.8.141:2181,192.168.8.142:2181,192.168.8.143:2181"
}
ok: [zookeeper3] => {
"msg": "192.168.8.141:2181,192.168.8.142:2181,192.168.8.143:2181"
}
例如:
[zookeeper]
zookeeper1 ansible_host=192.168.8.141 ansible_password=root myid=1 zookeeper_port=2181 zookeeper_comm_port=2888 zookeeper_elect_port=3888
zookeeper2 ansible_host=192.168.8.142 ansible_password=root myid=2 zookeeper_port=2181 zookeeper_comm_port=2888 zookeeper_elect_port=3888
zookeeper3 ansible_host=192.168.8.143 ansible_password=root myid=3 zookeeper_port=2181 zookeeper_comm_port=2888 zookeeper_elect_port=3888
---
- hosts: zookeeper
vars:
- inventory_hostname_list: "{{ groups.zookeeper }}"
- ansible_host_list: "{{ groups.zookeeper | map('extract', hostvars, 'ansible_host') }}"
- myid_list: "{{ groups.zookeeper | map('extract', hostvars, 'myid') }}"
- zookeeper_port_list: "{{ groups.zookeeper | map('extract', hostvars, 'zookeeper_port') }}"
- zookeeper_comm_port_list: "{{ groups.zookeeper | map('extract', hostvars, 'zookeeper_comm_port') }}"
- zookeeper_elect_port_list: "{{ groups.zookeeper | map('extract', hostvars, 'zookeeper_elect_port') }}"
- zookeeper_cluster: "{{ ansible_host_list | zip(zookeeper_port_list) | map('join', ':') | join(',') }}"
tasks:
- name: "拼接获取zk集群地址"
set_fact:
zookeeper_server: "{{ myid_list | zip(ansible_host_list | zip(zookeeper_comm_port_list, zookeeper_elect_port_list) | map('join', ':')) | map('join', '=') | map('regex_replace', '^(.*)', 'server.\\1') | join('\n') }}"
- name: "打印变量"
debug:
msg: "{{ zookeeper_server }}"
转换结果为:
TASK [打印变量] **************************************************************************************************************************************************
ok: [zookeeper1] => {
"msg": "server.1=192.168.8.141:2888:3888\nserver.2=192.168.8.142:2888:3888\nserver.3=192.168.8.143:2888:3888"
}
ok: [zookeeper2] => {
"msg": "server.1=192.168.8.141:2888:3888\nserver.2=192.168.8.142:2888:3888\nserver.3=192.168.8.143:2888:3888"
}
ok: [zookeeper3] => {
"msg": "server.1=192.168.8.141:2888:3888\nserver.2=192.168.8.142:2888:3888\nserver.3=192.168.8.143:2888:3888"
}
zip_longest
zip_longest与zip合并原理相似,zip_longest可以对更多的列表进行操作,且新列表元素个数以被操作列表中元素个数最多者为准,此时就需要指定「fillvalue」参数作为补位填充。示例如下:
{{ [1,2,3] | zip_longest(['a','b','c','d','e'], [21, 22, 23], [100,200,300],fillvalue='X') | list }}
转换结果为:
"msg": [
[
1,
"a",
21,
100
],
[
2,
"b",
22,
200
],
[
3,
"c",
23,
300
],
[
"X",
"d",
"X",
"X"
],
[
"X",
"e",
"X",
"X"
]
]