Рейтинг:0

Ansible — проблема с циклом и json_query

флаг gb

Я использую модуль ansible URI для общения с API REST. У меня есть задача выполнить GET, чтобы получить данные, которые я хочу использовать позже. Я хочу иметь возможность сопоставить определенную переменную из GET, чтобы создать путь для выполнения PUT в API REST. Мой код выглядит следующим образом

сборник пьес

*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: ложь
      число_воркер_потоков: 8
      override_source: ноль
      порт: 5999
      recv_buffer_size: ноль
      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: ложь
      число_воркер_потоков: 8
      override_source: ноль
      порт: 5998
      recv_buffer_size: ноль
      store_full_message: правда

playbook.yml

---
- имя: Настроить систему
  хосты: серый журнал
  подключение: местное
  собрать_факты: нет
  роли:
    - серый журнал/входы

роли/серый журнал/входы/задачи/main.yml

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

роли/серый журнал/входы/задачи/get_inputs.yml

--- 
- имя: "Системные входы API GET"
    ури:
      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: ввод

роли/серый журнал/входы/задачи/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-Requested-By: X-Ansible
      метод: ПОЛОЖИТЬ
      body_format: json
      body: "{{ lookup('template', 'templates/post_template.j2') }}"
      код_статуса: 201
      return_content: да
    цикл: "{{входы}}"
    loop_control:
      loop_var: ввод

возможная проблема

Оператор двойной петли в пьесе

Как вы можете видеть в get_inputs.yml Я делаю петлю над входы dict в host_vars в рамках задачи set_fact, чтобы получить идентификатор из API REST для каждой входной записи, которая определена в host_vars что соответствует названию.

Идея этого заключается в том, что когда я хочу что-то изменить во входной записи, я могу сделать PUT, который строит путь внутри задачи. put_inputs.yml переменная URL-адрес на вход с идентификатором, который собран с помощью GET и установлен на факт задачей get_facts, а затем воспроизвести задачу PUT для остальных API и настроить какой-либо параметр.

Но мне также нужно сделать цикл над тем же входы dict в host_vars внутри put_inputs.yml потому что, если есть изменения в нескольких записях, я хочу зациклить PUT.

Проблема в том, что get_facts получает оба значения идентификатора, как показано ниже, только последнее из них регистрируется как факт, потому что это цикл, и они получают одно и то же имя.

    "необходимые_факты": {
        "get_input_id": "61015085eca1554750236084",
        "get_input_titles": "test_input_api"
    },
    "необходимые_факты": {
        "get_input_id": "610282d0eca155475024ac91",
        "get_input_titles": "test_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",

Вопрос

Мне нужно получить идентификатор из GET, потому что он необходим в URL-адресе в задаче PUT для редактирования конкретной «входной» записи. Но поскольку мне нужно сопоставить идентификатор с заголовком, мне нужно выполнить цикл, но это, как я уже говорил ранее, приводит к получению только одного значения идентификатора как факта, который используется в цикле PUT для всех элементов во входных данных. это не то, что мне нужно, потому что мне нужно иметь возможность редактировать каждую запись отдельно на основе идентификатора.

Всякая помощь приветствуется!

Zeitounator avatar
флаг fr
Привет. Пожалуйста, не публикуйте [тот же вопрос] (https://stackoverflow.com/questions/68587692/ansible-issue-with-loop-and-json-querys) на разных сайтах обмена стеками. Выберите тот, который является наиболее подходящим.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.