Puncte:1

Condiție posibilă de filtrare în buclă

drapel cn

Încerc să creez o sarcină Ansible pentru a elimina discurile RDM dintr-o VM atunci când valoarea scsi_controller nu este zero. Însă când condiția este săriți peste întreaga sarcină, mai degrabă decât să parcurgeți bucla și să omiteți doar scsi_controller(e) cu valoarea zero.am incercat si eu cu_cuiburi, care a produs rezultate mai proaste.

rdm_info (variabile):

"scsi_controller": "0,0,1,1,1,2,2,3,3,3,3",
„număr_unitate”: „0,1,2,0,1,0,1,0,1,14,15”,
"vm_name": "test_vm"
    

Sarcină de joc:

- nume: Eliminați discurile rdm
  community.vmware.vmware_guest_disk:
    validate_certs: false
    numele gazdă: „{{ vc_server }}”
    nume de utilizator: „{{ vc_user }}”
    parola: „{{ vc_pass }}”
    centru de date: „{{ datacenter_name }}”
    nume: „{{ item.0 }}”
    disc:
      - stare: absent
        scsi_controller: „{{ item.1 | int }}”
        unit_number: „{{ item.2 | int }}”
        distruge: nu     
  buclă: „{{ rdm_info | json_query('[*].vm_name') | zip( rdm_info | json_query('[*].scsi_controller') | map('split',','), rdm_info | json_query('[ *].unit_number') | map('divizat',',')) }}"         
  când: item.1 | int != 0  
  delegate_to: localhost
  înregistrare: rdms_unmounted

Aș aprecia orice ajutor, deoarece am investit deja peste 20 de ore în această piesă.

Puncte:1
drapel br

2 atribute

Adăugați un atribut selecţie la articole, de ex.

    - set_fact:
        rdm_sel: „{{ rdm_sel|d([]) + [articol|combine({'selectie': selectie})] }}"
      buclă: „{{ rdm_info }}”
      vars:
        scsi_controller: „{{ item.scsi_controller.split(',') }}”
        unit_number: „{{ item.unit_number.split(',') }}”
        selecție: „{{ scsi_controller|
                       zip(număr_unitate)|
                       rejectattr('0', 'eq', '0') }}"

  rdm_sel:
    - scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
      selecţie:
      - ['1', '2']
      - ['1', '0']
      - ['1', '1']
      - ['2', '0']
      - ['2', '1']
      - ['3', '0']
      - ['3', '1']
      - ['3', '14']
      - ['3', '15']
      număr_unitate: 0,1,2,0,1,0,1,0,1,14,15
      vm_name: test_vm

Apoi, repetați cu_subelemente

    - depanare:
        mesaj: >-
          nume: {{ item.0.vm_name }}
          scsi_controller: {{ item.1.0 }}
          unit_number: {{ item.1.1 }}
      cu_subelemente:
        - „{{ rdm_sel }}”
        - selectie

  msg: 'nume: test_vm scsi_controller: 1 unit_number: 2'
  msg: 'nume: test_vm scsi_controller: 1 unit_number: 0'
  msg: 'nume: test_vm scsi_controller: 1 unit_number: 1'
  msg: 'nume: test_vm scsi_controller: 2 unit_number: 0'
  msg: 'nume: test_vm scsi_controller: 2 unit_number: 1'
  msg: 'nume: test_vm scsi_controller: 3 unit_number: 0'
  msg: 'nume: test_vm scsi_controller: 3 unit_number: 1'
  msg: 'nume: test_vm scsi_controller: 3 unit_number: 14'
  msg: 'nume: test_vm scsi_controller: 3 unit_number: 15'

Opțional, adăugați toate unitati

    - set_fact:
        rdm_units: „{{ rdm_units|d([]) + [articol|combine({'unități': unități})] }}"
      buclă: „{{ rdm_info }}”
      loop_control:
        etichetă: „{{ item.vm_name }}”
      vars:
        scsi_controller: „{{ item.scsi_controller.split(',') }}”
        unit_number: „{{ item.unit_number.split(',') }}”
        unități: „{{ scsi_controller|zip(unit_number) }}”

  rdm_units:
    - scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
      număr_unitate: 0,1,2,0,1,0,1,0,1,14,15
      unitati:
      - ['0', '0']
      - ['0', '1']
      - ['1', '2']
      - ['1', '0']
      - ['1', '1']
      - ['2', '0']
      - ['2', '1']
      - ['3', '0']
      - ['3', '1']
      - ['3', '14']
      - ['3', '15']
      vm_name: test_vm

Apoi, selectați unitățile din buclă. Sarcina de mai jos oferă același rezultat.

    - depanare:
        mesaj: >-
          nume: {{ item.0.vm_name }}
          scsi_controller: {{ item.1.0 }}
          unit_number: {{ item.1.1 }}
      cu_subelemente:
        - „{{ rdm_units }}”
        - unitati
      când: item.1.0 != '0'

Atribute multiple

Ansible nu vă oferă un filtru pentru a arhiva o listă de liste. Dar, puteți crea un filtru personalizat foarte simplu, de ex

shell> cat filter_plugins/zip2.py
def zip2(l):
    zip de returnare(*l)


clasa FilterModule(obiect):
    def filters(self):
        întoarcere {
            „zip2”: zip2,
        }

Acum, creați o listă a atributelor (_chei), extrage corzile, Despică articolele și a te alatura argumentele pentru filtru zip2. Apoi creează selecţie de la toti _chei. De exemplu, având în vedere datele simplificate pentru testare

  rdm_info:
    - x: 0,2,3
      y: 4,5,6
      z: 7,8,9
      N / A
    - x: 1,0,3
      y: 4,5,6
      z: 7,8,9
      n: B
    - x: 1,2,0
      y: 4,5,6
      z: 7,8,9
      n: C

sarcina de mai jos

    - set_fact:
        rdm_sel: „{{ rdm_sel|d([]) + [articol|combine({'selectie': selectie})] }}"
      buclă: „{{ rdm_info }}”
      vars:
        _chei: [x, y, z]
        _args: „{{ _keys|map('extract', item)|map('split', ',')|join(',') }}"
        selecție: „{{ _args|zip2|rejectattr('0', 'eq', '0') }}"

  rdm_sel:
    - N / A
      selecţie:
      - ['2', '5', '8']
      - ['3', '6', '9']
      x: 0,2,3
      y: 4,5,6
      z: 7,8,9
    -n:B
      selecţie:
      - ['1', '4', '7']
      - ['3', '6', '9']
      x: 1,0,3
      y: 4,5,6
      z: 7,8,9
    - n: C
      selecţie:
      - ['1', '4', '7']
      - ['2', '5', '8']
      x: 1,2,0
      y: 4,5,6
      z: 7,8,9
drapel cn
Mulțumesc mult Vladimir Botka, ești cu adevărat un geniu Ansible.
drapel br
Creați un filtru personalizat simplu dacă doriți să selectați mai multe atribute. Am adaugat un exemplu.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.