Templates Ansible提取属性并创建新字典
我有一个json对象,如下所示: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",
[
{
"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