SaltStack cmd.run with curl 和 json body
SaltStack cmd.run with curl and json body
我有一个琐碎的任务,我不得不为其编写 salt state。我需要使用带有 json 正文的 curl 调用 REST 端点。这是
curl localhost/endpoint -d '{"some" : "data"}'
我的想法是简单地使用它并使用 cmd.run
将其放入盐状态。不起作用。到目前为止我有这个:
{%- set data = {'some': 'data'} %}
Use echo instead of curl:
cmd.run:
- name: echo '{{ data|json }}'
这给了我
failed: Unknown yaml render error; line 5
Use echo instead of curl:
cmd.run:
- name: echo '{"some": "data"}' <======================
我有 Salt 版本 2014.7.1
使用 json 时,有时完全避免使用 jinja 渲染器会更容易。下面的示例使用了 pybojects 渲染器(这也有很多其他原因)。
echo.sls:
#!pyobjects
import json
data = {'some': 'data'}
def dump(d):
return "'" + json.dumps(d).replace("'", "'\''") + "'"
Cmd.run("echo {}".format(dump(data)))
请注意,为了完整起见,添加了自定义 dump
函数定义和用法。
对我来说,问题是 curl
命令中的“:”被解释为 YAML(参见:How to escape indicator characters (i.e. : or - ) in YAML)
我最终使用了 multi-line approach。这使我可以在变量(例如支柱数据)仍然被正确解释的情况下编写没有转义的命令。
例如
Salt state description:
cmd.run:
- name: >-
curl -X GET "https://api.example.com/client/{{ pillar['client_id'] }}" -H "X-Auth-Email: name@example.co.za" -H "X-Auth-Key: {{ pillar['api_key'] }}" -H "Content-Type: application/json" --data '{"some_json":true}'
我有一个琐碎的任务,我不得不为其编写 salt state。我需要使用带有 json 正文的 curl 调用 REST 端点。这是
curl localhost/endpoint -d '{"some" : "data"}'
我的想法是简单地使用它并使用 cmd.run
将其放入盐状态。不起作用。到目前为止我有这个:
{%- set data = {'some': 'data'} %}
Use echo instead of curl:
cmd.run:
- name: echo '{{ data|json }}'
这给了我
failed: Unknown yaml render error; line 5
Use echo instead of curl:
cmd.run:
- name: echo '{"some": "data"}' <======================
我有 Salt 版本 2014.7.1
使用 json 时,有时完全避免使用 jinja 渲染器会更容易。下面的示例使用了 pybojects 渲染器(这也有很多其他原因)。
echo.sls:
#!pyobjects
import json
data = {'some': 'data'}
def dump(d):
return "'" + json.dumps(d).replace("'", "'\''") + "'"
Cmd.run("echo {}".format(dump(data)))
请注意,为了完整起见,添加了自定义 dump
函数定义和用法。
对我来说,问题是 curl
命令中的“:”被解释为 YAML(参见:How to escape indicator characters (i.e. : or - ) in YAML)
我最终使用了 multi-line approach。这使我可以在变量(例如支柱数据)仍然被正确解释的情况下编写没有转义的命令。
例如
Salt state description:
cmd.run:
- name: >-
curl -X GET "https://api.example.com/client/{{ pillar['client_id'] }}" -H "X-Auth-Email: name@example.co.za" -H "X-Auth-Key: {{ pillar['api_key'] }}" -H "Content-Type: application/json" --data '{"some_json":true}'