我在homelab中使用Saltstack,我经常发现自己在测试它们时会检查稍微破坏的规则。我希望能够在本地和Jenkins实例上检查它们的有效性,以及否则它们,但我找不到任何关于如何这样做的文档。我有什么遗失的吗?
答案 0 :(得分:10)
语法问题在Salt(例如Jinja - > YAML - >状态函数args)中是多层次的,并且没有工具可以覆盖它们。
基于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
就像@cyfur01 already mentioned一样,直接运行状态(是否使用测试模式)是排除故障的最后一步:
salt-call state.highstate test=True | tee highstate.output.yaml
salt-call state.sls [state_id] test=True | tee state_id.output.yaml
答案 1 :(得分:6)
Salt州支持testing interface。例如:
salt '*' state.highstate test=True
这应该运行状态并告诉你他们将所做的一切而不实际改变任何东西 - 实际上它是一个干运行。虽然它不是直接的linting工具,但它确实验证了Salt能够解析并运行所有内容。
答案 2 :(得分:3)
对于linting YAML配置,test
选项很重要。而是尝试创建包含以下内容的预检脚本:
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
答案 3 :(得分:1)
我一直在寻找一种在盐状态下实现这个QA的好方法,到目前为止我的最佳答案是:
使用jenkins基于dev git分支启动作业(通过ssh):
在我们的实验室proxmox私有云上提供lxc(与我们在prod中执行此操作的方式完全相同)
使用盐反应器,容器得到它的配置(就像生产时一样)
使用testinfra在内置和配置的容器上运行单元测试
最后如果一切正常,请销毁容器,如果没有将其保持活动以进行早上的调试会话:)
我们还经营一个linting jenkins工作:
for state in $(sudo /usr/bin/salt-call cp.list_states | awk '{print $2}' | grep -v "^top$"); do sudo /usr/bin/salt-call --retcode-passthrough state.show_sls ${state} ; done
我仍然遇到一些问题,为最后一个linting作业获取正确的返回码(因为ssh等等)。
此过程整体确保:
testinfra的真正好处在于它可以使用salt连接后端,允许testinfra连接到容器而无需部署ssh密钥或其他任何东西(因为我们使用salt-cloud进行初始配置)< / p>
有关testinfra的更多信息salt connection backend,testinfra salt module。
这不完美,但仍然做得很好。