Почему модуль URI Ansible получает 400 с действующими учетными данными?

Мы используем модуль uri для запроса данных Graylog API в формате json.

- name: Get data
  uri:
    url: http://graylog-host:9000/api/system
    url_username: username
    url_password: password
    force_basic_auth: yes
    return_content: yes
    method: GET
    body_format: json
    validate_certs: false
  register: node_id_output

К сожалению, с этой задачей мы получаем следующую ошибку:

fatal: [hostname]: FAILED! => {"changed": false, "connection": "close", "content": "", "content_length": "0", "date": "Wed, 02 Sep 2020 07:21:25 GMT", "elapsed": 0, "msg": "Status code was 400 and not [200]: HTTP Error 400: Bad Request", "redirected": false, "status": 400, "url": "http://graylog-host:9000/api/system"}

Хотя следующая команда Curl работает нормально и возвращает допустимое содержимое JSON с кодом состояния 200:

curl -u username:password -H "Accept: application/json"  http://graylog-host:9000/api/system

Что могло бы быть причиной ошибки? В качестве альтернативы мы можем использовать body_format: form-urlencoded, который не возвращает 400, но, к сожалению, содержимое не может быть проанализировано фильтром json_query.


person Erik    schedule 02.09.2020    source источник
comment
Что, если вы удалите параметр body_format и добавите headers: {Accept: application/json}?   -  person zigarn    schedule 02.09.2020
comment
@zigarn правильный; можно увидеть Content-Length: 4 и Content-Type: application/json с телом null, если вы измените URL-адрес на requestbin.net или аналогичный; поскольку GET с телом очень странно, graylog отправляет обратно 400   -  person mdaniel    schedule 02.09.2020


Ответы (1)


Использование body_format: json установит заголовок Content-Type: application/json и отправит значение параметра body, которое будет null.

В вашем случае вы хотите установить заголовок Accept: application/json, чтобы вернуть JSON вместо чего-то еще (я думаю, XML).

- name: Get data
  uri:
    url: http://graylog-host:9000/api/system
    url_username: username
    url_password: password
    force_basic_auth: yes
    return_content: yes
    method: GET
    headers:
      Accept: application/json
    validate_certs: false
  register: node_id_output
person zigarn    schedule 02.09.2020