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

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

问题描述

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

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

  1. 首先获取外壳计数
  2. 现在,获取每个机箱的 deviceBays 上的设备数
  3. 现在,运行嵌套循环以获取设备状态,即,
    对于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屋!

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