访问嵌套字典的值

时间:2021-02-26 20:17:55

标签: variables properties ansible

我正在处理一些单独的任务,以便通过 Tower 实现 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",

1 个答案:

答案 0 :(得分:0)

公平地说,这并不像看起来那么简单,因为你的字典有一个键是 string 0,但是,你会做 disk_info.guest_disk_info.0.backing_filename您会尝试访问元素 0,因此是列表,而不是字典键 '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

访问