Tôi đang sử dụng mô-đun URI ansible để giao tiếp với api REST. Tôi có nhiệm vụ thực hiện GET để lấy cho tôi một số dữ liệu mà tôi muốn sử dụng sau này. Tôi muốn có thể khớp một biến nhất định từ GET để tạo đường dẫn thực hiện PUT trên api REST. mã của tôi là như sau
vở kịch
*host_vars/host.yml
*
---
đầu vào:
- tiêu đề: "test_input_api"
gõ: "org.graylog2.inputs.syslog.udp.SyslogUDPInput"
toàn cầu: sai
cấu hình:
allow_override_date: sai
bind_address: "0.0.0.0"
expand_structed_data: sai
force_rdns: sai
số_nhân_viên: 8
override_source: null
cổng: 5999
recv_buffer_size: null
store_full_message: true
- tiêu đề: "test_input_api_2"
gõ: "org.graylog2.inputs.syslog.udp.SyslogUDPInput"
toàn cầu: sai
cấu hình:
allow_override_date: sai
bind_address: "0.0.0.0"
expand_structed_data: sai
force_rdns: sai
số_nhân_viên: 8
override_source: null
cảng: 5998
recv_buffer_size: null
store_full_message: true
playbook.yml
---
- name: Cấu hình hệ thống
máy chủ: greylog
kết nối: cục bộ
thu thập_sự kiện: không
vai trò:
- greylog/đầu vào
vai trò/graylog/đầu vào/tác vụ/main.yml
---
- bao gồm_tác vụ: get_inputs.yml
- bao gồm_tác vụ: put_inputs.yml
vai trò/graylog/đầu vào/tác vụ/get_inputs.yml
---
- tên: "API NHẬN Đầu vào hệ thống"
bạn:
url: http://{{ ansible_host }}:9000/api/system/inputs
url_username : "{{system.users.triple_admin.api_token }}"
url_password: mã thông báo
phương pháp: NHẬN
return_content: có
đăng ký: get_graylog_inputs
- tên: Set Fact
set_fact:
get_input_id: "{{ get_graylog_inputs.content | from_json | json_query('inputs[?title == `{}`] | [0].id '.format(input.title)) }}"
vòng lặp: "{{đầu vào}}"
loop_control:
loop_var: đầu vào
vai trò/graylog/đầu vào/tác vụ/put_inputs.yml
---
- tên: "Đầu vào hệ thống API PUT"
bạn:
url: http://{{ ansible_host }}:9000/api/system/inputs/{{ get_input_id }}
url_username : "{{system.users.triple_admin.api_token }}"
url_password: mã thông báo
tiêu đề:
X-Requested-By: X-Ansible
phương pháp: ĐẶT
body_format: json
body: "{{ tra cứu('template', 'templates/post_template.j2') }}"
status_code: 201
return_content: có
vòng lặp: "{{đầu vào}}"
loop_control:
loop_var: đầu vào
vấn đề có thể xảy ra
Một câu lệnh lặp kép trong vở kịch
Như bạn có thể thấy trong get_inputs.yml tôi làm một vòng lặp trên đầu vào dict trong host_vars trong tác vụ set_fact để lấy ID từ API REST cho mỗi mục nhập đầu vào được xác định trong host_vars phù hợp với tiêu đề.
Ý tưởng đằng sau điều này là khi tôi muốn thay đổi điều gì đó về mục nhập đầu vào, tôi có thể thực hiện PUT để tạo đường dẫn trong tác vụ put_inputs.yml biến URL đến đầu vào có id được thu thập bằng GET và được tác vụ get_facts đặt thành thực tế, sau đó phát tác vụ PUT cho api còn lại và điều chỉnh một số tham số.
Nhưng tôi cũng cần thực hiện một vòng lặp tương tự đầu vào dict trong host_vars trong put_inputs.yml bởi vì nếu có thay đổi đối với nhiều mục nhập, tôi muốn lặp lại PUT.
Vấn đề là get_facts nhận cả hai giá trị id như hiển thị bên dưới, chỉ có giá trị cuối cùng được đăng ký là thực tế vì đó là một vòng lặp và chúng có cùng tên.
"ansible_facts": {
"get_input_id": "61015085eca1554750236084",
"get_input_titles": "kiểm tra_input_api"
},
"ansible_facts": {
"get_input_id": "610282d0eca155475024ac91",
"get_input_titles": "kiểm tra_input_api_2"
Vì vậy, khi put_inputs.yml nhiệm vụ được chơi (sau khi get_inputs.yml) Tôi kết thúc với phản hồi sau từ vở kịch, tóm lại là cả hai lần nhiệm vụ đang được phát ( theo vòng lặp ) tôi đều nhận được như vậy get_input_id giá trị.
vòng 1 - điều này cần phải được khớp với tiêu đề và do đó nhận id "61015085eca1554750236084"
"tiêu đề": "test_input_api",
"url": "http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91",
vòng 2
"tiêu đề": "test_input_api_2",
"url": "http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91",
Câu hỏi
Tôi cần lấy ID từ GET vì nó cần có trong URL trong tác vụ PUT để chỉnh sửa mục nhập "đầu vào" cụ thể. Nhưng vì tôi cần khớp ID với Tiêu đề nên tôi cần thực hiện một vòng lặp nhưng điều này như tôi đã nói trước đây dẫn đến việc chỉ nhận được một giá trị ID như một thực tế đang được sử dụng trong vòng lặp PUT cho tất cả các mục trong đầu vào dict đây là không phải thứ tôi cần vì tôi cần có thể chỉnh sửa riêng từng mục nhập dựa trên ID.
Mọi sự giúp đỡ đều được chào đón!