使用 Jenkinsfile 到 运行 salt 命令的最佳方式

Best way to use Jenkinsfile to run salt command

我最近开始使用 Jenkinsfile and the pipeline plugin,我想知道当测试通过或合并拉取时,让我的 salt 主服务器向 运行 命令的最佳方式是什么例如请求。

有一个 jenkinsci/saltstack-plugin 效果很好(不能处理彩色输出,但没关系)。

  1. 一个。 运行 Jenkinsfile 中的加盐步骤会更好吗?
    b. 与上述插件交互的语法是什么?

  2. 或者我应该设置我的 Salt master(在不同的服务器上)作为 jenkins 从节点并直接在 salt master 上执行命令。

此处草稿:

node("salt-master") {
    sh "salt -E 'some.target.*' state.sls some.state"
}

我认为选项 2 可行,但我还没有将 master 设置为 e jenkins slave。

JenkinsSaltStack 都是我们 CI/CD 流程的核心。 Jenkins 负责工件(debs、rpms、Docker 图像、静态文件等),而 SaltStack 执行工件在我们之间的部署簇。 Jenkins 集群和 SaltMaster 位于不同的主机上。

不幸的是,我不知道 Jenkinsfile(我们现在必须使用 Jenkins 1.x),也不知道将 SaltMaster 变成 [=11] 的选项=] 奴隶。目前,我们的 CD 包含几十个不同的 Jenkins 作业(通过我们后端的许多微服务),这些作业由对应的上游构建作业触发。每个部署作业中都有一个 saltstack-plugin 步骤。

SaltMaster 在不同的端口上提供入口点 - SaltApi。可能我们的某些部分 /etc/salt/master 可能有用:

external_auth:
  pam:
    jenkins:
    - .*

rest_cherrypy:
  port: 8001
  host: 0.0.0.0

所以在我们的例子中,Jenkins 通过 SaltAPISaltMaster 进行身份验证,并在集群中启动通用盐 rpc。没有流水线,因为我们的项目太复杂,流水线不合适。

这是对旧 post 的更新,但如果它对任何人有帮助,jenkins wiki 上提供了作为 JenkinsFile 中的一个步骤的 saltplugin 的语法: https://wiki.jenkins-ci.org/display/JENKINS/saltstack-plugin

像下面这样的东西会给你漂亮的打印json输出

import groovy.json.*

node() {
  saltresult = salt authtype: 'pam', clientInterface: local(arguments: '"ls -la"', blockbuild: true,
function: 'cmd.run', jobPollTime: 16, target: '*', targetType: 'glob'),
credentialsId: 'a3d814c2-84ed-4752-94a8-271791bb5375', servername: 'http://localhost:8000'
  def prettyJson = JsonOutput.prettyPrint(saltresult)
  println(prettyJson)
}

使用 jenkins 插件的一个好处是您可以访问其他 salt-api 端点,例如 hook。我们的 jenkins 服务器位于无法访问互联网的内部网络上,但我们的 saltmaster 在另一个网络上并且能够退出。然后,在我们的 JenkinsFiles 中,我们可以发送一个 salt hook 调用,它会在 saltmaster 上启动一个反应器,以向 Slack 或 MS Teams 发送通知。因此,我们的 jenkins 服务器能够 post 为互联网服务建立状态,而无需自身能够访问互联网。