Ansible提取属性并创建新词典

Ala*_*ani 2 templates ansible ansible-2.x

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

  [
     {
        "id": "subnet-1",
        "tags": {
            "Name": "showcase"
        }
     },
    {
        "id": "subnet-2",
        "tags": {
            "Name": "qa"
        }
    }
   ]
Run Code Online (Sandbox Code Playgroud)

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

   {
    "showcase": "subnet-1",
    "qa": "subnet-2",
   }
Run Code Online (Sandbox Code Playgroud)

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

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

Kon*_*rov 7

重新调整复杂数据结构的最简单方法是template查找.
知道事实,Ansible在模板化后评估JSON数据,我们可以做到以下几点.

创建一个形成所需对象的辅助子网.j2:

{
 {% for s in subnets %}
 "{{ s.tags.Name }}":"{{ s.id }}" {% if not loop.last %},{% endif %}
 {% endfor %}
}
Run Code Online (Sandbox Code Playgroud)

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

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

作为模板程序的最后一步,Ansible尝试将JSON评估为对象,因此SubnetIds在此示例中将成为普通字典.

如果您为特定任务制作帮助程序模板,则可以使用subnet_facts.subnets而不是subnets在j2文件内部,因此不需要传递额外varssubnets值.