Templates Ansible提取属性并创建新字典

Templates Ansible提取属性并创建新字典,templates,ansible,ansible-2.x,Templates,Ansible,Ansible 2.x,我有一个json对象,如下所示: [ { "id": "subnet-1", "tags": { "Name": "showcase" } }, { "id": "subnet-2", "tags": { "Name": "qa" } } ] { "showcase": "subnet-1",

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

  [
     {
        "id": "subnet-1",
        "tags": {
            "Name": "showcase"
        }
     },
    {
        "id": "subnet-2",
        "tags": {
            "Name": "qa"
        }
    }
   ]
   {
    "showcase": "subnet-1",
    "qa": "subnet-2",
   }
我想创建一个新的字典,只包含子网,标记名“name”用作键,“id”用作值,如下所示:

  [
     {
        "id": "subnet-1",
        "tags": {
            "Name": "showcase"
        }
     },
    {
        "id": "subnet-2",
        "tags": {
            "Name": "qa"
        }
    }
   ]
   {
    "showcase": "subnet-1",
    "qa": "subnet-2",
   }
目前我有以下代码,但没有帮助:

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

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

创建辅助对象子网。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计算为对象,因此本例中的
子网成为普通字典

如果您为特定任务创建帮助器模板,则可以在j2文件中使用
subnet\u facts.subnets
而不是
subnets
,因此无需使用
subnets
值传递其他
vars