Ansible&Jinja2:将两个列表转换为键,值dict

时间:2018-08-17 08:19:04

标签: ansible jinja2

我想在Ansible中将两个列表组合成一个键,值字典。

我有以下列表(AWS资源ID):

ok: [localhost] => {
    "vpc_natgw_ids": [
        [
            "vpc-123",
            "vpc-234",
            "vpc-345",
            "vpc-456"
        ],
        [
            "nat-098",
            "nat-987",
            "nat-876",
            "nat-765"
        ]
    ]
}

第一个列表中的第一项与第二个列表中的第一项相对应,第二个项与另一个第二个项相对应,依此类推。

我想将两个列表结合起来,得到一个像这样的字典:

ok: [localhost] => {
    "vpc_natgw_ids_dict": [
        "vpc-123": "nat-098",
        "vpc-234": "nat-987",
        "vpc-345": "nat-876",
        "vpc-456": "nat-765"
    ]
}

我将如何实现这样的目标?

2 个答案:

答案 0 :(得分:2)

例如这种方式:

set_fact:
  vpc_natgw_ids_dict: "{{ dict(vpc_natgw_ids[0] | zip(vpc_natgw_ids[1])) }}"

答案 1 :(得分:0)

IRC用户seschwar在freenode.net上#ansible中发布的另一种解决方案也可以通过使用Jinja2来工作:

- set_fact:
    vpc_natgw_ids_dict: >-
      {%- set ns = namespace(ids={}) -%}
      {%- for i in vpc_natgw_ids[0] -%}
        {{- ns.ids.__setitem__(vpc_natgw_ids[0][loop.index0], vpc_natgw_ids[1][loop.index0]) -}}
      {%- endfor -%}
      {{- ns.ids -}}
- debug:
    var: vpc_natgw_ids_dict