dictionary - Ansible - 如何将列表组合为嵌套字典中的值
问题描述
我有一个单独的列表和一个字典列表,我试图将它们组合成一个字典,以便在剧本中更有效地访问:
一个简单的列表,名为“volume_device_path”:
ok: [node1] => {
"volume_device_path": [
"/dev/sanstorage/0987654321",
"/dev/sanstorage/1234567890"
]
}
列表中的字典,名为“volumes”:
ok: [node1] => {
"volumes": [
{
"format_opts": null,
"fs_type": "xfs",
"mount_opts": "noatime",
"mount_path": "/data/fc100",
"storage_protocol": "fc",
"vol_desc": "ansible volume for fc",
"vol_name": "data100",
"vol_perf_pol": "high",
"vol_size": 100000,
"vol_suffix": "data100"
},
{
"format_opts": null,
"fs_type": "ext4",
"mount_opts": "noatime",
"mount_path": "/data/fc111",
"storage_protocol": "fc",
"vol_desc": "ansible volume for fc",
"vol_name": "data111",
"vol_size": 100000,
"vol_suffix": "data111"
}
]
}
我想创建一个名为“volumes_combined”的新字典,它看起来像这样,结合了两个早期的数据结构:
ok: [node1] => {
"volumes_combined": [
{
"volume_device_path": "/dev/sanstorage/0987654321",
"format_opts": null,
"fs_type": "xfs",
"mount_opts": "noatime",
"mount_path": "/data/fc100",
"storage_protocol": "fc",
"vol_desc": "ansible volume for fc",
"vol_name": "data100",
"vol_size": 100000,
"vol_suffix": "data100"
},
{
"volume_device_path": "/dev/sanstorage/1234567890",
"format_opts": null,
"fs_type": "ext4",
"mount_opts": "noatime",
"mount_path": "/data/fc111",
"storage_protocol": "fc",
"vol_desc": "ansible volume for fc",
"vol_name": "data111",
"vol_size": 100000,
"vol_suffix": "data111"
}
]
}
我能够与以下内容相当接近,但遇到了并发症。
'volume_device_path' 列表值不会像我希望的那样嵌套在字典中。如何将初始列表值组合到嵌套字典中?
- name: combine volumes input file and volume_device_paths
set_fact:
volumes_combined: "{{ volumes_combined|default({}) | combine({ item.0: item.1 }) }}"
loop: "{{ query('together', volume_device_path, volumes) }}"
调试输出:
ok: [node1] => {
"volumes_combined": {
"/dev/sanstorage/0987654321": {
"format_opts": null,
"fs_type": "xfs",
"mount_opts": "noatime",
"mount_path": "/data/fc100",
"storage_protocol": "fc",
"vol_desc": "ansible volume for fc",
"vol_name": "data100",
"vol_size": 100000,
"vol_suffix": "data100"
},
"/dev/sanstorage/1234567890": {
"format_opts": null,
"fs_type": "ext4",
"mount_opts": "noatime",
"mount_path": "/data/fc111",
"storage_protocol": "fc",
"voldesc": "ansible volume for fc",
"volname": "data111",
"volsize": 100000,
"volsuffix": "data111"
}
}
}
谢谢!
解决方案
问:“ ‘volume_device_path’列表值没有嵌套在字典中”
volumes_combined: "{{ volumes_combined|default({})|
combine({ item.0: item.1 }) }}"
答:需要进行一些修复
default([])
... 变量volumes_combined是一个列表。+
而不是combine
...将项目添加到列表中。[item.1|combine({'volume_device_path': item.0 })]
... 结合字典
volumes_combined: "{{ volumes_combined|default([]) +
[item.1|combine({'volume_device_path': item.0 })] }}"
推荐阅读
- javascript - Javascript骰子游戏:如何根据骰子结果删除HP?
- php - php中的数学问题
- sql-server - SQL Server 2008 结果透视
- vue.js - 我对 Vue 组件结构有一些疑问
- html - 如何在html中显示当地时间?
- javascript - 在节点js中获取json变量的嵌套属性
- linux - 禁用 TTY 中的行缓冲但保持启用 Ctrl+D
- java - Cant get Extras from intent when application is in background
- python - 多次拆分字符串并将结果作为新的DataFrame返回
- css - 使用css单击按钮时左右滑动