首页 > 解决方案 > 访问嵌套字典的值

问题描述

我正在执行一些单独的任务,以通过塔自动部署 VM。
基本上我只需要快速了解如何收集/使用任务中注册返回的各种属性。我有这个。

tasks:
  - name: Gather disk info from virtual machine using name
    vmware_guest_disk_info:
      hostname: "{{ vcenter }}"
      username: "{{ username }}"
      password: "{{ esxipassword }}"
      datacenter: "{{ datacenter }}"
      name: "{{ fqdn }}"
    register: disk_info
  - debug:
      var: disk_info

这会吐出我想要的信息。但是,对于我的生活,我无法弄清楚如何选择一个单一的属性。有人可以告诉我如何做到这一点(特别是对于backing_filename)财产?
我的意思是在powershell中它只是disk_info.backing_filename或类似的东西backing = $disk_info | select -expandproperty backing_filename。只是在寻找类似的东西。

输出截图

{
    "disk_info": {
        "guest_disk_info": {
            "0": {
                "key": 2000,
                "label": "Hard disk 1",
                "summary": "104,857,600 KB",
                "backing_filename": "[datastorex] vmname/vmname.vmdk",

标签: variablespropertiesansible

解决方案


公平地说,这并不像看起来那么简单,因为您的字典有一个 key 是string 0,但是,您disk_info.guest_disk_info.0.backing_filename是否会尝试访问一个 element 0,所以是一个 list ,而不是一个字典 key '0'

这将是一个解决您的问题的示例剧本:

- hosts: all
  gather_facts: yes

  tasks:
    - debug: 
        var: disk_info.guest_disk_info['0'].backing_filename
      vars: 
        disk_info:
          guest_disk_info:
            '0':
              key: 2000
              label: Hard disk 1
              summary: 104,857,600 KB
              backing_filename: "[datastorex] vmname/vmname.vmdk"

这给出了:

{
    "disk_info.guest_disk_info['0'].backing_filename": "[datastorex] vmname/vmname.vmdk"
}

虽然这也有效,但您会看到 YAML 表示的是完全不同的结构,还包括一个列表,而不仅仅是多个嵌套字典:

- hosts: all
  gather_facts: yes

  tasks:
    - debug: 
        var: disk_info.guest_disk_info.0.backing_filename
      vars: 
        disk_info:
          guest_disk_info:
            - key: 2000
              label: Hard disk 1
              summary: 104,857,600 KB
              backing_filename: "[datastorex] vmname/vmname.vmdk"

为了给你一个 JSON 的等价物,因为你似乎在理解 YAML 结构上有问题,你的输出是

{
  "disk_info": {
    "guest_disk_info": {
      "0": {
        "backing_filename": "[datastorex] vmname/vmname.vmdk"
      }
    }
  }
}

这可以通过disk_info.guest_disk_info['0'].backing_filename.
尽管

{
  "disk_info": {
    "guest_disk_info": [
      {
        "backing_filename": "[datastorex] vmname/vmname.vmdk"
      }
    ]
  }
}

可以通过disk_info.guest_disk_info.0.backing_filename


推荐阅读