Score:0

Ansible - ปัญหาเกี่ยวกับลูปและ json_query's

ธง gb

ฉันใช้โมดูล URI ansible เพื่อพูดคุยกับ REST api ฉันมีงานที่ต้องดำเนินการ GET เพื่อรับข้อมูลบางอย่างที่ฉันต้องการใช้ในภายหลัง ฉันต้องการที่จะจับคู่ตัวแปรบางตัวจาก GET เพื่อสร้างเส้นทางที่จะทำ PUT บน REST api รหัสของฉันเป็นดังนี้

คู่มือการเล่น

*host_vars/host.yml *

---
อินพุต:
  - ชื่อ: "test_input_api"
    ประเภท: "org.graylog2.inputs.syslog.udp.SyslogUDPInput"
    ทั่วโลก: เท็จ
    การกำหนดค่า:
      allow_override_date: เท็จ
      bind_address: "0.0.0.0"
      expand_structured_data: เท็จ
      force_rdns: เท็จ
      number_worker_threads: 8
      override_source: null
      พอร์ต: 5999
      recv_buffer_size: null
      store_full_message: จริง
  - ชื่อ: "test_input_api_2"
    ประเภท: "org.graylog2.inputs.syslog.udp.SyslogUDPInput"
    ทั่วโลก: เท็จ
    การกำหนดค่า:
      allow_override_date: เท็จ
      bind_address: "0.0.0.0"
      expand_structured_data: เท็จ
      force_rdns: เท็จ
      number_worker_threads: 8
      override_source: null
      พอร์ต: 5998
      recv_buffer_size: null
      store_full_message: จริง

playbook.yml

---
- ชื่อ: กำหนดค่าระบบ
  โฮสต์: greylog
  การเชื่อมต่อ: ท้องถิ่น
  Gather_facts: ไม่
  บทบาท:
    - เกรย์ล็อก / อินพุต

บทบาท/graylog/inputs/tasks/main.yml

---
- include_tasks: get_inputs.yml
- include_tasks: put_inputs.yml

บทบาท/graylog/inputs/tasks/get_inputs.yml

--- 
- ชื่อ: "API รับอินพุตระบบ"
    ยูริ:
      url: http://{{ ansible_host }}:9000/api/system/inputs
      url_username : "{{ system.users.triple_admin.api_token }}"
      url_password: โทเค็น
      วิธีการ: รับ
      return_content: ใช่
    ลงทะเบียน: get_graylog_inputs

- ชื่อ: ตั้งข้อเท็จจริง
  set_fact:
    get_input_id: "{{ get_graylog_inputs.content | from_json | json_query('inputs[?title == `{}`] | [0].id '.format(input.title)) }}"
  วนซ้ำ: "{{ อินพุต }}"
  loop_control:
    loop_var: อินพุต

บทบาท/graylog/inputs/tasks/put_inputs.yml

---
  - ชื่อ: "อินพุตระบบ API PUT"
    ยูริ:
      url: http://{{ ansible_host }}:9000/api/system/inputs/{{ get_input_id }}
      url_username : "{{ system.users.triple_admin.api_token }}"
      url_password: โทเค็น
      ส่วนหัว:
        X-ขอโดย: X-Ansible
      วิธีการ: PUT
      body_format: json
      เนื้อความ: "{{ ค้นหา('แม่แบบ', 'แม่แบบ/post_template.j2') }}"
      สถานะ_รหัส: 201
      return_content: ใช่
    วนซ้ำ: "{{ อินพุต }}"
    loop_control:
      loop_var: อินพุต

ปัญหาที่เป็นไปได้

คำสั่งวนคู่ในการเล่น

อย่างที่คุณเห็นใน get_inputs.yml ฉันวนลูปเหนือ อินพุต dict ใน host_vars ภายในงาน set_fact เพื่อรับ ID จาก REST api สำหรับแต่ละรายการอินพุตที่กำหนดไว้ใน host_vars ที่ตรงกับชื่อเรื่อง

แนวคิดเบื้องหลังสิ่งนี้คือเมื่อฉันต้องการเปลี่ยนบางอย่างเกี่ยวกับรายการอินพุต ฉันสามารถทำ PUT ที่สร้างเส้นทางภายในงาน put_inputs.yml ตัวแปร URL ไปยังอินพุตด้วยรหัสที่รวบรวมด้วย GET และตั้งค่าเป็นข้อเท็จจริงโดยงาน get_facts จากนั้นเล่นงาน PUT กับ API ที่เหลือและปรับพารามิเตอร์บางตัว

แต่ฉันก็ต้องทำวนซ้ำเหมือนกัน อินพุต dict ใน host_vars ภายในไฟล์ put_inputs.yml เพราะหากมีการเปลี่ยนแปลงหลายรายการฉันต้องการวนซ้ำ PUT

ปัญหาคือว่า get_facts ได้รับทั้งค่า id ดังที่แสดงด้านล่าง มีเพียงค่าสุดท้ายเท่านั้นที่ลงทะเบียนเป็นข้อเท็จจริง เนื่องจากเป็นการวนซ้ำและมีชื่อเดียวกัน

    "ansible_facts": {
        "get_input_id": "61015085eca1554750236084",
        "get_input_titles": "ทดสอบ_input_api"
    },
    "ansible_facts": {
        "get_input_id": "610282d0eca155475024ac91",
        "get_input_titles": "ทดสอบ_input_api_2"

ดังนั้นเมื่อ put_inputs.yml มีการเล่นงาน (หลังจาก get_inputs.yml) ฉันจบลงด้วยการตอบสนองต่อไปนี้จากการเล่นซึ่งสั้น ๆ คือทั้งสองครั้งกำลังเล่นงาน (ตามลูป) ฉันได้รับเหมือนกัน get_input_id ค่า.

วนรอบ 1 - ต้องจับคู่กับชื่อเรื่องและรับ id "61015085eca1554750236084"

        "ชื่อเรื่อง": "test_input_api",
            "url": "http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91",

วนรอบ 2

        "ชื่อเรื่อง": "test_input_api_2",
            "url": "http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91",

คำถาม

ฉันต้องได้รับ ID จาก GET เพราะจำเป็นใน URL ในงาน PUT เพื่อแก้ไขรายการ "อินพุต" เฉพาะ แต่เนื่องจากฉันต้องจับคู่ ID กับ Title ฉันต้องทำลูป แต่อย่างที่ฉันพูดไปก่อนหน้านี้ส่งผลให้ได้รับค่า ID เพียงค่าเดียวซึ่งใช้ในลูป PUT สำหรับรายการทั้งหมดในอินพุต dict นี่คือ ไม่ใช่สิ่งที่ฉันต้องการเพราะฉันต้องสามารถแก้ไขทุกรายการแยกกันตาม ID

ความช่วยเหลือทั้งหมดยินดีต้อนรับ !

Zeitounator avatar
fr flag
สวัสดี. โปรดอย่าข้ามโพสต์ [คำถามเดียวกัน](https://stackoverflow.com/questions/68587692/ansible-issue-with-loop-and-json-querys) ในเว็บไซต์ stackexchange ที่แตกต่างกัน เลือกหนึ่งที่เหมาะสมที่สุด

โพสต์คำตอบ

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