如果json文件中的显示名称等于,我如何选择多个


Json输出我有
{
"data": [
{
"agent-config": {
"are-all-plugins-disabled": false,
"is-management-disabled": false,
"is-monitoring-disabled": false,
"plugins-config": null
},
"availability-config": {
"is-live-migration-preferred": null,
"recovery-action": "RESTORE_INSTANCE"
},
"availability-domain": "RRSt1",
"capacity-reservation-id": null,
"compartment-id": "ocid1.compartmeiox33bbyq",
"dedicated-vm-host-id": null,
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "ops",
"CreatedOn": "2022-01-05T19:34:56.443Z"
}
},
"display-name": "Dnode0",
"extended-metadata": {},
"fault-domain": "FAULT-DOMAIN-2",
"freeform-tags": {
"Type": "TEST-mongo"
},
"id": "ocid1.instance.oc1.me-jeozlnq7t4eqkfjlaxyq6a",
"image-id": "ocid1.image.om3jrq4i5gf4k2kq",
"instance-options": {
"are-legacy-imds-endpoints-disabled": false
},
"ipxe-script": null,
"launch-mode": "PARAVIRTUALIZED",
"launch-options": {
"boot-volume-type": "PARAVIRTUALIZED",
"firmware": "UEFI_64",
"is-consistent-volume-naming-enabled": true,
"is-pv-encryption-in-transit-enabled": false,
"network-type": "PARAVIRTUALIZED",
"remote-data-volume-type": "PARAVIRTUALIZED"
},
"lifecycle-state": "RUNNING",
"metadata": {},
"platform-config": null,
"preemptible-instance-config": null,
"region": "me-1",
"shape": "VM1",
"shape-config": {
"baseline-ocpu-utilization": null,
"gpu-description": null,
"gpus": 0,
"local-disk-description": null,
"local-disks": 0,
"local-disks-total-size-in-gbs": null,
"max-vnic-attachments": 2,
"memory-in-gbs": 15.0,
"networking-bandwidth-in-gbps": 1.0,
"ocpus": 1.0,
"processor-description": "2.0 GHz Intelu00ae Xeonu00ae Platinum 8167M (Skylake)"
},
"source-details": {
"boot-volume-size-in-gbs": null,
"boot-volume-vpus-per-gb": null,
"image-id": "ocid1.image.oc1.me-j3jrq4i5gf4k2kq",
"kms-key-id": null,
"source-type": "image"
},
"system-tags": {},
"time-created": "2022-01-05T19:34:56.894000+00:00",
"time-maintenance-reboot-due": null
},
{
"agent-config": {
"are-all-plugins-disabled": false,
"is-management-disabled": false,
"is-monitoring-disabled": false,
"plugins-config": null
},
"availability-config": {
"is-live-migration-preferred": null,
"recovery-action": "RESTORE_INSTANCE"
},
"availability-domain": "RRS-1",
"capacity-reservation-id": null,
"compartment-id": "ocid1.compartmentselksvqyp2aiox33bbyq",
"dedicated-vm-host-id": null,
"defined-tags": {
"Oracle-Tags": {
"CreatedBy": "ops",
"CreatedOn": "2022-01-05T19:38:08.746Z"
}
},
"display-name": "Application-Sandbox-WEBSERVER-20220715T184918",
"extended-metadata": {},
"fault-domain": "FAULT-DOMAIN-2",
"freeform-tags": {
"Type": "TEST-mongo"
},
"id": "ocid1.instanceathpfbjo7le5iosl4oa",
"image-id": "ocid1.image.oc1.mekdzloqgdctm3jrq4i5gf4k2kq",
"instance-options": {
"are-legacy-imds-endpoints-disabled": false
},
"ipxe-script": null,
"launch-mode": "PARAVIRTUALIZED",
"launch-options": {
"boot-volume-type": "PARAVIRTUALIZED",
"firmware": "UEFI_64",
"is-consistent-volume-naming-enabled": true,
"is-pv-encryption-in-transit-enabled": false,
"network-type": "PARAVIRTUALIZED",
"remote-data-volume-type": "PARAVIRTUALIZED"
},
"lifecycle-state": "RUNNING",
"metadata": {},
"platform-config": null,
"preemptible-instance-config": null,
"region": "me-jh-1",
"shape": "VM.Standard2.1",
"shape-config": {
"baseline-ocpu-utilization": null,
"gpu-description": null,
"gpus": 0,
"local-disk-description": null,
"local-disks": 0,
"local-disks-total-size-in-gbs": null,
"max-vnic-attachments": 2,
"memory-in-gbs": 15.0,
"networking-bandwidth-in-gbps": 1.0,
"ocpus": 1.0,
"processor-description": "2.0 GHz Intelu00ae Xeonu00ae Platinum 8167M (Skylake)"
},
"source-details": {
"boot-volume-size-in-gbs": null,
"boot-volume-vpus-per-gb": null,
"image-id": "ocid1.image.oc1.me5vkdzloqgdctm3jrq4i5gf4k2kq",
"kms-key-id": null,
"source-type": "image"
},
"system-tags": {},
"time-created": "2022-01-05T19:38:09.186000+00:00",
"time-maintenance-reboot-due": null
}

]}

