![](/img/trans.png)
[英]Iterate over a dictionary and changing the value of each item based on a condition in a loop in Ansible
[英]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
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.