问题描述
我期待着一种从嵌套变量(具有字典和列表值)中列出值的方法,即 register
是 response_find
并且我主要采用 json 格式和大多数json 中的值嵌套在 []
列表中,如构造。
如果我像下面那样从中获取单个值,它会以某种方式工作:
var=response_find['json']['results'][0]['content_facet_attributes']
或
var=response_find['json']['results'][0]['certname']
但是当我在下面做的时候没有用:
var=response_find['json']['results'][0]['content_view_id']
以下是我期待从这个嵌套输出中获取的几个值:
"architecture_name": "x86_64","name": "satcap.rest.example.com","url": "https://satcap.rest.example.com:9090"
"content_source_name": "satcap.rest.example.com","name": "ccv-azure-infra-rhel7"
"name": "Prod"
"id": 33485,"ip": "192.168.88.88","name": "invwharn108.test.exampl.com","registered_through": "satcap.rest.example.com"
嵌套的 Json 输出:
{
"response_find": {
"apipie_checksum": "7533ab625c45a3819647f4fb4c9394c2832c0180","cookies": {
"_session_id": "25872833d9e2723073797fbd8cfa2d63"
},"cookies_string": "_session_id=25872833d9e2723073797fbd8cfa2d63","foreman_version": "1.24.1.21","json": {
"page": 1,"per_page": 20,"results": [
{
"architecture_id": 1,"architecture_name": "x86_64","build": false,"capabilities": [
"build"
],"certname": "invwharn108.test.exampl.com","comment": null,"content_facet_attributes": {
"applicable_module_stream_count": 0,"applicable_package_count": 0,"content_source": {
"id": 17,"url": "https://satcap.rest.example.com:9090"
},"content_source_id": 17,"content_source_name": "satcap.rest.example.com","content_view": {
"id": 67,"name": "ccv-azure-infra-rhel7"
},"content_view_id": 67,"content_view_name": "ccv-azure-infra-rhel7","errata_counts": {
"bugfix": 0,"enhancement": 0,"security": 0,"total": 0
},"id": 32255,"kickstart_repository": {
"id": 5772,"name": "Red Hat Enterprise Linux 7 Server Kickstart x86_64 7.8"
},"kickstart_repository_id": 5772,"kickstart_repository_name": "5772","lifecycle_environment": {
"id": 5,"name": "Prod"
},"lifecycle_environment_id": 5,"lifecycle_environment_name": "Prod","upgradable_module_stream_count": 0,"upgradable_package_count": 0,"uuid": "dab2d66b-1a73-490a-aa9d-3f036658980a"
},"created_at": "2020-12-23 13:19:35 UTC","disk": null,"domain_id": 25,"domain_name": "test.example-aws.example.com","enabled": true,"environment_id": null,"environment_name": null,"errata_status": 1,"errata_status_label": "Could not calculate errata status,ensure host is registered and the katello-host-tools package is installed","global_status": 1,"global_status_label": "Warning","hostgroup_id": 982,"hostgroup_name": "infra","hostgroup_title": "NXDI-hg-aws/west-europe/infra","id": 33485,"image_file": "","image_id": null,"image_name": null,"installed_at": null,"ip6": null,"last_compile": "2020-12-23 13:19:38 UTC","last_report": null,"location_id": 37,"location_name": "west-europe","mac": "02:78:43:60:ee:fb","managed": false,"medium_id": null,"medium_name": null,"model_id": 25,"model_name": "HVM domU","openscap_proxy": null,"openscap_proxy_id": null,"openscap_proxy_name": null,"operatingsystem_id": 21,"operatingsystem_name": "RedHat 7.8","organization_id": 3,"pxe_loader": "PXELinux BIOS","subnet_id": 65,"subnet_name": "aws-west-europe-infra","subscription_facet_attributes": {
"autoheal": true,"hypervisor": false,"id": 33593,"last_checkin": "2020-12-23 13:19:42 UTC","purpose_addons": [],"purpose_role": "","purpose_usage": "","registered_at": "2020-12-23 13:19:35 UTC","registered_through": "satcap.rest.example.com",},"subscription_global_status": 1,"subscription_status": 1,"subscription_status_label": "Partially entitled",}
],"search": "name=invwharn108.test.exampl.com","sort": {
"by": null,"order": null
},"subtotal": 1,"total": 13121
},"msg": "OK (unknown bytes)","x_request_id": "e02dd9b3-b2f8-4c39-8bf5-1ce1897d9548",}
}
我的游戏:
---
- hosts: localhost
tasks:
- include_vars: vaults/aws_secrets.yml
no_log: true
- include_vars: requirements.yml
no_log: true
- name: Find the ID of Cloud VM in Satellite
uri:
url: "https://{{ satserver }}/api/v2/hosts?search=name={{ aws_instance_name }}"
method: GET
user: "{{ aws_satuser }}"
password: "{{ aws_satpw }}"
force_basic_auth: yes
validate_certs: no
register: response_find
delegate_to: localhost
changed_when: false
- debug:
var=response_find['json']['results'][0]['content_facet_attributes']
#var=response_find.json.results.0.organization_name
#var=response_find['json']['results'][0]['certname']
结果:
"content_facet_attributes": {
"applicable_module_stream_count": 0,"content_source": {
"id": 17,"url": "https://satcap.rest.example.com:9090"
},"content_view": {
"id": 67,"name": "ccv-azure-infra-rhel7"
},"errata_counts": {
"bugfix": 0,"total": 0
},"kickstart_repository": {
"id": 5772,"name": "Red Hat Enterprise Linux 7 Server Kickstart x86_64 7.8"
},"lifecycle_environment": {
"id": 5,"name": "Prod"
},"uuid": "dab2d66b-1a73-490a-aa9d-3f036658980a"
},
解决方法
如果您想从列出的数据中提取字典,您可以使用过滤器 json_query
,它使用 JMESPath 来解析和处理 JSON。
为了提取一个看起来像这样的字典:
{
"architecture_name": "x86_64","content_source_name": "satcap.rest.example.com","content_source_url": "https://satcap.rest.example.com:9090","content_view_name": "ccv-azure-infra-rhel7","egistered_through": "satcap.rest.example.com","id": 33485,"ip": "192.168.88.88","lifecycle_environment_name": "Prod","name": "invwharn108.test.exampl.com"
}
您可以使用 JMESPath 到 filter multiselect hashes。
这是一个 JMESPath 查询,它会给出这个结果:
json.results[*].{
"architecture_name": architecture_name,"content_source_name": content_facet_attributes.content_source.name,"content_source_url": content_facet_attributes.content_source.url,"content_view_name": content_facet_attributes.content_view.name,"lifecycle_environment_name": content_facet_attributes.lifecycle_environment.name,"id": id,"ip": ip,"name": name,"egistered_through": subscription_facet_attributes.registered_through
}
这是一个使用它的示例剧本:
- hosts: localhost
gather_facts: no
tasks:
- debug:
msg: >-
{{
(
response_find | json_query('
json.results[*].{
"architecture_name": architecture_name,"egistered_through": subscription_facet_attributes.registered_through
}
')
).0
}}
vars:
{
"response_find": {
"apipie_checksum": "7533ab625c45a3819647f4fb4c9394c2832c0180","cookies": {
"_session_id": "25872833d9e2723073797fbd8cfa2d63"
},"cookies_string": "_session_id=25872833d9e2723073797fbd8cfa2d63","foreman_version": "1.24.1.21","json": {
"page": 1,"per_page": 20,"results": [{
"architecture_id": 1,"architecture_name": "x86_64","build": false,"capabilities": [
"build"
],"certname": "invwharn108.test.exampl.com","comment": null,"content_facet_attributes": {
"applicable_module_stream_count": 0,"applicable_package_count": 0,"content_source": {
"id": 17,"name": "satcap.rest.example.com","url": "https://satcap.rest.example.com:9090"
},"content_source_id": 17,"content_view": {
"id": 67,"name": "ccv-azure-infra-rhel7"
},"content_view_id": 67,"errata_counts": {
"bugfix": 0,"enhancement": 0,"security": 0,"total": 0
},"id": 32255,"kickstart_repository": {
"id": 5772,"name": "Red Hat Enterprise Linux 7 Server Kickstart x86_64 7.8"
},"kickstart_repository_id": 5772,"kickstart_repository_name": "5772","lifecycle_environment": {
"id": 5,"name": "Prod"
},"lifecycle_environment_id": 5,"upgradable_module_stream_count": 0,"upgradable_package_count": 0,"uuid": "dab2d66b-1a73-490a-aa9d-3f036658980a"
},"created_at": "2020-12-23 13:19:35 UTC","disk": null,"domain_id": 25,"domain_name": "test.example-aws.example.com","enabled": true,"environment_id": null,"environment_name": null,"errata_status": 1,"errata_status_label": "Could not calculate errata status,ensure host is registered and the katello-host-tools package is installed","global_status": 1,"global_status_label": "Warning","hostgroup_id": 982,"hostgroup_name": "infra","hostgroup_title": "NXDI-hg-aws/west-europe/infra","image_file": "","image_id": null,"image_name": null,"installed_at": null,"ip6": null,"last_compile": "2020-12-23 13:19:38 UTC","last_report": null,"location_id": 37,"location_name": "west-europe","mac": "02:78:43:60:ee:fb","managed": false,"medium_id": null,"medium_name": null,"model_id": 25,"model_name": "HVM domU","name": "invwharn108.test.exampl.com","openscap_proxy": null,"openscap_proxy_id": null,"openscap_proxy_name": null,"operatingsystem_id": 21,"operatingsystem_name": "RedHat 7.8","organization_id": 3,"pxe_loader": "PXELinux BIOS","subnet_id": 65,"subnet_name": "aws-west-europe-infra","subscription_facet_attributes": {
"autoheal": true,"hypervisor": false,"id": 33593,"last_checkin": "2020-12-23 13:19:42 UTC","purpose_addons": [],"purpose_role": "","purpose_usage": "","registered_at": "2020-12-23 13:19:35 UTC","registered_through": "satcap.rest.example.com"
},"subscription_global_status": 1,"subscription_status": 1,"subscription_status_label": "Partially entitled"
}],"search": "name=invwharn108.test.exampl.com","sort": {
"by": null,"order": null
},"subtotal": 1,"total": 13121
},"msg": "OK (unknown bytes)","x_request_id": "e02dd9b3-b2f8-4c39-8bf5-1ce1897d9548"
}
}
回顾一下:
PLAY [localhost] *************************************************************************************************
TASK [debug] *****************************************************************************************************
ok: [localhost] => {
"msg": {
"architecture_name": "x86_64","name": "invwharn108.test.exampl.com"
}
}
PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0