簡體   English   中英

Ansible:使用循環遍歷 output 並獲取每個列表的值

[英]Ansible: iterate over output with loop and get values for each list

我不確定標題是否與我要詢問的內容相匹配,但我不知道要使用什么其他標題。

所以我的問題是:我要做的是從 VMWare 收集磁盤信息,並將每個磁盤的capacity_in_kb output 發布到一個文件中(但目前只是調試)。

- name: Gather disk info from virtual machine
  community.vmware.vmware_guest_disk_info:
    hostname: "{{ lookup('ansible.builtin.env', 'VMWARE_HOST') }}"
    username: "{{ lookup('ansible.builtin.env', 'VMWARE_USER') }}"
    password: "{{ lookup('ansible.builtin.env', 'VMWARE_PASSWORD') }}"
    validate_certs: no
    name: "{{ ansible_hostname }}"
    datacenter: "{{ lookup('ansible.builtin.env', 'VMWARE_HOST') }}"
  delegate_to: 127.0.0.1
  register: disk_info

- debug:
    var: disk_info

這將輸出以下內容:

{
  "disk_info": {
    "guest_disk_info": {
      "0": {
        "key": 2000,
        "label": "Hard disk 1",
        "summary": "16,777,216 KB",
        "backing_filename": "[xxx] xxx.vmdk",
        "backing_datastore": "xxx_log",
        "controller_key": 1000,
        "unit_number": 0,
        "capacity_in_kb": 16777216,
        "capacity_in_bytes": 17179869184,
        "backing_type": "FlatVer2",
        "backing_writethrough": false,
        "backing_thinprovisioned": false,
        "backing_eagerlyscrub": false,
        "backing_diskmode": "persistent",
        "backing_disk_mode": "persistent",
        "backing_uuid": "xxxxxxxxxxxxxxxx",
        "controller_bus_number": 0,
        "controller_type": "paravirtual"
      },
      "1": {
        "key": 2001,
        "label": "Hard disk 2",
        "summary": "262,144,000 KB",
        "backing_filename": "[xxx] xxx.vmdk",
        "backing_datastore": "xxx_log",
        "controller_key": 1000,
        "unit_number": 1,
        "capacity_in_kb": 262144000,
        "capacity_in_bytes": 268435456000,
        "backing_type": "FlatVer2",
        "backing_writethrough": false,
        "backing_thinprovisioned": false,
        "backing_eagerlyscrub": false,
        "backing_diskmode": "persistent",
        "backing_disk_mode": "persistent",
        "backing_uuid": "xxx",
        "controller_bus_number": 0,
        "controller_type": "paravirtual"
      }
    },
    "failed": false,
    "changed": false
  },
  "_ansible_verbose_always": true,
  "_ansible_no_log": false,
  "changed": false
}

我們現在想要為每個磁盤獲取capacity_in_kb 有些虛擬機只連接了一個磁盤,有些有兩個,有些三個等等......

我們嘗試了

- name: with_dict
  ansible.builtin.debug:
    msg: "{{ item.value.label }} - {{ item.value.capacity_in_kb }}"
  loop: "{{ disk_info.guest_disk_info|dict2items }}"

但這對我們也不起作用,只為我們提供了列表中第一個磁盤 [0] 的 output。

有人有想法嗎? 提前致謝:)

編輯:正如@β.εηοιτ.βε 指出的那樣

-  loop: "{{ disk_info|dict2items }}"
+  loop: "{{ disk_info.guest_disk_info|dict2items }}"

但它仍然只迭代第一個磁盤,而不是第二個、第三個等。

EDIT2:它有效,但我只是沒有看到它......愚蠢的我

如果要迭代數據,下面的任務

    - debug:
        msg: "{{ item.value.label }}: {{ item.value.capacity_in_kb }}"
      loop: "{{ disk_info.guest_disk_info|dict2items }}"
      loop_control:
        label: "{{ item.key }}"

ok: [localhost] => (item=0) => 
  msg: 'Hard disk 1: 16777216'
ok: [localhost] => (item=1) => 
  msg: 'Hard disk 2: 262144000'

下一個選項是避免迭代並創建字典

label_capacity_q: '*.[label, capacity_in_kb]'
label_capacity: "{{ dict(disk_info.guest_disk_info|
                         json_query(label_capacity_q)) }}"

label_capacity:
  Hard disk 1: 16777216
  Hard disk 2: 262144000

  • 用於測試的完整劇本示例
- hosts: localhost vars: label_capacity_q: '*.[label, capacity_in_kb]' label_capacity: "{{ dict(disk_info.guest_disk_info| json_query(label_capacity_q)) }}" tasks: - debug: var: label_capacity - debug: msg: "{{ item.key }}: {{ item.value }}" loop: "{{ label_capacity|dict2items }}" - debug: msg: |- {% for k,v in label_capacity.items() %} {{ k }}: {{ v }} {% endfor %}

給出(刪節)

 TASK [debug] ********************************************************************************* ok: [localhost] => label_capacity: Hard disk 1: 16777216 Hard disk 2: 262144000 TASK [debug] ********************************************************************************* ok: [localhost] => (item={'key': 'Hard disk 1', 'value': 16777216}) => msg: 'Hard disk 1: 16777216' ok: [localhost] => (item={'key': 'Hard disk 2', 'value': 262144000}) => msg: 'Hard disk 2: 262144000' TASK [debug] ********************************************************************************* ok: [localhost] => msg: |- Hard disk 1: 16777216 Hard disk 2: 262144000
  • 給定數據,例如在group_vars
 shell> cat group_vars/all/disk_info.yml --- disk_info: changed: false failed: false guest_disk_info: '0': backing_datastore: xxx_log backing_disk_mode: persistent backing_diskmode: persistent backing_eagerlyscrub: false backing_filename: '[xxx] xxx.vmdk' backing_thinprovisioned: false backing_type: FlatVer2 backing_uuid: xxxxxxxxxxxxxxxx backing_writethrough: false capacity_in_bytes: 17179869184 capacity_in_kb: 16777216 controller_bus_number: 0 controller_key: 1000 controller_type: paravirtual key: 2000 label: Hard disk 1 summary: 16,777,216 KB unit_number: 0 '1': backing_datastore: xxx_log backing_disk_mode: persistent backing_diskmode: persistent backing_eagerlyscrub: false backing_filename: '[xxx] xxx.vmdk' backing_thinprovisioned: false backing_type: FlatVer2 backing_uuid: xxx backing_writethrough: false capacity_in_bytes: 268435456000 capacity_in_kb: 262144000 controller_bus_number: 0 controller_key: 1000 controller_type: paravirtual key: 2001 label: Hard disk 2 summary: 262,144,000 KB unit_number: 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM