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

如何在ansible中运行列表上的嵌套for循环,ansible,Ansible,我正在尝试获取每个机柜上存在的每个设备的状态。为此: 首先获取存储模块数量 现在,获取每个机柜设备托架上的设备计数 现在,运行嵌套循环以获取设备ie的状态, 对于enclosureCount中的每个机柜 对于deviceCount中的每个设备 获取设备状态 在下面的代码中,我试图通过获取enclosurelist、devicelist和used nested loop来实现这一点 tasks: - name: get the enclosure details enclosure

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

  • 首先获取存储模块数量
  • 现在,获取每个机柜设备托架上的设备计数
  • 现在,运行嵌套循环以获取设备ie的状态,
    对于enclosureCount中的每个机柜 对于deviceCount中的每个设备 获取设备状态
  • 在下面的代码中,我试图通过获取enclosurelist、devicelist和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 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部分,以及再现问题所需的最少任务。我应该能够复制/粘贴它,保存它,播放它,并获得与您相同的结果。成为