需要JSON输出以换取Salt-api

时间:2017-10-11 09:36:37

标签: json salt salt-stack

   request({
        url: "https://xx.xxx.xxx.xxx:9999/run",
        headers: {
            'Accept': 'application/x-yaml',
            'X-Auth-Token': "41b9539436faae8016c305c2f875b31e47a23d93",
            'Content-type': 'application/json',
        },
        method: "POST",
        json: true,
        body: [{
            "client": "local",
            "tgt": "master_minion",
            "fun": "cmd.script",
            "kwarg": {"source": "salt://update-diff.py", "args":args},
            "username": "salt",
            "password": "salt",
            "eauth": "pam"
        }]
    }

我正在向salt-api发送请求以运行脚本。我需要解析输出。

示例输出:

return:
- master_minion:
    pid: 28796
    retcode: 0
    stderr: ''
    stdout: " sadfh,smfsdhg\n sfgmsfgmsg\n sfgmsfgmsg\n-dkfadnfklad--->New123\n+dkfadnfklad--->New1232\n\
      \ sdfjhs,dfhn\n sdfjhs,dfhn\n sdfjhs,dfhn"

我可以在JSON中获得这些输出吗?

我想要如下所示的数组中的所有行:

预期输出 [" sadfh,smfsdhg"" sfgmsfgmsg"" sfgmsfgmsg"" -dkfadnfklad ---> New123"&#34 + dkfadnfklad ---> New1232"" sdfjhs,dfhn"" sdfjhs,dfhn"" sdfjhs,dfhn"]

有什么建议吗?在此先感谢

1 个答案:

答案 0 :(得分:1)

要从salt-api返回JSON,您只需更改请求标头中的Accept-type:

struct foo {
  foo() : baz(foobar) {}
  enum bar {foobar, fbar, foob};
  bar baz;
};

void f() {
  for( auto x : { foo::foobar,
                  foo::fbar,
                  foo::
                  foo::
                  foo::foob } );
    // ...
}

然后你会得到类似的东西:

  request({
        url: "https://xx.xxx.xxx.xxx:9999/run",
        headers: {
            'Accept': 'application/json',
  ...

根据您的预期输出,我认为这不是您想要的。但是您的预期输出不是JSON。 JSON是一个基于键值的数据结构,就像python字典一样。你期待像列表一样的东西。您期望的列表可以是JSON的一部分,但需要一个密钥:

{
    "return": [
        {
            "master_minion": {
                "pid": 28796,
                "retcode": 0,
                "stderr": "",
                "stdout": " sadfh,smfsdhg\n sfgmsfgmsg\n sfgmsfgmsg\n-dkfadnfklad--->New123\n +dkfadn--->New1232\n  sdfjhs,dfhn\n sdfjhs,dfhn\n sdfjhs,dfhn"
            }
        }
    ]

}

salt-api无法将执行脚本的stdout从任意字符串格式化为JSON(如何知道\ n是列表项的标记)。您需要通过将update-diff.py脚本中的输出格式化为json(在脚本中)来自行完成。即便如此,你只会在其中获得一个带有JSON的字符串,但是你可以轻松地提取它并继续处理。