Điểm:1

Điều kiện ansible để lọc trong vòng lặp

lá cờ cn

Tôi đang cố tạo tác vụ Ansible để xóa đĩa RDM khỏi máy ảo khi giá trị scsi_controller khác không. Tuy nhiên, các khi nào điều kiện là bỏ qua toàn bộ tác vụ thay vì đi vòng lặp và chỉ bỏ qua (các) scsi_controller có giá trị bằng không.tôi cũng đã thử with_nested, tạo ra kết quả tồi tệ hơn.

rdm_info (biến):

"scsi_controller": "0,0,1,1,1,2,2,3,3,3,3",
"số_đơn vị": "0,1,2,0,1,0,1,0,1,14,15",
"vm_name": "test_vm"
    

Nhiệm vụ sổ tay:

- tên: Xóa đĩa rdm
  cộng đồng.vmware.vmware_guest_disk:
    xác thực_certs: sai
    tên máy chủ: '{{ vc_server }}'
    tên người dùng: '{{ vc_user }}'
    mật khẩu: '{{ vc_pass }}'
    trung tâm dữ liệu: '{{ datacenter_name }}'
    tên: '{{ item.0 }}'
    đĩa:
      - tình trạng: vắng mặt
        scsi_controller: "{{ item.1 | int }}"
        unit_number: "{{ item.2 | int }}"
        tiêu diệt: không     
  vòng lặp: "{{ rdm_info | json_query('[*].vm_name') | zip( rdm_info | json_query('[*].scsi_controller') | map('split',','), rdm_info | json_query('[ *].unit_number') | map('split',',')) }}"         
  khi: item.1 | int != 0  
  ủy nhiệm_to: máy chủ cục bộ
  đăng ký: rdms_unmount

Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ nào, vì tôi đã đầu tư hơn 20 giờ cho vở kịch này.

Điểm:1
lá cờ br

2 thuộc tính

Thêm một thuộc tính lựa chọn đến các mục, ví dụ:

    - bộ_thực tế:
        rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'selection': selection})] }}"
      vòng lặp: "{{rdm_info }}"
      lọ:
        scsi_controller: "{{ item.scsi_controller.split(',') }}"
        unit_number: "{{ item.unit_number.split(',') }}"
        lựa chọn: "{{ scsi_controller|
                       zip(số_đơn_vị)|
                       rejectattr('0', 'eq', '0') }}"

cho

  rdm_sel:
    - scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
      lựa chọn:
      - ['1', '2']
      - ['1', '0']
      - ['1', '1']
      - ['2', '0']
      - ['2', '1']
      - ['3', '0']
      - ['3', '1']
      - ['3', '14']
      - ['3', '15']
      số_đơn vị: 0,1,2,0,1,0,1,0,1,14,15
      vm_name: test_vm

Sau đó, lặp đi lặp lại with_subelements

    - gỡ lỗi:
        tin nhắn: >-
          tên: {{ item.0.vm_name }}
          scsi_controller: {{ item.1.0 }}
          unit_number: {{ item.1.1 }}
      with_subelements:
        - "{{rdm_sel }}"
        - lựa chọn

cho

  msg: 'tên: test_vm scsi_controller: 1 unit_number: 2'
  msg: 'tên: test_vm scsi_controller: 1 unit_number: 0'
  msg: 'tên: test_vm scsi_controller: 1 unit_number: 1'
  msg: 'tên: test_vm scsi_controller: 2 unit_number: 0'
  msg: 'tên: test_vm scsi_controller: 2 unit_number: 1'
  msg: 'tên: test_vm scsi_controller: 3 unit_number: 0'
  msg: 'tên: test_vm scsi_controller: 3 unit_number: 1'
  msg: 'tên: test_vm scsi_controller: 3 unit_number: 14'
  msg: 'tên: test_vm scsi_controller: 3 unit_number: 15'

Tùy chọn, thêm tất cả các đơn vị

    - bộ_thực tế:
        rdm_units: "{{ rdm_units|d([]) + [item|combine({'units': units})] }}"
      vòng lặp: "{{rdm_info }}"
      loop_control:
        nhãn: "{{ item.vm_name }}"
      lọ:
        scsi_controller: "{{ item.scsi_controller.split(',') }}"
        unit_number: "{{ item.unit_number.split(',') }}"
        đơn vị: "{{ scsi_controller|zip(unit_number) }}"

cho

  rdm_units:
    - scsi_controller: 0,0,1,1,1,2,2,3,3,3,3
      số_đơn vị: 0,1,2,0,1,0,1,0,1,14,15
      các đơn vị:
      - ['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

Sau đó, chọn các đơn vị trong vòng lặp. Nhiệm vụ dưới đây cho kết quả tương tự.

    - gỡ lỗi:
        tin nhắn: >-
          tên: {{ item.0.vm_name }}
          scsi_controller: {{ item.1.0 }}
          unit_number: {{ item.1.1 }}
      with_subelements:
        - "{{rdm_units}}"
        - các đơn vị
      khi: item.1.0 != '0'

Nhiều thuộc tính

Ansible không cung cấp cho bạn bộ lọc để nén danh sách các danh sách. Tuy nhiên, bạn có thể tạo bộ lọc tùy chỉnh rất đơn giản, ví dụ:

shell> cat filter_plugins/zip2.py
định zip2(l):
    trả về zip(*l)


lớp FilterModule (đối tượng):
    bộ lọc def (bản thân):
        trở lại {
            'zip2': zip2,
        }

Bây giờ, hãy tạo một danh sách các thuộc tính (_phím), trích xuất Các dây, tách ra các mặt hàng, và tham gia các đối số cho bộ lọc zip2. Sau đó tạo lựa chọn từ tất cả _phím. Ví dụ: đưa ra dữ liệu đơn giản hóa để thử nghiệm

  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

nhiệm vụ dưới đây

    - bộ_thực tế:
        rdm_sel: "{{ rdm_sel|d([]) + [item|combine({'selection': selection})] }}"
      vòng lặp: "{{rdm_info }}"
      lọ:
        _phím: [x, y, z]
        _args: "{{ _keys|map('extract', item)|map('split', ',')|join(',') }}"
        lựa chọn: "{{ _args|zip2|rejectattr('0', 'eq', '0') }}"

cho

  rdm_sel:
    - n: A
      lựa chọn:
      - ['2', '5', '8']
      - ['3', '6', '9']
      x: 0,2,3
      y: 4,5,6
      z: 7,8,9
    - n: B
      lựa chọn:
      - ['1', '4', '7']
      - ['3', '6', '9']
      x: 1,0,3
      y: 4,5,6
      z: 7,8,9
    - n:C
      lựa chọn:
      - ['1', '4', '7']
      - ['2', '5', '8']
      x: 1,2,0
      y: 4,5,6
      z: 7,8,9
lá cờ cn
Cảm ơn bạn rất nhiều Vladimir Botka, bạn thực sự là một thiên tài Ansible.
lá cờ br
Tạo bộ lọc tùy chỉnh đơn giản nếu bạn muốn chọn nhiều thuộc tính. Tôi đã thêm một ví dụ.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.