Я использую модуль 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 для всех элементов во входных данных. это не то, что мне нужно, потому что мне нужно иметь возможность редактировать каждую запись отдельно на основе идентификатора.
Всякая помощь приветствуется!