可靠的调试:其中jsondata.data返回json输出

ictimecreated: "{{ jsondata.data| selectattr('display-name', 'equalto', 'MasimoSafetyNet-Sandbox-*-*' ) | list}}" 

现在这实际上是一个巨大的列表,我有Key值,比如";显示名称":"Application-Sandbox-WEBSERVER-2020715T184918";

现在,我想通过仅在显示名称具有ApplicationSandbox-(*wildcard(-(*通配符(时进行选择来创建列表形式的json对象

前两个术语保持不变,只有剩下的应该是通配符,它会发生变化。如何从json对象创建列表。我尝试搜索jmespath和jinja2模板,我也尝试过,但不适合我。

列表返回后,我应该能够获得image_id 的列表

[imageid_1,imageid2_]

只有显示名称具有应用程序沙盒的图像ID

*PS如果等于"是";Application-Sandbox-WEBSERVER-2020715T184918";元素被选中,但我想添加通配符而不是WEBSERVER-20222,所以我可以使用其他类似的元素


我也在努力"{{jsondata.data|(selectattr("显示名称"、"搜索"、"应用程序沙盒--"((和(selectatt("生命周期状态"、"等于"、"运行"(|list}}">

如果要测试通配符,请使用tests搜索。例如,

selectattr('display-name', 'search', 'MasimoSafetyNet-Sandbox-*-*' )

然后映射您想要的属性

map(attribute='image-id')

测试的完整剧本示例

shell> cat pb.yml
- hosts: localhost
vars:
ictimecreated: "{{ jsondata.data|
selectattr('display-name', 'search', 'Application-Sandbox-*-*' )|
map(attribute='image-id')|
list }}"
tasks:
- include_vars:
file: data7.json
name: jsondata
- debug:
var: ictimecreated

给出

ictimecreated:
- ocid1.image.oc1.mekdzloqgdctm3jrq4i5gf4k2kq

Q:";使多个条件">

A: 简化测试数据。例如,

data:
- availability-domain: R1
display-name: a-s-node0
image-id: ocid1.image.a
lifecycle-state: RUNNING
- availability-domain: R2
display-name: a-s-node0
image-id: ocid1.image.b
lifecycle-state: STOPPED
- availability-domain: R3
display-name: n-s-node1
image-id: ocid1.image.c
lifecycle-state: STOPPED
- availability-domain: R4
display-name: n-s-node2
image-id: ocid1.image.d
lifecycle-state: RUNNING

然后,按属性显示名称选择项目,并选择属性image id

d2: "{{ data|
selectattr('display-name', 'search', 'a-s-*' )|
map(attribute='image-id')|
list }}"

给出

d2:
- ocid1.image.a
- ocid1.image.b

您可以通过管道进行选择。例如,

d3: "{{ data|
selectattr('display-name', 'search', 'a-s-*' )|
selectattr('lifecycle-state', 'eq', 'RUNNING' )|
map(attribute='image-id')|
list }}"

给出

d3:
- ocid1.image.a

在测试之前,您可能需要简化这种复杂的结构。例如,使用ansible.utils.keep_keys从字典中选择密钥

test_keys: [availability-domain, display-name, image-id, lifecycle-state]
data: "{{ jsondata.data|map('ansible.utils.keep_keys', target=test_keys)|list }}"

最新更新