Score:2

ค้นหารายการ Dicts โดยใช้รายการและดูว่ารายการนั้นอยู่ภายใต้แอตทริบิวต์ 'value' หรือไม่ เก็บเฉพาะรายการที่ไม่พบเป็นรายการใหม่

ธง in

คนนี้กระทืบฉันมาระยะหนึ่งแล้ว หวังว่าพวกคุณจะช่วยได้

ฉันมีรายการ dicts ที่ลงทะเบียนตามตัวอย่างด้านล่าง (สิ่งเหล่านี้คือ 'วัตถุ' จากไฟร์วอลล์)

"วัตถุ": [
      { 
         "ชื่อ": "Test1",  
         "ประเภท": "ip-netmask", 
         "ค่า": "8.8.8.8"
      },
      { 
         "ชื่อ": "Test2", 
         "ประเภท": "ip-netmask", 
         "ค่า": "8.8.4.4"
      }
   ]
}

การใช้รายการที่อยู่ IP ที่เรียกว่า 'แหล่งที่มา' ขณะนี้ฉันสามารถค้นหา 'ค่า' ใน 'วัตถุ' เพื่อดูว่ามีอยู่หรือไม่ หากพบพวกเขา ฉันจะสร้างรายการใหม่โดยใช้ set_fact และเติมสิ่งนี้ด้วย 'ชื่อ' ของวัตถุที่เกี่ยวข้องกับ 'ค่า' ที่พบ มันใช้งานได้ดี

ปัญหาที่ฉันพยายามแก้ไขคือ ฉันจะสร้างรายการใหม่ด้วย 'แหล่งที่มา' ที่ไม่พบในการค้นหาค่าได้อย่างไร

รหัสการทำงานของฉันสำหรับการค้นหา 'แหล่งที่มา' ที่มีอยู่และจัดเก็บเป็นชื่อมีดังนี้:

วาร์
ที่มา: ['8.8.8.8','8.8.4.4']

งาน:

  - ชื่อ: ดึงวัตถุทั้งหมดและจัดเก็บผลลัพธ์
     panos_object_facts:
      ผู้ให้บริการ: "{{ cli }}"
      device_group: DG_Test
      name_regex: '.*'
      object_type: 'ที่อยู่'
      ลงทะเบียน: ผลลัพธ์ 

 - ชื่อ: ผลการค้นหาแหล่งที่มาของเราและจัดเก็บเป็นรายการหากพบ
     set_fact:
        ที่มีอยู่_source_addr: "{{ มีอยู่แล้ว_source_addr|default([]) + [(result.objects | selectattr('value', 'search', item ) | list | first).name ] }}"   
      with_items: "{{ แหล่งที่มา }}"
    - แก้ปัญหา: var=existing_source_addr

สิ่งนี้ส่งคืนตัวอย่างดังต่อไปนี้:

"existing_source_addr": "['ทดสอบ 1', 'ทดสอบ 2']"

ตัวอย่างด้านล่างคือโค้ดที่ฉันกำลังทดสอบเพื่อสร้างรายการใหม่ที่มีเฉพาะ 'แหล่งที่มา' ซึ่งไม่พบ สิ่งนี้ไม่ทำงานตามที่คาดไว้

วาร์
ที่มา: ['8.8.8.8','8.8.4.4','4.4.4.4'] 

# 4.4.4.4 ไม่มีอยู่ในรายการ dicts 'objects' #

งาน:

  - ชื่อ: ดึงวัตถุทั้งหมดและจัดเก็บผลลัพธ์
     panos_object_facts:
      ผู้ให้บริการ: "{{ cli }}"
      device_group: DG_Test
      name_regex: '.*'
      object_type: 'ที่อยู่'
      ลงทะเบียน: ผลลัพธ์ 

  - ชื่อ: ผลการค้นหาแหล่งที่มาของเราและจัดเก็บเป็นรายการหากไม่พบ 
      set_fact:
        non_existing_source_addr: "{{ non_existing_source_addr|default([]) + [item] }}"
      with_items: "{{ แหล่งที่มา }}"
      เมื่อ: รายการไม่อยู่ใน result.objects | selectattr('value', 'search', item ) | รายการ
   - แก้ปัญหา: var=non_existing_source_addr

สิ่งนี้ส่งคืนตัวอย่างดังต่อไปนี้:

"non_existing_source_addr": "[u'8.8.8.8', u'8.8.4.4', AnsibleUndefined]"

เงื่อนไขเป็นจริงเนื่องจากไม่พบรายการที่ 3 ตามที่คาดไว้ แต่ตัวแปรของฉันถูกตั้งค่าด้วยรายการทั้งหมดจากรายการ 'แหล่งที่มา' + 'AnsibleUndefined' สำหรับรายการที่ไม่มีอยู่

มีวิธีที่จะทำให้รายการใหม่นี้มีเฉพาะรายการที่ไม่พบ '4.4.4.4' หรือไม่ สิ่งนี้จะช่วยให้ฉันใช้รายการใหม่เพื่อสร้างวัตถุที่ขาดหายไป

Drusstheledg3 avatar
in flag
ขออภัยที่พิมพ์ผิด นี่เป็นเพียงตัวอย่างเท่านั้น รายการ 'วัตถุ' dicts จริงมีประมาณ 2,000 รายการ ดังที่ได้กล่าวไปแล้วว่าส่วนแรกของโค้ดทำงานตามที่ต้องการในสภาพแวดล้อมจริงของเรา
Drusstheledg3 avatar
in flag
ขอบคุณสำหรับคำติชมวลาดิมีร์ ฉันได้แก้ไขโพสต์แล้ว หวังว่าตอนนี้จะเข้าใจมากขึ้น
Score:1
ธง br

ถาม: "รายการใหม่มีเฉพาะรายการที่ไม่พบ '4.4.4.4'"

ตอบ: ตัวอย่างเช่น

    - แก้ปัญหา:
        msg: "{{ แหล่งที่มา|ความแตกต่าง(_values) }}"
      วาร์:
        _values: "{{ วัตถุ|แผนที่(attribute='value')|รายการ }}"

ให้

  ข้อความ:
  - 4.4.4.4
Drusstheledg3 avatar
in flag
ขอบคุณมากสำหรับการตอบกลับอย่างรวดเร็ว สิ่งนี้ได้ผล!

โพสต์คำตอบ

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