首页 > 解决方案 > Ansible:将 JSON 值分配给变量

问题描述

我正在使用自定义事实模块在 Ansible 2.9 中获取 JSON

ok: [Host] => {
    "msg": {
        "changed": false,
        "failed": false,
        "msg": "Successfully completed the view storage volume operation",
        "storage_status": {
            "Message": {
                "Controller": {
                    "AHCI.Embedded.3-1": {},
                    "RAID.Integrated.1-1": {
                        "Enclosure": {
                            "Enclosure.Internal.0-1:RAID.Integrated.1-1": {
                                "PhysicalDisk": [
                                    "Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1",
                                    "Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1"
                                ]
                            }
                        },
                        "VirtualDisk": {
                            "Disk.Virtual.0:RAID.Integrated.1-1": {
                                "PhysicalDisk": [
                                    "Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1",
                                    "Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1"
                                ]
                            }
                        }
                    }
                }
            },
            "Status": "Success"
        }
    }
}

我想Disk.Virtual.0:RAID.Integrated.1-1使用 set_fact 模块将“”值分配给变量。使用以下过滤器:

{{ disks['storage_status']['Message']['Controller']['RAID.Integrated.1-1']['VirtualDisk'] }}

我只能选择以下内容:

ok : [Host] => {
        "msg": {
            "Disk.Virtual.0:RAID.Integrated.1-1": {
                "PhysicalDisk": [
                    "Disk.Bay.0:Enclosure.Internal.0-1:RAID.Integrated.1-1",
                    "Disk.Bay.1:Enclosure.Internal.0-1:RAID.Integrated.1-1"
                ]
            }
        }
    }

但我无法弄清楚如何抓取Disk.Virtual.0:RAID.Integrated.1-1并将其分配给变量。

任何帮助/指导将不胜感激。

谢谢

标签: jsonansible

解决方案


使用dict查找.key

  - debug:
      msg: "{{ lookup('dict', disks['storage_status']['Message']['Controller']['RAID.Integrated.1-1']['VirtualDisk']).key }}"

给出:

TASK [debug] *****************************************
ok: [localhost] => {
    "msg": "Disk.Virtual.0:RAID.Integrated.1-1"
}

要分配给变量 ( my_var),请使用set_fact

  - set_fact:
      my_var: "{{ lookup('dict', disks['storage_status']['Message']['Controller']['RAID.Integrated.1-1']['VirtualDisk']).key }}"

推荐阅读