Puncte:0

Ansible - problemă cu bucla și json_query

drapel gb

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!

Zeitounator avatar
drapel fr
Bună. Vă rugăm să nu postați încrucișat [aceeași întrebare](https://stackoverflow.com/questions/68587692/ansible-issue-with-loop-and-json-querys) pe diferite site-uri stackexchange. Alege-l pe cel mai potrivit.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.