Ansible 提取属性并创建新字典
Ansible extracting atributes and create new dictionary
我有一个 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(',') }}"
重组复杂数据结构的最简单方法是 template
查找。
知道 Ansible 在模板化后评估 JSON 数据这一事实,我们可以执行以下操作。
创建一个 helper 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
15=]值。
我有一个 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(',') }}"
重组复杂数据结构的最简单方法是 template
查找。
知道 Ansible 在模板化后评估 JSON 数据这一事实,我们可以执行以下操作。
创建一个 helper 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
15=]值。