Score:1

เงื่อนไขที่สามารถกรองได้ภายในลูป

ธง cn

ฉันกำลังพยายามสร้างงาน Ansible เพื่อลบดิสก์ RDM ออกจาก VM เมื่อค่า scsi_controller ไม่เป็นศูนย์ อย่างไรก็ตาม เมื่อไร เงื่อนไขคือการข้ามงานทั้งหมดแทนที่จะเดินวนและข้ามเฉพาะ scsi_controller ที่มีค่าเป็นศูนย์ฉันยังพยายาม 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": "ทดสอบ_vm"
    

งาน Playbook:

- ชื่อ: ลบดิสก์ rdm
  community.vmware.vmware_guest_disk:
    validate_certs: เท็จ
    ชื่อโฮสต์: '{{ vc_server }}'
    ชื่อผู้ใช้: '{{ vc_user }}'
    รหัสผ่าน: '{{ vc_pass }}'
    ศูนย์ข้อมูล: '{{ datacenter_name }}'
    ชื่อ: '{{ item.0 }}'
    ดิสก์:
      - สถานะ: ขาด
        scsi_controller: "{{ รายการ 1 | int }}"
        unit_number: "{{ รายการ 2 | int }}"
        ทำลาย: ไม่     
  วนซ้ำ: "{{ rdm_info | json_query('[*].vm_name') | zip( rdm_info | json_query('[*].scsi_controller') | map('split',','), rdm_info | json_query('[ *].unit_number') | แผนที่('แยก',',')) }}"         
  เมื่อ: item.1 | int != 0  
  delegate_to: localhost
  ลงทะเบียน: rdms_unmounted

ฉันขอขอบคุณสำหรับความช่วยเหลือใด ๆ เนื่องจากฉันได้ลงทุนกับละครเรื่องนี้ไปแล้วกว่า 20 ชั่วโมง

Score:1
ธง br

2 คุณลักษณะ

เพิ่มแอตทริบิวต์ การเลือก ไปยังรายการ เช่น

    - set_fact:
        rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'selection': selection})] }}"
      วนซ้ำ: "{{ rdm_info }}"
      วาร์:
        scsi_controller: "{{ item.scsi_controller.split(',') }}"
        unit_number: "{{ item.unit_number.split(',') }}"
        การเลือก: "{{ scsi_controller|
                       zip(unit_number)|
                       ปฏิเสธattr('0', 'eq', '0') }}"

ให้

  rdm_sel:
    - scsi_controller: 0,0,1,1,1,2,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
      vm_name: test_vm

จากนั้นทำซ้ำ with_subelements

    - แก้ปัญหา:
        ข้อความ: >-
          ชื่อ: {{ item.0.vm_name }}
          scsi_controller: {{ รายการ 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|combine({'units': units})] }}"
      วนซ้ำ: "{{ 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,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']
      vm_name: test_vm

จากนั้นเลือกหน่วยในลูป งานด้านล่างให้ผลลัพธ์เดียวกัน

    - แก้ปัญหา:
        ข้อความ: >-
          ชื่อ: {{ item.0.vm_name }}
          scsi_controller: {{ รายการ 1.0 }}
          unit_number: {{ รายการ 1.1 }}
      with_subelements:
        - "{{ rdm_units }}"
        - หน่วย
      เมื่อ: item.1.0 != '0'

หลายแอตทริบิวต์

Ansible ไม่มีตัวกรองให้คุณซิปรายการ แต่คุณสามารถสร้างตัวกรองแบบกำหนดเองง่ายๆ ได้ เช่น

เปลือก> cat filter_plugins/zip2.py
def zip2(l):
    ส่งไปรษณีย์กลับ (* l)


คลาส FilterModule (วัตถุ):
    ตัวกรอง def (ตัวเอง):
        กลับ {
            'zip2': ซิป 2,
        }

ตอนนี้ สร้างรายการของแอตทริบิวต์ (_คีย์), สารสกัด สตริง แยก รายการและ เข้าร่วม อาร์กิวเมนต์สำหรับตัวกรอง ซิป2. จากนั้นสร้าง การเลือก จากทั้งหมด _คีย์. ตัวอย่างเช่น ให้ข้อมูลอย่างง่ายสำหรับการทดสอบ

  rdm_info:
    - x: 0,2,3
      ญ: 4,5,6
      z: 7,8,9
      n: ก
    - x: 1,0,3
      ญ: 4,5,6
      z: 7,8,9
      n: บี
    - x: 1,2,0
      ญ: 4,5,6
      z: 7,8,9
      n: ซี

งานด้านล่าง

    - set_fact:
        rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'selection': selection})] }}"
      วนซ้ำ: "{{ rdm_info }}"
      วาร์:
        _keys: [x, y, z]
        _args: "{{ _keys|แผนที่('แยก', รายการ)|แผนที่('แยก', ',')|เข้าร่วม (',') }}"
        การเลือก: "{{ _args|zip2|rejectattr('0', 'eq', '0') }}"

ให้

  rdm_sel:
    - n: ก
      การเลือก:
      - ['2', '5', '8']
      - ['3', '6', '9']
      x: 0,2,3
      ญ: 4,5,6
      z: 7,8,9
    - n: บี
      การเลือก:
      - ['1', '4', '7']
      - ['3', '6', '9']
      x: 1,0,3
      ญ: 4,5,6
      z: 7,8,9
    - น: ค
      การเลือก:
      - ['1', '4', '7']
      - ['2', '5', '8']
      x: 1,2,0
      ญ: 4,5,6
      z: 7,8,9
cn flag
ขอบคุณมาก Vladimir Botka คุณคืออัจฉริยะ Ansible อย่างแท้จริง
br flag
สร้างตัวกรองแบบกำหนดเองอย่างง่าย หากคุณต้องการเลือกแอตทริบิวต์หลายรายการ ฉันเพิ่มตัวอย่าง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา