Рейтинг:1

Условие Ansible для фильтрации в цикле

флаг cn

Я пытаюсь создать задачу Ansible для удаления дисков RDM с виртуальной машины, когда значение scsi_controller не равно нулю. Однако когда Условие пропускает всю задачу, а не проходит цикл и пропускает только scsi_controller(s) с нулевым значением.я тоже пробовал with_nested, что дало худшие результаты.

rdm_info (переменные):

"scsi_controller": "0,0,1,1,1,2,2,3,3,3,3",
"unit_number": "0,1,2,0,1,0,1,0,1,14,15",
"vm_name": "test_vm"
    

Задание по пьесе:

- имя: Удалить диски rdm
  сообщество.vmware.vmware_guest_disk:
    validate_certs: ложь
    имя хоста: '{{ vc_server }}'
    имя пользователя: '{{ vc_user }}'
    пароль: '{{ vc_pass }}'
    центр обработки данных: '{{ datacenter_name }}'
    имя: '{{ item.0 }}'
    диск:
      - состояние: отсутствует
        scsi_controller: "{{ item.1 | int }}"
        unit_number: "{{ item.2 | int }}"
        уничтожить: нет     
  цикл: "{{ rdm_info | json_query('[*].vm_name') | zip( rdm_info | json_query('[*].scsi_controller') | map('split',','), rdm_info | json_query('[ *].unit_number') | map('split',',')) }}"         
  когда: п.1 | интервал! = 0  
  делегат_к: локальный
  регистр: rdms_unmounted

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

Рейтинг:1
флаг br

2 атрибута

Добавить атрибут выбор к предметам, напр.

    - set_fact:
        rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'выбор': выбор})] }}"
      цикл: "{{ rdm_info }}"
      вары:
        scsi_controller: "{{ item.scsi_controller.split(',') }}"
        unit_number: "{{ item.unit_number.split(',') }}"
        выбор: "{{ scsi_controller|
                       zip (номер_единицы)|
                       отклонить ('0', 'экв.', '0') }}"

дает

  rdm_sel:
    - scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
      выбор:
      - ['1', '2']
      - ['1', '0']
      - ['1', '1']
      - ['2', '0']
      - ['2', '1']
      - ['3', '0']
      - ['3', '1']
      - ['3', '14']
      - ['3', '15']
      unit_number: 0,1,2,0,1,0,1,0,1,14,15
      имя_вм: test_vm

Затем повторите with_subelements

    - отладка:
        сообщение: >-
          имя: {{ item.0.vm_name }}
          scsi_controller: {{ item.1.0 }}
          unit_number: {{ пункт.1.1 }}
      with_subelements:
        - "{{rdm_sel}}"
        - выбор

дает

  msg: 'имя: test_vm scsi_controller: 1 unit_number: 2'
  msg: 'имя: test_vm scsi_controller: 1 unit_number: 0'
  msg: 'имя: test_vm scsi_controller: 1 unit_number: 1'
  msg: 'имя: test_vm scsi_controller: 2 unit_number: 0'
  msg: 'имя: test_vm scsi_controller: 2 unit_number: 1'
  msg: 'имя: test_vm scsi_controller: 3 unit_number: 0'
  msg: 'имя: test_vm scsi_controller: 3 unit_number: 1'
  msg: 'имя: test_vm scsi_controller: 3 unit_number: 14'
  msg: 'имя: test_vm scsi_controller: 3 unit_number: 15'

По желанию добавить все единицы измерения

    - set_fact:
        rdm_units: "{{ rdm_units|d([]) + [item|объединить({'единицы': единицы})] }}"
      цикл: "{{ rdm_info }}"
      loop_control:
        метка: "{{ item.vm_name }}"
      вары:
        scsi_controller: "{{ item.scsi_controller.split(',') }}"
        unit_number: "{{ item.unit_number.split(',') }}"
        единицы: "{{ scsi_controller|zip(unit_number) }}"

дает

  rdm_units:
    - scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
      unit_number: 0,1,2,0,1,0,1,0,1,14,15
      единицы измерения:
      - ['0', '0']
      - ['0', '1']
      - ['1', '2']
      - ['1', '0']
      - ['1', '1']
      - ['2', '0']
      - ['2', '1']
      - ['3', '0']
      - ['3', '1']
      - ['3', '14']
      - ['3', '15']
      имя_вм: test_vm

Затем выберите единицы в цикле. Приведенная ниже задача дает тот же результат.

    - отладка:
        сообщение: >-
          имя: {{ item.0.vm_name }}
          scsi_controller: {{ item.1.0 }}
          unit_number: {{ пункт.1.1 }}
      with_subelements:
        - "{{ rdm_units }}"
        - единицы измерения
      когда: элемент 1.0 != '0'

Несколько атрибутов

Ansible не предоставляет вам фильтр для сжатия списка списков. Но вы можете создать очень простой настраиваемый фильтр, например

оболочка> cat filter_plugins/zip2.py
защита zip2(l):
    обратный почтовый индекс (* л)


класс FilterModule (объект):
    деф фильтры(я):
        возвращаться {
            'zip2': zip2,
        }

Теперь создайте список атрибутов (_keys), извлекать струны, расколоть предметы, и присоединиться аргументы для фильтра zip2. Затем создайте выбор От всех _keys. Например, учитывая упрощенные данные для тестирования

  rdm_info:
    - х: 0,2,3
      у: 4,5,6
      г: 7,8,9
      н: А
    - х: 1,0,3
      у: 4,5,6
      г: 7,8,9
      н: Б
    - х: 1,2,0
      у: 4,5,6
      г: 7,8,9
      н: С

задание ниже

    - set_fact:
        rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'выбор': выбор})] }}"
      цикл: "{{ rdm_info }}"
      вары:
        _keys: [х, у, г]
        _args: "{{ _keys|map('extract', item)|map('split', ',')|join(',') }}"
        выбор: "{{ _args|zip2|rejectattr('0', 'eq', '0') }}"

дает

  rdm_sel:
    - н: А
      выбор:
      - ['2', '5', '8']
      - ['3', '6', '9']
      х: 0,2,3
      у: 4,5,6
      г: 7,8,9
    - н: Б
      выбор:
      - ['1', '4', '7']
      - ['3', '6', '9']
      х: 1,0,3
      у: 4,5,6
      г: 7,8,9
    - н: С
      выбор:
      - ['1', '4', '7']
      - ['2', '5', '8']
      х: 1,2,0
      у: 4,5,6
      г: 7,8,9
флаг cn
Большое спасибо, Владимир Ботка, вы действительно гений Ansible.
флаг br
Создайте простой настраиваемый фильтр, если вы хотите выбрать несколько атрибутов. Я добавил пример.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.