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

时间:2016-09-06 18:41:00

标签: jenkins salt-stack jenkinsfile

我最近开始使用Jenkinsfilepipeline plugin,我想知道在测试通过或合并时我的盐主服务器运行命令的最佳方法是什么拉请求例如。

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

  1. 一个。 Jenkinsfile范围内运行salt步骤会更好吗?
    与上述插件进行交互的语法是什么?

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

  3. 这里草稿:

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

    我认为选项2可行,但我还没有将主人设置为e jenkins奴隶。

2 个答案:

答案 0 :(得分:3)

这是对旧帖子的更新,但是如果它对任何人都有帮助,那么作为JenkinsFile中的一个步骤的saltplugin的语法在jenkins wiki上给出: https://wiki.jenkins-ci.org/display/JENKINS/saltstack-plugin

以下内容将为您提供prettyprint 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中,我们可以发送一个盐钩调用,在saltmaster上启动一个反应堆向Slack或MS团队发送通知。因此,我们的jenkins服务器能够将构建状态发布到互联网服务,而无需访问互联网。

答案 1 :(得分:2)

JenkinsSaltStack都是CI / CD流程的核心。 Jenkins负责artifcats(deb s,rpm,Docker镜像,静态文件等),而SaltStack则在我们的群集中执行工件的部署。 Jenkins群集和SaltMaster位于不同的主机上。

很遗憾,我并不知道Jenkinsfile(我们现在必须使用Jenkins 1.x),也不知道将SaltMaster转换为{ {1}}奴隶。目前,我们的CD由几十个不同的Jenkins工作(由我们后端的许多微服务组成)组成,这些工作由相应的上游构建作业触发。每个部署作业都有一个Jenkins步骤。

saltstack-plugin在不同的端口上提供入口点 - SaltMaster。可能是SaltApi的某些部分可能有用:

/etc/salt/master

因此,在我们的案例中,external_auth: pam: jenkins: - .* rest_cherrypy: port: 8001 host: 0.0.0.0 通过JenkinsSaltMaster进行身份验证,并在群集中启动常见的盐rpcs。没有管道,因为我们的项目太复杂,管道不合适。