Существует ли причина, по которой вы используете простые команды оболочки вместо модуля uri
? Общая лучшая практика - отдавать предпочтение Ansible модулям. Они уже соответствуют Ansible (например, обнаружение изменений, обработка ошибок), сохраняют вашу работу и могут при необходимости заботиться о безопасности.
Например, в вашем случае он избегает борьбы с несколькими вложенными кавычками, поскольку он абстрагирует параметры вместо большого вызова. Необработанные команды оболочки следует использовать только в особых случаях, когда модуль Ansible не работает для варианта использования.
Примерно так должно соответствовать базовому запросу с использованием модуля uri
:
- name: Make an API call
uri:
method: POST
url: "https://{{ AMBARI_SERVER_HOST }}:8083/api/v1/ldap_sync_events"
url_username: "{{ AMBARI_USER }}"
url_password: "{{ AMBARI_PASSWORD }}"
body_format: json
headers:
'X-Requested-By': 'ambari'
Существует несколько способов передать тело JSON:
В виде строки, что было бы возможно здесь, поскольку вам не нужны дополнительные кавычки, которые вам нужны для curl
вызов. Нечто подобное можно использовать:
body: '[{"Event": ...'
A Ansible структура данных, подобная массиву. Ansible автоматически преобразует его в JSON, если для body_format
задан соответствующий тип, как в моем примере выше
Из файла. Я бы предпочел это, если JSON больше, потому что вы можете непосредственно вставить объект туда и иметь правильное форматирование, не испортив часть Ansible. Просто используйте lookup
вот так:
body: "{{ lookup('file','api-body.json') }}"
Просто добавьте желаемое свойство body
к uri
. Например, если вы хотите иметь файл json, например:
- name: Make an API call
uri:
method: POST
url: "https://{{ AMBARI_SERVER_HOST }}:8083/api/v1/ldap_sync_events"
url_username: "{{ AMBARI_USER }}"
url_password: "{{ AMBARI_PASSWORD }}"
body: "{{ lookup('file','api-body.json') }}"
body_format: json
headers:
'X-Requested-By': 'ambari'
# If you're interested in the response
return_content: yes
register: api_result