其他分享
首页 > 其他分享> > ansible 双层列表的元素提取&组合

ansible 双层列表的元素提取&组合

作者:互联网

我们以下面的例子为例,简单的介绍一下列表中的值的提取和改变
其实我主要是为了在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

标签:map,https,双层,1.1,列表,2380,ansible,etcd,join
来源: https://blog.csdn.net/zhangyexinaisurui/article/details/121012807