首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不可提取核函数并创建新字典

不可提取核函数并创建新字典
EN

Stack Overflow用户
提问于 2016-10-14 02:54:26
回答 1查看 1.6K关注 0票数 2

我有一个json对象,它看起来如下:

代码语言:javascript
复制
  [
     {
        "id": "subnet-1",
        "tags": {
            "Name": "showcase"
        }
     },
    {
        "id": "subnet-2",
        "tags": {
            "Name": "qa"
        }
    }
   ]

我想要创建一个新的字典,其中只有subnetIds,标记名' name‘用作键,'id’用作值,如下所示:

代码语言:javascript
复制
   {
    "showcase": "subnet-1",
    "qa": "subnet-2",
   }

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

代码语言:javascript
复制
 - name: Populate SubnetIds
      set_fact:
        SubnetIds: "{{ subnet_facts.subnets | map(attribute='tags.Name') | join(',') }}"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-14 06:55:26

重组复杂数据结构的最简单方法是template查找。

知道了Ansible在模板化后对JSON数据进行评估这一事实,我们可以执行以下操作。

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

代码语言:javascript
复制
{
 {% for s in subnets %}
 "{{ s.tags.Name }}":"{{ s.id }}" {% if not loop.last %},{% endif %}
 {% endfor %}
}

通过在你的剧本中查找它:

代码语言:javascript
复制
- name: Populate SubnetIds
  set_fact:
    SubnetIds: "{{ lookup('template', 'subnets.j2') }}"
  vars:
    subnets: "{{ subnet_facts.subnets }}"

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

如果您为特定任务创建了辅助模板,则可以在j2文件中使用subnet_facts.subnets而不是subnets,因此不需要传递带有subnets值的附加vars

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40034175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档