使用 Jenkinsfile 到 运行 salt 命令的最佳方式
Best way to use Jenkinsfile to run salt command
我最近开始使用 Jenkinsfile
and the pipeline plugin,我想知道当测试通过或合并拉取时,让我的 salt 主服务器向 运行 命令的最佳方式是什么例如请求。
有一个 jenkinsci/saltstack-plugin 效果很好(不能处理彩色输出,但没关系)。
一个。 运行 Jenkinsfile
中的加盐步骤会更好吗?
b. 与上述插件交互的语法是什么?
或者我应该设置我的 Salt master(在不同的服务器上)作为 jenkins 从节点并直接在 salt master 上执行命令。
此处草稿:
node("salt-master") {
sh "salt -E 'some.target.*' state.sls some.state"
}
我认为选项 2 可行,但我还没有将 master 设置为 e jenkins slave。
Jenkins
和 SaltStack
都是我们 CI/CD 流程的核心。 Jenkins
负责工件(deb
s、rpm
s、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
通过 SaltAPI
向 SaltMaster
进行身份验证,并在集群中启动通用盐 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 为互联网服务建立状态,而无需自身能够访问互联网。
我最近开始使用 Jenkinsfile
and the pipeline plugin,我想知道当测试通过或合并拉取时,让我的 salt 主服务器向 运行 命令的最佳方式是什么例如请求。
有一个 jenkinsci/saltstack-plugin 效果很好(不能处理彩色输出,但没关系)。
一个。 运行
Jenkinsfile
中的加盐步骤会更好吗?
b. 与上述插件交互的语法是什么?或者我应该设置我的 Salt master(在不同的服务器上)作为 jenkins 从节点并直接在 salt master 上执行命令。
此处草稿:
node("salt-master") {
sh "salt -E 'some.target.*' state.sls some.state"
}
我认为选项 2 可行,但我还没有将 master 设置为 e jenkins slave。
Jenkins
和 SaltStack
都是我们 CI/CD 流程的核心。 Jenkins
负责工件(deb
s、rpm
s、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
通过 SaltAPI
向 SaltMaster
进行身份验证,并在集群中启动通用盐 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 为互联网服务建立状态,而无需自身能够访问互联网。