如何在ansible中的列表上运行嵌套for循环



Am正在尝试获取每个机柜上每个设备的状态。为此:

  1. 首先获取机柜计数
  2. 现在,获取每个机柜的设备托架上的设备计数
  3. 现在,运行嵌套循环以获取enclosureCount中每个机柜的设备ie的状态对于deviceCount中的每个设备获取设备状态

在下面的代码中,我试图通过获取enclosurelist、devicelist和使用嵌套循环来做到这一点

tasks:
- name: get the enclosure details
enclosure_facts:
config: "{{ config }}"
delegate_to: localhost
register: result
- name: set the enclosure count
set_fact:
enclosure_count: "{{ result.ansible_facts.enclosures|length }}"
- debug: var=enclosure_count
- name: generate a list for number of enclosure_count value
set_fact:
enclosurelist: "{{ enclosurelist | default([]) + [item | int]  }}"
with_sequence: start=0 end="{{enclosure_count|int - 1}}"
- name: display the enclosurelist values
debug: var=enclosurelist
- name: Create a list with device number length
vars:
current_number: "{{ result.ansible_facts.enclosures[item].deviceBays | length }}"
set_fact:
device_numbers: "{{ device_numbers | default([]) + [current_number] }}"
loop: "{{ range(0, enclosure_count | int) | list }}"
- name: Show device_numbers list
debug:
var: device_numbers
- name: with_nested loop to display status fo each deviceBays on each enclosures
debug: var=result.ansible_facts.enclosures.{{item[0]}}.deviceBays.{{item[1]}}.devicePresence
#with_list:
#with_indexed_items:
with_nested:
- "{{ enclosurelist }}"
#- "{{ device_numbers|int -1 }}"
- "{{ device_numbers}}"

嵌套循环的当前输出不是通过每个设备计数,而是静态/单个值,即10

ok: [localhost] => (item=[0, u'10']) => {
"item": [
0,
"10"
],
"result.ansible_facts.enclosures.0.deviceBays.10.devicePresence": "VARIABLE IS NOT DEFINED!: list object has no element 10"
}
ok: [localhost] => (item=[0, u'10']) => {
"item": [
0,
"10"
],
"result.ansible_facts.enclosures.0.deviceBays.10.devicePresence": "VARIABLE IS NOT DEFINED!: list object has no element 10"
}
ok: [localhost] => (item=[0, u'10']) => {
"item": [
0,
"10"
],
"result.ansible_facts.enclosures.0.deviceBays.10.devicePresence": "VARIABLE IS NOT DEFINED!: list object has no element 10"
}
ok: [localhost] => (item=[1, u'10']) => {
"item": [
1,
"10"
],
"result.ansible_facts.enclosures.1.deviceBays.10.devicePresence": "VARIABLE IS NOT DEFINED!: list object has no element 10"
}

"变量未定义!:列表对象没有元素10"的错误与实际值从0-9 开始有关

enclosure_facts结果:

{
"ansible_facts": {
"enclosures": [
{
"deviceBayCount": 12,
"deviceBays": [
{
"bayNumber": 1,
"devicePresence": "Present"
},
{
"bayNumber": 2,
"devicePresence": "Present"
},
{
"bayNumber": 3,
"devicePresence": "Present"
},
{
"bayNumber": 4,
"devicePresence": "Present"
},
{
"bayNumber": 5,
"devicePresence": "Absent"
},
{
"bayNumber": 6,
"devicePresence": "Absent"
},
{
"bayNumber": 7,
"devicePresence": "Absent"
},
{
"bayNumber": 8,
"devicePresence": "Absent"
},
{
"bayNumber": 9,
"devicePresence": "Present"
},
{
"bayNumber": 10,
"devicePresence": "Present"
},
{
"bayNumber": 11,
"devicePresence": "Absent"
},
{
"bayNumber": 12,
"devicePresence": "Absent"
}
]
},
{
"deviceBayCount": 12,
"deviceBays": [
{
"bayNumber": 1,
"devicePresence": "Present"
},
{
"bayNumber": 2,
"devicePresence": "Present"
},
{
"bayNumber": 3,
"devicePresence": "Present"
},
{
"bayNumber": 4,
"devicePresence": "Present"
},
{
"bayNumber": 5,
"devicePresence": "Absent"
},
{
"bayNumber": 6,
"devicePresence": "Absent"
},
{
"bayNumber": 7,
"devicePresence": "Absent"
},
{
"bayNumber": 8,
"devicePresence": "Absent"
},
{
"bayNumber": 9,
"devicePresence": "Absent"
},
{
"bayNumber": 10,
"devicePresence": "Absent"
},
{
"bayNumber": 11,
"devicePresence": "Absent"
},
{
"bayNumber": 12,
"devicePresence": "Absent"
}
]
}
]
},
"changed": false,
"invocation": {
"module_args": {
"config": "",
"password": null,
"username": null
}
}
}

