gpt4 book ai didi

templates - Ansible 提取属性并创建新字典

转载 作者:行者123 更新时间:2023-12-02 15:16:30 26 4
gpt4 key购买 nike

我有一个 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(',') }}"

最佳答案

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

创建一个帮助器 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,因此无需传递额外的 varssubnets 值。

关于templates - Ansible 提取属性并创建新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com