Ansible 提取属性并创建新字典

Ansible extracting atributes and create new dictionary

我有一个 json 对象,如下所示:

  [
     {
        "id": "subnet-1",
        "tags": {
            "Name": "showcase"
        }
     },
    {
        "id": "subnet-2",
        "tags": {
            "Name": "qa"
        }
    }
   ]

我想创建一个新字典,其中只有 subnetIds,标签名称 'Name' 用作键,'id' 用作值,如下所示:

   {
    "showcase": "subnet-1",
    "qa": "subnet-2",
   }

目前我有以下代码没有帮助:

 - name: Populate SubnetIds
      set_fact:
        SubnetIds: "{{ subnet_facts.subnets | map(attribute='tags.Name') | join(',') }}"

重组复杂数据结构的最简单方法是 template 查找。
知道 Ansible 在模板化后评估 JSON 数据这一事实,我们可以执行以下操作。

创建一个 helper subnets.j2 来形成所需的对象:

{
 {% for s in subnets %}
 "{{ s.tags.Name }}":"{{ s.id }}" {% if not loop.last %},{% endif %}
 {% endfor %}
}

通过在您的剧本中查找来调用它:

- name: Populate SubnetIds
  set_fact:
    SubnetIds: "{{ lookup('template', 'subnets.j2') }}"
  vars:
    subnets: "{{ subnet_facts.subnets }}"

由于 Ansible 模板化过程的最后一步尝试将 JSON 计算为对象,因此本例中的 SubnetIds 成为普通字典。

如果您为特定任务制作辅助模板,您可以在 j2 文件中使用 subnet_facts.subnets 而不是 subnets,因此无需通过 [= 传递额外的 vars 15=]值。