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}'