无法解析 Ansible Jinja2 中的 JSON 列表
Can't parse JSON list in Ansible Jinja2
我正在尝试解析以下 JSON 输出并提取 volume_id_attributes.name
和 volume_space_attributes.size_total
但它一直在说:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'str object' has no attribute 'volume_id_attributes'"}
这是我要解析的 JSON 输出的片段:
ok: [localhost] => {
"msg": {
"results": [
{
"item": "Application_Backups",
"ontap_info": {
"volume_info": {
"alfred_backup:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_backup"
},
"volume_space_attributes": {
"size_total": "357019156480",
}
},
"alfred_prod:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_prod"
},
"volume_space_attributes": {
"size_total": "397512166710",
}
},
"item": "Database_backups",
"ontap_info": {
"volume_info": {
"backup:Database_backups": {
"volume_id_attributes": {
"name": "backup"
},
"volume_space_attributes": {
"size_total": "754219156480",
}
},
"prod:Database_backups": {
"volume_id_attributes": {
"name": "prod"
},
"volume_space_attributes": {
"size_total": "398952211210",
}
}
]
这是 jinja2 脚本:
{% for svm in volumes.results %}
{% set svm_name = svm.item %}
<td style="text-align: center;" rowspan={{ volumes|length }} class="confluenceTd">{{ svm_name }}</td>
{% for volume in svm.ontap_info.volume_info %}
{% set volume_name = volume.volume_id_attributes.name %}
{% set volume_size_total = volume.volume_space_attributes.size_total %}
当我只打印 {{ volume }}
时,它会打印 alfred_backup:Application_Backups
和 alfred_prod:Application_Backups
但它不想进入他们的列表。
你能指出我做错了什么吗?
在 Jinja 中对列表执行 for 循环时,您确实得到了预期结果,这就是您的循环 {% for svm in volumes.results %}
有效的原因。
当你在字典上循环时,你只会得到字典的键,如果你像你这样循环:{% for volume in svm.ontap_info.volume_info %}
,所以,volume
将是你的字典键.
您想要实现的仍然是可能的,形式为
{% for key, value in dict.items() %}
如 Jinja 的文档所示:https://jinja.palletsprojects.com/en/2.11.x/templates/#for
所以完整的工作手册应该是
- hosts: all
gather_facts: no
tasks:
- debug:
msg: |
{% for svm in volumes.results %}
{% set svm_name = svm.item %}
<td style="text-align: center;" rowspan={{ volumes|length }} class="confluenceTd">{{ svm_name }}</td>
{% for key, volume in svm.ontap_info.volume_info.items() %}
{% set volume_name = volume.volume_id_attributes.name %}
{% set volume_size_total = volume.volume_space_attributes.size_total %}
<td>{{ volume_name }}</td>
<td>{{ volume_size_total }}</td>
{% endfor %}
{% endfor %}
vars:
{
"volumes": {
"results": [{
"item": "Application_Backups",
"ontap_info": {
"volume_info": {
"alfred_backup:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_backup"
},
"volume_space_attributes": {
"size_total": "357019156480"
}
},
"alfred_prod:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_prod"
},
"volume_space_attributes": {
"size_total": "397512166710"
}
}
}
}
},
{
"item": "Database_backups",
"ontap_info": {
"volume_info": {
"backup:Database_backups": {
"volume_id_attributes": {
"name": "backup"
},
"volume_space_attributes": {
"size_total": "754219156480"
}
},
"prod:Database_backups": {
"volume_id_attributes": {
"name": "prod"
},
"volume_space_attributes": {
"size_total": "398952211210"
}
}
}
}
}
]
}
}
结果是 HTML 片段:
<td style="text-align: center;" rowspan=1 class="confluenceTd">Application_Backups</td>
<td>alfred_backup</td>
<td>357019156480</td>
<td>alfred_prod</td>
<td>397512166710</td>
<td style="text-align: center;" rowspan=1 class="confluenceTd">Database_backups</td>
<td>backup</td>
<td>754219156480</td>
<td>prod</td>
<td>398952211210</td>
我正在尝试解析以下 JSON 输出并提取 volume_id_attributes.name
和 volume_space_attributes.size_total
但它一直在说:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'str object' has no attribute 'volume_id_attributes'"}
这是我要解析的 JSON 输出的片段:
ok: [localhost] => {
"msg": {
"results": [
{
"item": "Application_Backups",
"ontap_info": {
"volume_info": {
"alfred_backup:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_backup"
},
"volume_space_attributes": {
"size_total": "357019156480",
}
},
"alfred_prod:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_prod"
},
"volume_space_attributes": {
"size_total": "397512166710",
}
},
"item": "Database_backups",
"ontap_info": {
"volume_info": {
"backup:Database_backups": {
"volume_id_attributes": {
"name": "backup"
},
"volume_space_attributes": {
"size_total": "754219156480",
}
},
"prod:Database_backups": {
"volume_id_attributes": {
"name": "prod"
},
"volume_space_attributes": {
"size_total": "398952211210",
}
}
]
这是 jinja2 脚本:
{% for svm in volumes.results %}
{% set svm_name = svm.item %}
<td style="text-align: center;" rowspan={{ volumes|length }} class="confluenceTd">{{ svm_name }}</td>
{% for volume in svm.ontap_info.volume_info %}
{% set volume_name = volume.volume_id_attributes.name %}
{% set volume_size_total = volume.volume_space_attributes.size_total %}
当我只打印 {{ volume }}
时,它会打印 alfred_backup:Application_Backups
和 alfred_prod:Application_Backups
但它不想进入他们的列表。
你能指出我做错了什么吗?
在 Jinja 中对列表执行 for 循环时,您确实得到了预期结果,这就是您的循环 {% for svm in volumes.results %}
有效的原因。
当你在字典上循环时,你只会得到字典的键,如果你像你这样循环:{% for volume in svm.ontap_info.volume_info %}
,所以,volume
将是你的字典键.
您想要实现的仍然是可能的,形式为
{% for key, value in dict.items() %}
如 Jinja 的文档所示:https://jinja.palletsprojects.com/en/2.11.x/templates/#for
所以完整的工作手册应该是
- hosts: all
gather_facts: no
tasks:
- debug:
msg: |
{% for svm in volumes.results %}
{% set svm_name = svm.item %}
<td style="text-align: center;" rowspan={{ volumes|length }} class="confluenceTd">{{ svm_name }}</td>
{% for key, volume in svm.ontap_info.volume_info.items() %}
{% set volume_name = volume.volume_id_attributes.name %}
{% set volume_size_total = volume.volume_space_attributes.size_total %}
<td>{{ volume_name }}</td>
<td>{{ volume_size_total }}</td>
{% endfor %}
{% endfor %}
vars:
{
"volumes": {
"results": [{
"item": "Application_Backups",
"ontap_info": {
"volume_info": {
"alfred_backup:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_backup"
},
"volume_space_attributes": {
"size_total": "357019156480"
}
},
"alfred_prod:Application_Backups": {
"volume_id_attributes": {
"name": "alfred_prod"
},
"volume_space_attributes": {
"size_total": "397512166710"
}
}
}
}
},
{
"item": "Database_backups",
"ontap_info": {
"volume_info": {
"backup:Database_backups": {
"volume_id_attributes": {
"name": "backup"
},
"volume_space_attributes": {
"size_total": "754219156480"
}
},
"prod:Database_backups": {
"volume_id_attributes": {
"name": "prod"
},
"volume_space_attributes": {
"size_total": "398952211210"
}
}
}
}
}
]
}
}
结果是 HTML 片段:
<td style="text-align: center;" rowspan=1 class="confluenceTd">Application_Backups</td>
<td>alfred_backup</td>
<td>357019156480</td>
<td>alfred_prod</td>
<td>397512166710</td>
<td style="text-align: center;" rowspan=1 class="confluenceTd">Database_backups</td>
<td>backup</td>
<td>754219156480</td>
<td>prod</td>
<td>398952211210</td>