คนนี้กระทืบฉันมาระยะหนึ่งแล้ว หวังว่าพวกคุณจะช่วยได้
ฉันมีรายการ 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' หรือไม่ สิ่งนี้จะช่วยให้ฉันใช้รายการใหม่เพื่อสร้างวัตถุที่ขาดหายไป