Ala*_*ani 2 templates ansible ansible-2.x
我有一个json对象,如下所示:
[
{
"id": "subnet-1",
"tags": {
"Name": "showcase"
}
},
{
"id": "subnet-2",
"tags": {
"Name": "qa"
}
}
]
Run Code Online (Sandbox Code Playgroud)
我想创建一个新的字典,只有带有标签名称'Name'的subnetIds用作键,'id'用作值,如下所示:
{
"showcase": "subnet-1",
"qa": "subnet-2",
}
Run Code Online (Sandbox Code Playgroud)
目前我有以下代码,但没有帮助:
- name: Populate SubnetIds
set_fact:
SubnetIds: "{{ subnet_facts.subnets | map(attribute='tags.Name') | join(',') }}"
Run Code Online (Sandbox Code Playgroud)
重新调整复杂数据结构的最简单方法是template查找.
知道事实,Ansible在模板化后评估JSON数据,我们可以做到以下几点.
创建一个形成所需对象的辅助子网.j2:
{
{% for s in subnets %}
"{{ s.tags.Name }}":"{{ s.id }}" {% if not loop.last %},{% endif %}
{% endfor %}
}
Run Code Online (Sandbox Code Playgroud)
通过您的剧本中的查找来调用它:
- name: Populate SubnetIds
set_fact:
SubnetIds: "{{ lookup('template', 'subnets.j2') }}"
vars:
subnets: "{{ subnet_facts.subnets }}"
Run Code Online (Sandbox Code Playgroud)
作为模板程序的最后一步,Ansible尝试将JSON评估为对象,因此SubnetIds在此示例中将成为普通字典.
如果您为特定任务制作帮助程序模板,则可以使用subnet_facts.subnets而不是subnets在j2文件内部,因此不需要传递额外vars的subnets值.