ansible笔记
变量
操作列表过滤器zip和zip_longest
zip
使两个列表元素递归的融合,生成一个新的列表。新列表元素个数以list1和list2中元素个数较少者为准。
如果文字描述不懂,看下面示例就懂了:
- name: give me list combo of two listsdebug:msg: "{{ [1,2,3] | zip(['a','b','c','d','e']) | list }}"
转换结果为:
"msg": [[1,"a"],[2,"b"],[3,"c"]
]
例如:
---
- hosts: zookeepervars:- 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: zookeepervars:- 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"]
]