我觉得你在计算很多事情,只是为了在ansible可以为你做这项工作时进一步循环。我还了解到您希望访问/显示每个机柜的索引(索引不在当前数据中(。

我在下面的例子中稍微减少了你的数据样本,但我认为它几乎满足了你的所有需求。只需进行调整,就可以使用循环执行更多任务,以显示/运行具有相关数据的模块

注意:当我在评论中要求MCVE时,这正是我所想的:一个你可以直接复制和运行的剧本,而不必把所有的部分放在一起。请考虑一下,以备将来的问题和答案。

---
- name: Manipulate result list demo
hosts: localhost
gather_facts: false
vars:
# Data structure reduced and minimfied on single line
result: {ansible_facts: {enclosures: [{deviceBayCount: 2, deviceBays: [{bayNumber: 1, devicePresence: Present}, {bayNumber: 2, devicePresence: Present}]}, {deviceBayCount: 4, deviceBays: [{bayNumber: 1, devicePresence: Present}, {bayNumber: 2, devicePresence: Present}, {bayNumber: 3, devicePresence: Absent}, {bayNumber: 4, devicePresence: Absent}]}]}, changed: false, invocation: {module_args: {config: , password: null, username: null}}}
tasks:
- name: Show initial data (use -v to show)
debug:
var: result
verbosity: 1
- name: Create a single structure containing all the data we need
vars:
my_current_enclosure:
enclosure_number: "{{ index }}"
number_of_devices: "{{ item.deviceBays | length }}"
## Note this later one can probably be replaced by following ?
# number_of_devices: "{{ item.deviceBayCount }}"
deviceBays: "{{ item.deviceBays }}" #  simply copy existing data
set_fact:
my_enclosures: "{{ my_enclosures | default([]) + [my_current_enclosure] }}"
loop: "{{ result.ansible_facts.enclosures | flatten(levels=1) }}"
loop_control:
index_var: index
- name: Show the new calculated data structure (use -v to show)
debug:
var: my_enclosures
verbosity: 1
- name: Display device number for each enclosure
debug:
msg: "Enclosure number {{ item.enclosure_number }} has {{ item.number_of_devices }} device(s)"
loop: "{{ my_enclosures }}"
- name: Show status of each device bay
debug:
msg: "Enclosure: {{ item.0.enclosure_number }} - Bay number: {{ item.1.bayNumber }} - Status: {{ item.1.devicePresence }}"
loop: "{{ lookup('subelements', my_enclosures, 'deviceBays') }}"

结果(用-v详细运行(

PLAY [Manipulate result list demo] **************************************************************************************************************************************************************************************************************************************
TASK [Show initial data (use -v to show)] *******************************************************************************************************************************************************************************************************************************
skipping: [localhost]
TASK [Create a single structure containing all the data we need] ********************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'deviceBayCount': 2, 'deviceBays': [{'bayNumber': 1, 'devicePresence': 'Present'}, {'bayNumber': 2, 'devicePresence': 'Present'}]})
ok: [localhost] => (item={'deviceBayCount': 4, 'deviceBays': [{'bayNumber': 1, 'devicePresence': 'Present'}, {'bayNumber': 2, 'devicePresence': 'Present'}, {'bayNumber': 3, 'devicePresence': 'Absent'}, {'bayNumber': 4, 'devicePresence': 'Absent'}]})
TASK [Show the new calculated data structure (use -v to show)] **********************************************************************************************************************************************************************************************************
skipping: [localhost]
TASK [Display device number for each enclosure] *************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item={'enclosure_number': 0, 'number_of_devices': '2', 'deviceBays': [{'bayNumber': 1, 'devicePresence': 'Present'}, {'bayNumber': 2, 'devicePresence': 'Present'}]}) => {
"msg": "Enclosure number 0 has 2 device(s)"
}
ok: [localhost] => (item={'enclosure_number': 1, 'number_of_devices': '4', 'deviceBays': [{'bayNumber': 1, 'devicePresence': 'Present'}, {'bayNumber': 2, 'devicePresence': 'Present'}, {'bayNumber': 3, 'devicePresence': 'Absent'}, {'bayNumber': 4, 'devicePresence': 'Absent'}]}) => {
"msg": "Enclosure number 1 has 4 device(s)"
}
TASK [Show status of each device bay] ***********************************************************************************************************************************************************************************************************************************
ok: [localhost] => (item=[{'enclosure_number': 0, 'number_of_devices': '2'}, {'bayNumber': 1, 'devicePresence': 'Present'}]) => {
"msg": "Enclosure: 0 - Bay number: 1 - Status: Present"
}
ok: [localhost] => (item=[{'enclosure_number': 0, 'number_of_devices': '2'}, {'bayNumber': 2, 'devicePresence': 'Present'}]) => {
"msg": "Enclosure: 0 - Bay number: 2 - Status: Present"
}
ok: [localhost] => (item=[{'enclosure_number': 1, 'number_of_devices': '4'}, {'bayNumber': 1, 'devicePresence': 'Present'}]) => {
"msg": "Enclosure: 1 - Bay number: 1 - Status: Present"
}
ok: [localhost] => (item=[{'enclosure_number': 1, 'number_of_devices': '4'}, {'bayNumber': 2, 'devicePresence': 'Present'}]) => {
"msg": "Enclosure: 1 - Bay number: 2 - Status: Present"
}
ok: [localhost] => (item=[{'enclosure_number': 1, 'number_of_devices': '4'}, {'bayNumber': 3, 'devicePresence': 'Absent'}]) => {
"msg": "Enclosure: 1 - Bay number: 3 - Status: Absent"
}
ok: [localhost] => (item=[{'enclosure_number': 1, 'number_of_devices': '4'}, {'bayNumber': 4, 'devicePresence': 'Absent'}]) => {
"msg": "Enclosure: 1 - Bay number: 4 - Status: Absent"
}
PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0  

最新更新