没有 运行 它们的 Linting Salt 状态

Linting Salt states without running them

我在家庭实验室中使用 Saltstack,并且我经常发现自己在测试时检查了稍微违反规则的规则。我希望能够检查它们的有效性,或者在本地和 Jenkins 实例上对它们进行 lint,但我找不到任何关于如何这样做的文档。有什么我想念的吗?

盐州支持 testing interface。例如:

salt '*' state.highstate test=True

这应该 运行 状态并告诉您它们 做的所有事情,而无需实际更改任何东西——实际上它是一个干燥的 运行。虽然它不是直接的 linting 工具,但它确实验证了 Salt 能够解析和 运行 一切。

语法问题在 Salt 中是多层的(i.g。Jinja -> YAML -> 状态函数参数)并且没有工具可以涵盖所有这些问题。

基于this related issue的快速解答是触发多层解析:

salt-call state.show_highstate      | tee highstate.output.yaml
salt-call state.show_sls [state_id] | tee state_id.output.yaml

show_* 函数显示 minion 在执行前看到的状态数据。

在 minion 端使用 salt-call(而不是在 master 端使用 salt)通常会提供更好的调试选项 - 这主要是一种偏好。

问题也可能出在柱子或谷物中(检查所有需要的数据是否按预期编译和存在):

salt-call pillar.items | tee pillar.output.yaml
salt-call grains.items | tee grains.output.yaml

就像一样,运行直接说明(是否有测试模式)是排错的最后一步:

salt-call state.highstate      test=True | tee highstate.output.yaml
salt-call state.sls [state_id] test=True | tee state_id.output.yaml

test 选项对于检查 YAML 配置很重要。相反,请尝试创建一个包含如下内容的预签入脚本:

salt-call state.highstate --file-root=$PWD --local --retcode-passthrough mocked=True
  • --file-root 允许您指定当前位置 结帐
  • --local表示该动作不应该运行通过 大师
  • --retcode-passthrough 如果无法构造任何规则,则此命令将以非零值退出
  • mock=True 处理所有规则,但不启动连接。这是 2015.8.5 中的新功能。另一种方法是 运行 state.show_highstate

我一直在寻找一种在 salt state 上实现此 QA 内容的好方法,到目前为止我的最佳答案是:

  1. 使用 jenkins 启动作业(通过 ssh),基于开发 git 分支:

    • 在我们的实验室 proxmox 私有云上提供 lxc(与我们在产品中执行此操作的方式完全相同)

    • 容器使用盐反应器获取其配置(就像在产品上一样)

    • 使用 testinfra 运行 对构建和配置的容器进行单元测试

    • 最后,如果一切正常,请销毁容器,如果不正常,请在早上的调试会话中保持它的活动状态:)

  2. 我们还 运行 一个 linting jenkins jobs as :

    for state in $(sudo /usr/bin/salt-call cp.list_states | awk '{print }' | grep -v "^top$"); do sudo /usr/bin/salt-call --retcode-passthrough state.show_sls ${state} ; done
    

我在为最后一个 linting 作业获取正确的 return 代码时仍然遇到一些问题(因为 ssh 等)。

这个过程整体保证:

  1. 我们的配置过程正常
  2. 我们的代码库(状态 + 支柱)按预期工作
  3. 我们可以以很高的置信度将 dev 合并到 prod

testinfra 的真正优点在于它可以使用盐连接后端,允许 testinfra 连接到容器而无需部署 ssh 密钥或其他任何东西(因为我们使用 salt-cloud 作为初始配置)

有关 testinfra 的更多信息 salt connection backend, testinfra salt module

这并不完美,但仍然做得很好。