在ansible中执行curl命令

问题描述 投票:0回答:1

我正在尝试在ansible剧本中传递此curl命令:

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

这是我的烦人的剧本:

- 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"

事实是,此命令具有多个双重且简单的棚,因此它不会产生混乱,是否有必要在此处传递它,否则我应该为此创建一个shell脚本吗?谢谢

shell curl ansible ambari
1个回答
1
投票

您使用普通外壳命令而不是uri模块是有原因的吗?一般的最佳做法是选择Ansible模块。它们已经适合Ansible(例如,更改检测,错误处理),可以节省您的工作,并在需要时可能会担心安全性。

例如,在您的情况下,它避免了使用多个嵌套引号的麻烦,因为它提取了参数而不是进行大的调用。当Ansible模块在用例中不起作用时,应仅在特殊情况下使用Raw shell命令。

类似这样的事情应该适合使用uri模块的基本请求:

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_format: json headers: 'X-Requested-By': 'ambari' 调用所需的其他引号。可以使用类似这样的东西:

    curl
  • Ansible数据结构,如数组。只要body: '[{"Event": ...' 设置为相应的类型(如我上面的示例所示),Ansible就会自动将其转换为JSON

  • 来自文件。如果JSON较大,我更喜欢这样做,因为您可以直接将对象粘贴到那里并进行适当的格式化,而不会弄乱Ansible部分。像这样使用body_format

    lookup

只需将所需的body: "{{ lookup('file','api-body.json') }}" 属性添加到body。例如,如果您想拥有一个json文件,例如:

uri
© www.soinside.com 2019 - 2024. All rights reserved.