Folosesc modulul URI ansible pentru a vorbi cu o API REST. Am o sarcină de a efectua un GET pentru a-mi obține niște date pe care vreau să le folosesc mai târziu. Vreau să pot potrivi o anumită variabilă din GET pentru a crea calea pentru a face un PUT pe API-ul REST. Codul meu este după cum urmează
cartea de joc
*host_vars/host.yml
*
---
intrări:
- titlu: „test_input_api”
tip: „org.graylog2.inputs.syslog.udp.SyslogUDPInput”
global: fals
configuratie:
allow_override_date: false
bind_address: "0.0.0.0"
expand_structured_data: false
force_rdns: false
number_worker_threads: 8
override_source: null
port: 5999
recv_buffer_size: null
store_full_message: adevărat
- titlu: „test_input_api_2”
tip: „org.graylog2.inputs.syslog.udp.SyslogUDPInput”
global: fals
configuratie:
allow_override_date: false
bind_address: "0.0.0.0"
expand_structured_data: false
force_rdns: false
number_worker_threads: 8
override_source: null
portul: 5998
recv_buffer_size: null
store_full_message: adevărat
playbook.yml
---
- nume: Configurare sistem
gazde: graylog
conexiune: locală
gather_facts: nu
roluri:
- greylog/intrari
roles/graylog/inputs/tasks/main.yml
---
- include_tasks: get_inputs.yml
- include_tasks: put_inputs.yml
roles/graylog/inputs/tasks/get_inputs.yml
---
- nume: „API GET System Inputs”
uri:
url: http://{{ ansible_host }}:9000/api/system/inputs
url_username : „{{ system.users.triple_admin.api_token }}”
url_password: simbol
metoda: GET
return_content: da
înregistrare: get_graylog_inputs
- nume: Set Fact
set_fact:
get_input_id: „{{ get_graylog_inputs.content | from_json | json_query('inputs[?title == `{}`] | [0].id '.format(input.title)) }}”
buclă: „{{ intrări }}”
loop_control:
loop_var: intrare
roles/graylog/inputs/tasks/put_inputs.yml
---
- nume: „API PUT System Inputs”
uri:
url: http://{{ ansible_host }}:9000/api/system/inputs/{{ get_input_id }}
url_username : „{{ system.users.triple_admin.api_token }}”
url_password: simbol
anteturi:
X-Solicitat-de: X-Ansible
metoda: PUNERE
format_corp: json
body: "{{ lookup('șablon', 'șabloane/post_template.j2') }}"
cod_stare: 201
return_content: da
buclă: „{{ intrări }}”
loop_control:
loop_var: intrare
posibilă problemă
O declarație dublă buclă în cadrul piesei
După cum puteți vedea în get_inputs.yml Fac o buclă peste intrări dict în host_vars în sarcina set_fact pentru a obține ID-ul de la API-ul REST pentru fiecare intrare de intrare care este definită în host_vars care se potrivește cu titlul.
Ideea din spatele acestui lucru este atunci când vreau să schimb ceva despre intrarea de intrare, pot face un PUT care construiește o cale în cadrul sarcinii put_inputs.yml variabila URL la intrarea cu id-ul care este adunat cu GET și setat la fapt de sarcina get_facts și apoi redați sarcina PUT la restul api și ajustați un parametru.
Dar trebuie să fac și o buclă peste același lucru intrări dict în host_vars din put_inputs.yml pentru că dacă există modificări la mai multe intrări, vreau să fac bucla PUT.
Problema este că get_facts get sunt ambele valori de id, așa cum se arată mai jos, numai ultima este înregistrată ca fapt deoarece este o buclă și primesc același nume.
„ansible_facts”: {
"get_input_id": "61015085eca1554750236084",
"get_input_titles": "test_input_api"
},
„ansible_facts”: {
"get_input_id": "610282d0eca155475024ac91",
"get_input_titles": "test_input_api_2"
Deci, când put_inputs.yml se joacă sarcina (după get_inputs.yml) Sfârșesc cu următorul răspuns din joc, care pe scurt este că de ambele ori sarcina este jucată ( conform buclei ) primesc același lucru get_input_id valoare.
bucla 1 - aceasta trebuie să fie potrivită cu titlul și, prin urmare, să obțineți ID-ul „61015085eca1554750236084”
"title": "test_input_api",
„url”: „http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91”,
bucla 2
"title": "test_input_api_2",
„url”: „http://192.168.21.82:9000/api/system/inputs/610282d0eca155475024ac91”,
Întrebare
Trebuie să obțin ID-ul de la GET, deoarece este necesar în adresa URL din sarcina PUT pentru a edita o anumită intrare „de intrare”. Dar pentru că trebuie să potrivesc ID-ul cu titlul, trebuie să fac o buclă, dar asta, așa cum am spus anterior, are ca rezultat obținerea unei singure valori ID ca fapt care este utilizat în bucla PUT pentru toate elementele din dict-ul de intrare, acesta este nu este ceea ce am nevoie pentru că trebuie să pot edita fiecare intrare separat, pe baza ID-ului.
Orice ajutor este binevenit!