如何在ansible中运行列表上的嵌套for循环
我正在尝试获取每个机柜上存在的每个设备的状态。为此:如何在ansible中运行列表上的嵌套for循环,ansible,Ansible,我正在尝试获取每个机柜上存在的每个设备的状态。为此: 首先获取存储模块数量 现在,获取每个机柜设备托架上的设备计数 现在,运行嵌套循环以获取设备ie的状态, 对于enclosureCount中的每个机柜 对于deviceCount中的每个设备 获取设备状态 在下面的代码中,我试图通过获取enclosurelist、devicelist和used nested loop来实现这一点 tasks: - name: get the enclosure details enclosure
对于enclosureCount中的每个机柜 对于deviceCount中的每个设备 获取设备状态
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 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"
}
“变量未定义!:列表对象没有元素10”的错误与从0-9开始的实际值有关
附件四事实结果:
{
"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可以为你做这项工作时进一步循环。我还了解到,您希望访问/显示每个机柜的索引(索引不在当前数据中) 在下面的示例中,我减少了您的数据示例,但我认为它几乎满足了您的所有需要。只要进行调整,就可以使用循环执行更多任务,以显示/运行包含相关数据的模块 注意:当我在评论中询问一个问题时,这正是我所想的:一个你可以直接复制和运行的剧本,而不需要把所有的部分放在一起。请考虑一下,以便将来提问和回答
---
- 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[操纵结果列表演示]**************************************************************************************************************************************************************************************************************************************
任务[显示初始数据(使用-v显示)]*******************************************************************************************************************************************************************************************************************************
正在跳过:[localhost]
任务[创建一个包含我们需要的所有数据的单一结构]********************************************************************************************************************************************************************************************************
确定:[localhost]=>(项={'deviceBayCount':2,'deviceBays':[{'bayNumber':1,'devicePresence':'Present'},{'bayNumber':2,'devicePresence':'Present'})
ok:[localhost]=>(项={'deviceBayCount':4,'deviceBays':[{'bayNumber':1,'devicePresence':'Present'},{'bayNumber':2,'devicePresence':'Present'},{'bayNumber':3,'devicePresence':'Essential'},{'bayNumber':4,'devicePresence':'Essential})
任务[显示新计算的数据结构(使用-v显示)]**********************************************************************************************************************************************************************************************************
正在跳过:[localhost]
任务[显示每个机柜的设备编号]*************************************************************************************************************************************************************************************************************************
确定:[localhost]=>(项={'enclosure\u number':0,'u设备数':'2','deviceBays':[{'bayname':1,'devicePresence':'Present'},{'bayname':2,'devicePresence':'Present'})=>{
“msg”:“机柜号0有2个设备”
}
ok:[localhost]=>(项={'enclosure\u number':1,'u设备数':'4','deviceBays':[{'bayname':1,'devicePresence':'Present'},{'bayname':2,'devicePresence':'Present'},{'bayname':3,'devicePresence':'missible'},{'bayNumber':4,'devicePresence':'missible'})=>{
“msg”:“1号机柜有4个设备”
}
任务[显示每个设备托架的状态]***********************************************************************************************************************************************************************************************************************************
确定:[localhost]=>(项=[{'enclosure\u number':0,'u设备数':'2'},{'bayname':1,'devicePresence':'Present'}])=>{
“msg”:“机柜:0-机架号:1-状态:存在”
}
确定:[localhost]=>(项=[{'enclosure\u number':0,'u设备数':'2'},{'bayname':2,'devicePresence':'Present'}])=>{
“msg”:“机柜:0-机架号:2-状态:存在”
}
确定:[localhost]=>(项=[{'enclosure\u number':1,'number\u设备':'4'},{'bayname':1,'devicePresence':'Present'}])=>{
“msg”:“机柜:1-机架号:1-状态:存在”
}
确定:[localhost]=>(项=[{'enclosure\u number':1,“设备数”:'4'},{'bayname':2,“devicePresence':'Present'}])=>{
“msg”:“机柜:1-机架号:2-状态:存在”
}
ok:[localhost]=>(项=[{'enclosure\u number':1,'u设备数':'4'},{'bayNumber':3,'devicePresence':'缺席'])=>{
“msg”:“机柜:1-机架号:3-状态:不存在”
}
ok:[localhost]=>(项=[{'enclosure\u number':1,'u设备数':'4'},{'bayNumber':4,'devicePresence':'缺席'}])=>{
“msg”:“机柜:1-机架号:4-状态:不存在”
}
重演**************************************************************************************************************************************************************************************************************************************************************
localhost:确定=3更改=0无法访问=0失败=0跳过=2获救=0忽略=0
请提供一份详细的信息。在ansilble的例子中,它通常是一个完整的剧本,通常针对本地主机,带有一个包含示例数据的vars部分,以及再现问题所需的最少任务。我应该能够复制/粘贴它,保存它,播放它,并获得与您相同的结果。成为