跟踪Salt minion上的命令失败

时间:2015-04-30 06:53:09

标签: salt-stack

我最近一个月用盐。每当我运行一个命令sudo salt '*' test.ping时,那么主人就会对所有的小兵进行操作,而响应就是所有已经启动并运行的小兵的列表。输出看起来像:

{
"minion_1": true
}
{
"minion_2": true
}
{
"minion_3": true
}

在master的conf文件中,返回类型配置为JSON。 但是如果我通过salt master执行错误的命令说sudo salt '*' test1.ping,那么master会返回类似这样的内容

{
"minion_1": "'test1.ping' is not available."
}
{
"minion_2": "'test1.ping' is not available."
}
{
"minion_3": "'test1.ping' is not available."
}

在上面显示的两个输出中,该命令在主控的shell /终端上给出了成功的退出代码。我们如何跟踪哪些小兵无法执行命令。我对它是什么类型的错误不感兴趣,我只需要一些或另一种方法来跟踪未能执行命令的minions。

最后一个解决方案是编写一个解析器,它将读取完整的输出并自行决定。希望有更好的解决方案。

2 个答案:

答案 0 :(得分:3)

绝望的原因

我现在不会依赖Salt的CLI退出代码(版本2014.7.5) - there are still many issues opened来解决此问题。

获取有效的JSON输出

--static选项可修复JSON输出:

  

如果使用--out=json,您可能也需要--static。如果没有静态选项,您将获得每个小兵的JSON字符串。

否则上面Salt给出的输出包含多个对象(每个minion一个),这不是有效的JSON(JSON需要单个对象,数组或每个文档的值)和标准JSON解析器加载整个输出的简单方法将失败。它甚至在documentation中提到(截至5188d6c):

  

一些JSON解析器可以猜测一个对象何时结束并且一个新对象开始但许多人不能。

除此之外,一些Salt选项(如show_jid)也向STDOUT发送字符串,将其与执行报告混合并使JSON输出格式无效。选项--static也解决了这个问题。

更新:用于检测Salt执行失败的解析器

这个问题让我非常紧张,所以我快速生了this Python script @ 75e42af example how it is used @ b819961d

注意:这不会解决任意Salt命令的输出(包括上面的test.ping),但是涉及与状态执行输出相关的问题。上面的test.ping问题仍有解决方案 - 它可以从状态运行,然后可以通过脚本分析输出。了解如何在州或*.sls文件in this answer内调用执行模块。

功能(代码本身的详细信息):

  • 处理highstateorchestrate参赛者的输出。
  • 处理多个小兵的输出和任意数量的命令。
  • 报告摘要“?N”和整体结果。
  • 可用作脚本和模块的独立文件。

唯一的限制是它需要JSON输出(Salt选项--out json),因为在将它提供给解析器之前很容易解决所讨论的问题。

答案 1 :(得分:0)

上述解析器仅适用于test.ping命令。 如果必须执行多个命令,我们将不得不编写一个更强大的解析器。