我正在尝试使用下面的ansible模块获取vlan_id信息。
- name: Get all portgroups in dvswitch vDS
vmware_dvs_portgroup_find:
hostname: "{{ vsphere_host }}"
username: "{{ vcenter_user }}"
password: "{{ vcenter_password }}"
dvswitch: 'test-123' --- dvswitch
validate_certs: no
with_items: "{{ dvswitch_list }}"
register: test
- debug: msg="{{ test }}"我正在以下面的格式出来。
"results": [
{
"ansible_loop_var": "item",
"changed": false,
"dvs_portgroups": [
{
"dvswitch": "test-123",
"name": "DPortGroup2",
"pvlan": false,
"trunk": false,
"vlan_id": "220"
},
{
"dvswitch": "test-123",
"name": "PP1",
"pvlan": false,
"trunk": false,
"vlan_id": "465"
},
{
"dvswitch": "test-123",
"name": "PP2",
"pvlan": false,
"trunk": false,
"vlan_id": "685"
},我正在使用下面的调试msg来获取vlan_id,但有些方法是不工作的。
- debug: msg="{{ item.vlan_id }}"
with_items: "{{ test.results.dvs_portgroups }}"
ASK [role_vmware_datastore_size : debug] ********************************************************************************
fatal: [192.168.90.00]: FAILED! => {"msg": "'list object' has no attribute 'dvs_portgroups'"}发布于 2020-09-10 20:43:04
test.results是vmware_dvs_portgroup_find任务的with_items的每个项的结果列表。因此,在访问每个元素的字段之前,您必须遍历这个列表。
如果要迭代所有结果的所有dvs_portgroups,可以这样做:
- debug: msg="{{ item.vlan_id }}"
with_items: "{{ test.results | map(attribute='dvs_portgroups') | flatten | list }}"map(attribute='dvs_portgroups')将结果列表转换为每个result| flatten的dvs_portgroups列表,将列表( dvs_portgroups)转换为每个lists| list的所有元素的列表,将迭代器转换回可由with_items解释的列表。
发布于 2020-09-11 08:44:50
以上调试代码运行良好。我得到了vlan_id的名单。只是为了增加更多的细节。我有4个dvswich,并从所有dvswtich获取vlan_id。我想让它的格式像每个dvswitch名称一样,在那里使用vlan_id。
test-123 -- dvswith name
220
221
222
test-456 -- dvswtich name
300
301
302我正在尝试下面的方式,但它只从每个dvswitch中提供一个vlan_id。
- name: Final VLAN Details
set_fact:
vlan_details: "{{ vlan_details | default([]) + [dict(name=item[0], size=item[1])] }}"
loop: "{{ dvswitch | zip(vlan_id) | list }}"
loop_control:
label: " "https://stackoverflow.com/questions/63832244
复制相似问题