ฉันใช้โมดูล 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
ความช่วยเหลือทั้งหมดยินดีต้อนรับ !