我正在尝试在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脚本吗?谢谢
您使用普通外壳命令而不是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