我们以下面的例子为例,简单的介绍一下列表中的值的提取和改变
其实我主要是为了在ansible中快速的得到一些变量和配置文件的值, 偶然间发现了双层列表原来如此好用
_etcd_server_list:
- ["etcd-01","https://1.1.1.1:2380"]
- ["etcd-02","https://1.1.1.2:2380"]
- ["etcd-03","https://1.1.1.3:2380"]
- name:
debug:
msg: "{{ _etcd_cluster_addr | map('join','=') | join(',') }}"
结果:
etcd-01=https://1.1.1.1:2380,etcd-02=https://1.1.1.2:2380,etcd-03=https://1.1.1.3:2380
map里面的操作为join,map表示在双层列表中,将第二层的列表中的元素使用”=“连接起来,
join(',')在第一层将这些第二层层列表再次用”,“拼接起来。
这样接可以得到etcd配置文件中的init cluster的地址,方便在ansible中进行快速部署
- name: Generate multiple hostnames
ansible.builtin.debug:
msg: "{{ ['foo', 'bar'] | product(['com','cn']) | map('join', '.') | join(',') }}"
This would result in:
"msg": "foo.com,foo.cn,bar.com,bar.cn" 相当于笛卡尔积,将两个列表相乘
如何获取双层列表中第二层的指定位置元素?
我们需要使用到map(‘extract’) 过滤器
- name: wsad
ansible.builtin.debug:
msg: "{{ [0,1,2] | map('extract', _etcd_cluster_addr, [1]) | list | join(',') }}"
结果如下
"msg": "https://1.1.1.1:2380,https://1.1.1.2:2380,https://1.1.1.3:2380"
[0,1,2] 表示了我们需要提取第一层中的哪几列,
[0,1], 就表示只取前两列
map('extract', _etcd_cluster_addr, [1])
extract: 表示提取的意思
_etcd_cluster_addr: 表示需要提的的变量
[1], 表示了第二层中的哪个元素, 这里为第二层的序号为1的元素
通过这一步,可以很方便地获取到ETCDCTL_ENDPOINTS变量的值,从未可以非常快的使用etcdctl