loops - Ansible 从另一个列表中检索键的值
问题描述
我有下面的唯一键列表的 json。
{
"image_names": [
{
"name": "sles-11-factory-os-ready"
},
{
"name": "sles-11-factory-base-vg00"
},
{
"name": "sles-11-factory-base"
},
{
"name": "rhel-7-factory-os-ready"
},
{
"name": "sles-12-factory-os-ready"
},
{
"name": "rhel-6-factory-os-ready"
},
{
"name": "rhel-7-factory-base-vg00"
},
{
"name": "sles-12-factory-base-vg00"
},
{
"name": "rhel-6-factory-base-vg00"
},
{
"name": "rhel-7-factory-base"
},
{
"name": "rhel-6-factory-base"
},
{
"name": "sles-12-factory-base"
}
]
}
我有另一个具有上述键但具有不同值的 json。
{
"rhel-7-factory-os-ready" : [
{
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-07T15:51:00Z"
},
{
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-07T15:51:00Z"
},
{
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-07T15:51:00Z"
}
],
"rhel-6-factory-os-ready" : [
{
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-07T15:51:00Z"
},
{
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-07T15:51:00Z"
},
{
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-07T15:51:00Z"
}
]
}
我试图通过迭代每个图像来通过更新的日期时间值检索最旧的图像。updated
最终,当按图像字段排序时,我期待下面的旧图像数据rhel-6-factory-base
集
skipping: [localhost] => (item={'updated': u'2019-05-07T15:20:39Z', 'name': u'rhel-6-factory-base', 'id': u'30109a53-4aab-4fb5-87ff-7650e75731b0'})
ok: [localhost] => (item={'updated': u'2019-05-07T12:21:36Z', 'name': u'rhel-6-factory-base', 'id': u'294821b3-e9df-4b12-ae39-8deb8f9c72ff'}) => {
"msg": "The images to be deleted are: 294821b3-e9df-4b12-ae39-8deb8f9c72ff"
}
ok: [localhost] => (item={'updated': u'2019-04-29T14:04:20Z', 'name': u'rhel-6-factory-base', 'id': u'068ae5f0-d7a0-4419-829e-18eb25551c94'}) => {
"msg": "The images to be deleted are: 068ae5f0-d7a0-4419-829e-18eb25551c94"
}
我试过下面的ansible但没有运气!
- name: Print the old images
debug:
msg: "The images to be deleted are: {{ item.id }}"
when:
- item|length > 1
- index != 0
- item.id is defined
# loop: "{{ grouped_by_name['rhel-6-factory-base'] }}"
with_subelements:
- "{{ image_names | map(attribute='name') | list }}"
- grouped_by_name
loop_control:
index_var: index
在上面的代码片段中,image_names
& grouped_by_name
vars 分别是前两个数据集。
我怎么能从vargrouped_by_name
传递的键中进行双循环?image_names
如果问题不清楚,请随时发表评论,我会尝试改写它。
解决方案
如果我正确理解了您的问题,那么您实际上根本不需要嵌套循环。您的目标是为字典中的每个键找到最旧的图像。我们可以这样做:
- hosts: localhost
gather_facts: false
vars:
images:
rhel-7-factory-os-ready:
- id: 79334504-3e48-4411-b602-afe920e32e14
updated: '2019-05-04T15:51:00Z'
- id: 79334504-3e48-4411-b602-afe920e32e14
updated: '2019-05-01T15:51:00Z'
- id: 79334504-3e48-4411-b602-afe920e32e14
updated: '2019-05-07T15:51:00Z'
rhel-6-factory-os-ready:
- id: 79334504-3e48-4411-b602-afe920e32e14
updated: '2019-05-09T15:51:00Z'
- id: 79334504-3e48-4411-b602-afe920e32e14
updated: '2019-05-03T15:51:00Z'
- id: 79334504-3e48-4411-b602-afe920e32e14
updated: '2019-05-01T15:51:00Z'
thing-with-a-single-image:
- id: 12345678-1234-1234-1234-123456789123
updated: '2019-05-01T15:51:00Z'
tasks:
- debug:
msg:
image_name: "{{ item.key }}"
image_to_delete: "{{ item.value|sort(attribute='updated')|first }}"
when: item.value|length > 1
loop: "{{ images|dict2items }}"
loop_control:
label: "{{ item.key }}"
thenwhen
语句是为了确保如果图像是列表中的唯一项目,我们不会删除它。
这将产生:
TASK [debug] **********************************************************************************
ok: [localhost] => (item=rhel-6-factory-os-ready) => {
"msg": {
"image_name": "rhel-6-factory-os-ready",
"image_to_delete": {
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-01T15:51:00Z"
}
}
}
ok: [localhost] => (item=rhel-7-factory-os-ready) => {
"msg": {
"image_name": "rhel-7-factory-os-ready",
"image_to_delete": {
"id": "79334504-3e48-4411-b602-afe920e32e14",
"updated": "2019-05-01T15:51:00Z"
}
}
}
skipping: [localhost] => (item=thing-with-a-single-image)
推荐阅读
- regex - 正则表达式 - 在字符串中查找特定单词,无论是前面还是后面都没有或没有任何非字母
- vue-router - Vue路由器,错误:通过导航守卫将*重定向到*
- php - My code in laravel can't call back data from data base to update
- c# - 使用设计器将 BackgroundWorker 组件拖放到表单上,或仅通过代码实例化变量之间的区别
- node.js - puppeteer show result in screenshot but cant get value of that result
- wordpress - How to build the head tag?
- html - 引导数据表无法与 thymeleaf th:block 一起正常工作
- ios - iOS - Revoking a submitted binary
- node.js - ubuntu 上 Raspberry PI 上的 Puppeteer 有时会给出“评估失败:TypeError:无法读取 null 的属性 'textContent'”
- c# - 在 Unity 中检测重叠的多边形二维碰撞器