saltstack return 不一致的错误

saltstack return inconsistent errors

Saltstack(版本=3004)最近在不同的 SLS 文件上返回了各种错误,而这些文件最近没有更改。不同的 运行 抱怨不同的文件,或者干脆成功。这种情况发生在我们的 20 台主机上,而不仅仅是一台主机。我们在 ubuntu 20.04 LTS 主机上的无主上下文中使用 salt-call

关键是re-运行ning salt-call一般都能成功,没有问题。如果没有,下一个 运行 会。也许之后的 运行 会失败,因为我们的 SLS 存储库中没有任何更改。似乎没有任何宇宙法则要求在成功之前先失败,这更像是随机掷骰子。

不用说,在指定的时间点查看 SLS 文件到目前为止没有结果。

一些示例:

[myhost.example.com] sudo: salt-call --local state.highstate
[myhost.example.com] out: sudo password:
[myhost.example.com] out: [CRITICAL] Rendering SLS 'base:dulcia' failed: while parsing a block node
[myhost.example.com] out: did not find expected node content
[myhost.example.com] out:   in "<unicode string>", line 148, column 17
[myhost.example.com] out: local:
[myhost.example.com] out:     Data failed to compile:
[myhost.example.com] out: ----------
[myhost.example.com] out:     Rendering SLS 'base:dulcia' failed: while parsing a block node
[myhost.example.com] out: did not find expected node content
[myhost.example.com] out:   in "<unicode string>", line 148, column 17

另一个:

[otherhost.example.com] sudo: salt-call --local state.highstate
[otherhost.example.com] out: sudo password:
[otherhost.example.com] out: [CRITICAL] Rendering SLS 'base:dulcia' failed: did not find expected comment or line break
[otherhost.example.com] out: local:
[otherhost.example.com] out:     Data failed to compile:
[otherhost.example.com] out: ----------
[otherhost.example.com] out:     Rendering SLS 'base:dulcia' failed: did not find expected comment or line break

还有一个:

[host-3.example.com] sudo: salt-call --local state.highstate
[host-3.example.com] out: sudo password:
[host-3.example.com] out: [CRITICAL] Rendering SLS 'base:sftp' failed: while parsing a block node
[host-3.example.com] out: did not find expected node content
[host-3.example.com] out:   in "<unicode string>", line 235, column 17
[host-3.example.com] out: local:
[host-3.example.com] out:     Data failed to compile:
[host-3.example.com] out: ----------
[host-3.example.com] out:     Rendering SLS 'base:sftp' failed: while parsing a block node
[host-3.example.com] out: did not find expected node content
[host-3.example.com] out:   in "<unicode string>", line 235, column 17
[host-3.example.com] out: 

甚至

[host-3.example.com] sudo: salt-call --local state.highstate
[host-3.example.com] out: sudo password:
[host-3.example.com] out: [CRITICAL] Rendering SLS 'base:sftp' failed: did not find expected alphabetic or numeric character
[host-3.example.com] out: local:
[host-3.example.com] out:     Data failed to compile:
[host-3.example.com] out: ----------
[host-3.example.com] out:     Rendering SLS 'base:sftp' failed: did not find expected alphabetic or numeric character
[host-3.example.com] out: 

我对此完全不知所措,调试起来非常棘手,因为超过一半的时间它不会发生。

好消息。所有这些错误都是 yaml 渲染错误而不是 jinja。它们可能是由 jinja 渲染引起的,但 jinja 正在完成它的渲染周期而没有抛出错误。很可能某些值没有设置为您认为的值。或者 jinja 没有在应该的时候提取正确的值。也许在应该设置的无主配置中没有设置支柱变量,然后在下一个 运行 上设置它。或柱子渲染时间过长。

开始调试的最简单方法是开始呈现 jinja 并验证生成的 yaml。这可以通过 slsutil.renderer

来完成
salt-call slsutil.renderer salt://sftp/init.sls default_renderer=jinja

由于问题是间歇性的,您将不得不不断渲染似乎最常失败的状态,直到它们失败为止。也许在长时间停顿之后和 运行 进入高状态之前尝试。

另一件有用的事情是将日志记录插入到 jinja 中。这可以通过简单的方式完成 {% do salt["log.info"]('string to log') %} 我发现这在 jinja 渲染不正确的问题上很有用。

还有 运行 带 -l 调试的高级状态。它将显示每个 yaml 文件的渲染过程。这样您就可以看到正在发生的事情并看到正在发生的错误。