Выполнить команду curl в ansible - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь передать эту команду curl в ansible playbook:

shell: 'curl -k -u {{ AMBARI_USER }}:{{ AMBARI_PASSWORD }} -H 'X-Requested-By: ambari' -X POST -d '[{"Event": {"specs": [{"principal_type": "users", "sync_type": "all"}, {"principal_type": "groups", "sync_type": "all"}]}}]' https://{{AMBARI_SERVER_HOST}}:8083/api/v1/ldap_sync_events

вот моя ansible playbook:

- hosts: adm
  tasks:
    - name: sync ldap
      shell: "curl -k -u {{ AMBARI_USER }}:{{ AMBARI_PASSWORD }} -H 'X-Requested-By: ambari' -X POST -d '[{"Event": {"specs": [{"principal_type": "users", "sync_type": "all"}, {"principal_type": "groups", "sync_type": "all"}]}}]' https://{{AMBARI_SERVER_HOST}}:8083/api/v1/ldap_sync_events"

Дело в том, что эта команда имеет несколько двойные и простые цитаты, так что это не сработало, есть ли в любом случае, чтобы передать его здесь, или я должен создать сценарий оболочки для него? Спасибо

1 Ответ

1 голос
/ 30 января 2020

Существует ли причина, по которой вы используете простые команды оболочки вместо модуля 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
...