我有一个 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
,因此无需传递额外的 vars
与 subnets
值。
关于templates - Ansible 提取属性并创建新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034175/