【问题标题】:SaltStack cmd.run with curl and json bodySaltStack cmd.run 带有 curl 和 json 正文
【发布时间】:2015-07-25 20:39:27
【问题描述】:

我有一个琐碎的任务,我被困在写盐状态。我需要使用带有 json body 的 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

【问题讨论】:

    标签: jinja2 salt-stack


    【解决方案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函数定义和用法。

    【讨论】:

      【解决方案2】:

      对我来说,问题是 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}'
      

      【讨论】:

      • 你节省了我很多时间
      猜你喜欢
      • 2018-04-27
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多