如何在ansible中在列表上运行嵌套的循环 [英] how to run nested for loop on list in ansible

查看:90
本文介绍了如何在ansible中在列表上运行嵌套的循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正在尝试获取每个机箱中每个设备的状态.为此:

Am trying to get the status of each devices present on each enclosures. for that :

  1. 首先获取附件计数
  2. 现在,获取每个机箱的设备托架上的设备数
  3. 现在,运行嵌套循环以获取设备状态,即
    对于enclosureCount中的每个机柜 对于deviceCount中的每个设备 获取设备状态
  1. first get the enclosure Count
  2. now, get the device count on each enclosure's deviceBays
  3. now, run nested loop to get status of device ie,
    for each enclosure in enclosureCount for each device in deviceCount get the device status

在下面的代码中,我尝试通过获取附件列表,设备列表和使用嵌套循环来做到这一点

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"
}

未定义变量!:列表对象没有元素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中在列表上运行嵌套的循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