如何在ansible中的列表上运行嵌套for循环 [英] how to run nested for loop on list in ansible
问题描述
我正在尝试获取每个机箱上存在的每个设备的状态.为此:
Am trying to get the status of each devices present on each enclosures. for that :
- 首先获取外壳计数
- 现在,获取每个机箱的 deviceBays 上的设备数
- 现在,运行嵌套循环以获取设备状态,即,
对于enclosureCount 中的每个机箱对于 deviceCount 中的每个设备获取设备状态
在下面的代码中,我试图通过获取附件列表、设备列表和使用的嵌套循环来做到这一点
below code, i tried to do this, by getting enclosurelist, devicelist and used nested loop
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}}"
嵌套循环的当前输出不是通过每个 deviceCount 而是静态/单个 vlaue,即 10
current output for nested loop is not going through each deviceCount instead static/single vlaue ie, 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"
}
VARIABLE IS NOT DEFINED!: list object has no element 10"的错误与从 0-9 开始的实际值有关
error with "VARIABLE IS NOT DEFINED!: list object has no element 10" is to do with actual value starts from 0-9
enclosure_facts 结果:
enclosure_facts result:
{
"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 可以为您完成工作时进一步循环它们.我也知道您想访问/显示每个附件的索引(索引不在您当前的数据中).
I have the feeling you are calculating a lot of things just to further loop on them when ansible can do the job for you. I also understood you want to access/display an index for each enclosure (index not in your current data).
我在下面的示例中稍微减少了您的数据样本,但我认为它几乎可以满足您的所有需求.只需进行调整,以便您使用循环执行更多任务以显示/运行具有相关数据的模块
I reduced your data sample a bit in the following example but I think it pretty much does all you need. Just adapt so that you make more tasks with loops to display/run modules with the relevant data
注意:当我在评论中询问 MCVE 时,这正是我在想的:您可以直接复制和运行的剧本,而无需将所有部分放在一起.请为您以后的问题和答案考虑一下.
Note: when I asked in my comment for an MCVE, this is exactly what I was thinking about: a playbook you can copy and run directly without having to put all the pieces together. Please think about it for your future questions and answers.
---
- 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
详细运行以获取更多详细信息)
And the result (run verbosely with -v
to get more details)
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
这篇关于如何在ansible中的列表上运行嵌套for循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!