ansible笔记

变量

操作列表过滤器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"
    ]
]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值