Score:1

ความช่วยเหลือ json_query - ไม่สร้างผลลัพธ์ที่คาดหวัง

ธง cn

ฉันกำลังพยายามสร้างอาร์เรย์เพื่อใช้สำหรับ with_nestedแต่ฉันไม่สามารถผ่านไปได้ว่าทำไม json_query ไม่ส่งออกโฮสต์จริงที่กำหนดให้กับแต่ละคลัสเตอร์:

เล่น:

- ชื่อ: ดัชนี clusters.json
  เชลล์: cat {{ tower_var_path }}/clusters.json
  ลงทะเบียน: result_clusters

- ชื่อ: บันทึกข้อมูล Json เป็นตัวแปรเป็นข้อเท็จจริง
  set_fact: 
    clusters_jsondata: "{{ result_clusters.stdout | from_json }}"

- แก้ปัญหา:
    ข้อความ: " {{ clusters_jsondata }}"

- ชื่อ: ตั้งค่าข้อเท็จจริงของคลัสเตอร์
  set_fact:
    คลัสเตอร์: "{{ คลัสเตอร์|ค่าเริ่มต้น ([]) + [ {
      'ชื่อ': รายการ,
      'โฮสต์': รายการ | json_query('*.hosts[*].name')
       } ] }}"  
  with_items: "{{ clusters_jsondata.clusters }}"      

- แก้ปัญหา: 
    msg: "{{ คลัสเตอร์ }}"

ข้อมูลคลัสเตอร์.json:

    {
    "คลัสเตอร์": {
        "Cluster_1": {
            "โฮสต์": [
                {
                    "โฟลเดอร์": "/เส้นทาง",
                    "ชื่อ": "host1.domain.com"
                },
                {
                    "โฟลเดอร์": "/เส้นทาง",
                    "ชื่อ": "host2.domain.com"
                }
            ]

        },
        "Cluster_2": {
            "โฮสต์": [
                {
                    "โฟลเดอร์": "/เส้นทาง",
                    "ชื่อ": "host3.domain.com"
                },
                {
                    "โฟลเดอร์": "/เส้นทาง",
                    "ชื่อ": "host4.domain.com"
                }
            ]

        },
    }

ผลลัพธ์ที่คาดหวัง:

งาน [แก้ไขข้อบกพร่อง] *********************************************** ************************************************** ************************************************** *******************************************
ตกลง: [localhost] => {
    "ข้อความ": [
        {
            "โฮสต์": "host1.domain.com, host2.domain.com",
            "ชื่อ": "Cluster_1"
        },
        {
            "โฮสต์": "host3.domain.com, host4.domain.com",
            "ชื่อ": "Cluster_2"
        }
    ]
}

ผลลัพธ์จริง:

    งาน [แก้ไขข้อบกพร่อง] *********************************************** ************************************************** ************************************************** *******************************************
ตกลง: [localhost] => {
    "ข้อความ": [
        {
            "โฮสต์": null,
            "ชื่อ": "Cluster_1"
        },
        {
            "โฮสต์": null,
            "ชื่อ": "Cluster_2"
        }
    ]
}
Score:2
ธง fr

โดยสรุป คุณจะได้รับผลลัพธ์ด้วยนิพจน์เดียวโดยไม่มีการวนซ้ำ

Playbook ต่อไปนี้:

---
- โฮสต์: localhost
  Gather_facts: เท็จ

  วาร์:
    # ข้อมูลต้นฉบับของคุณในบรรทัดเดียวเพื่อความชัดเจน
    result_clusters:
      หยุด: >-
        {"clusters":{"Cluster_1":{"hosts":[{"folder":"/path","name":"host1.domain.com"},{"folder":"/path"," name":"host2.domain.com"}]},"Cluster_2":{"hosts":[{"folder":"/path","name":"host3.domain.com"},{"folder ":"/path","name":"host4.domain.com"}]}}}

  งาน:
    - ชื่อ: รับผลลัพธ์ที่คาดหวังจากข้อมูล json ในงานเดียว
      วาร์:
        สอบถาม: >-
          [].{ชื่อ: คีย์ โฮสต์: เข้าร่วม(', ', value.hosts[].name)}
        คลัสเตอร์: "{{ (result_clusters.stdout | from_json).clusters }}"
      แก้ปัญหา:
        msg: "{{ คลัสเตอร์ | dict2items | json_query(query) }}"

ให้:

เล่น [โฮสต์ในพื้นที่] *********************************************** ********

TASK [รับผลลัพธ์ที่คาดหวังจากข้อมูล json ในงานเดียว] *********
ตกลง: [localhost] => {
    "ข้อความ": [
        {
            "โฮสต์": "host1.domain.com, host2.domain.com",
            "ชื่อ": "Cluster_1"
        },
        {
            "โฮสต์": "host3.domain.com, host4.domain.com",
            "ชื่อ": "Cluster_2"
        }
    ]
}

เล่น RECAP ************************************************ ************
localhost: ตกลง = 1 เปลี่ยนแปลง = 0 ไม่สามารถเข้าถึงได้ = 0 ล้มเหลว = 0 ข้าม = 0 ช่วยแล้ว = 0 ละเว้น = 0

หมายเหตุ: แม้ว่าข้อมูลข้างต้นจะให้ผลลัพธ์ที่คุณขออย่างแม่นยำมาก แต่ฉันสงสัยอย่างยิ่งว่าคุณกำลังมองหาผลลัพธ์ที่แตกต่างออกไปเล็กน้อย แทนที่ข้อความค้นหาด้านบนด้วย:

        สอบถาม: >-
          [].{ชื่อ: คีย์ โฮสต์: value.hosts[].name}

จะให้สิ่งนี้แทน:

TASK [รับผลลัพธ์ที่คาดหวังจากข้อมูล json ในงานเดียว] ************************************ ************************************************** ************************************************** **********************************
ตกลง: [localhost] => {
    "ข้อความ": [
        {
            "โฮสต์": [
                "host1.domain.com",
                "host2.domain.com"
            ],
            "ชื่อ": "Cluster_1"
        },
        {
            "โฮสต์": [
                "host3.domain.com",
                "host4.domain.com"
            ],
            "ชื่อ": "Cluster_2"
        }
    ]
}

cn flag
สมบูรณ์แบบ! ขอขอบคุณ. แตกต่างจากที่ฉันคิดไว้มาก คุณจะกรุณาให้ลิงก์ไปยังแหล่งข้อมูลที่อาจอธิบายว่าคุณมาแนวทางนี้ได้อย่างไร
Zeitounator avatar
fr flag
ฉันแทบจะไม่พบลิงก์ที่ชี้ไปยังบทสรุปของประสบการณ์ของฉันในการจัดการกับปัญหาดังกล่าวในช่วง 8+ ปีที่ผ่านมา ;) ในขณะเดียวกัน จุดเริ่มต้นที่ดี 3 ประการที่เกี่ยวข้องกับเรื่อง: [jinja2 builtin filters](https://jinja.palletsprojects .com/en/3.0.x/templates/#list-of-builtin-filters), [ตัวกรอง ansilble](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html) และ [บทช่วยสอน jmespath ](https://jmespath.org/tutorial.html)

โพสต์คำตอบ

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