как запустить вложенный цикл в списке в ansible - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь получить статус каждого устройства, присутствующего на каждом корпусе. для этого:

  1. сначала получите счетчик корпусов
  2. сейчас, получите счетчик устройств для каждого устройства в корпусах
  3. , теперь запустите вложенный цикл, чтобы получить статус устройства, т.е. ,
    для каждого вложения в enclosureCount для каждого устройства в deviceCount получить статус устройства

ниже кода, я попытался сделать это, получив enclosurelist, список устройств и использованный вложенный цикл

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 вместо статического / одиночного значения, т. Е. 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

enclosure_facts результат:

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

1 Ответ

1 голос
/ 09 ноября 2019

У меня такое чувство, что вы вычисляете много вещей, просто чтобы продолжить их, когда ansible может выполнить эту работу за вас. Я также понял, что вы хотите получить доступ к / показать индекс для каждого вложения (индекс не в ваших текущих данных).

В следующем примере я немного уменьшил выборку данных, но я думаю, что она в значительной степени делает все, что вам нужно,Просто адаптируйтесь так, чтобы вы выполняли больше задач с циклами для отображения / запуска модулей с соответствующими данными

Примечание: когда я спросил в своем комментарии о MCVE , это именно то, о чем я думалabout: playbook, который вы можете скопировать и запустить напрямую, без необходимости объединять все части. Пожалуйста, подумайте об этом для ваших будущих вопросов и ответов.

---
- 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 [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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...