【发布时间】:2018-10-11 05:17:25
【问题描述】:
我目前正在使用Chef's Jenkins supermarket cookbook 来部署一个 Jenkins 实例。作为该部署的一部分,我的秘诀包括安装 Jenkins、安装特定插件版本、启用安全性以及为 Jenkins 创建管理员帐户。
我目前正在为此使用单个配方文件。为启用安全性和创建管理员帐户而执行的脚本如下:
jenkins_script 'activate global security' do
command <<-EOH.gsub(/^ {4}/, '')
import jenkins.model.*
import hudson.security.*
def instance = Jenkins.getInstance()
def hudsonRealm = new HudsonPrivateSecurityRealm(false)
hudsonRealm.createAccount("Administrator","administrator_passwd")
instance.setSecurityRealm(hudsonRealm)
instance.save()
def strategy = new GlobalMatrixAuthorizationStrategy()
strategy.add(Jenkins.ADMINISTER, "Administrator")
instance.setAuthorizationStrategy(strategy)
instance.save()
EOH
notifies :restart, 'runit_service[jenkins]', :immediately
end
脚本激活安全性,使用密码创建 Jenkins 管理员用户,然后重新启动 Jenkins 实例。据我了解,jenkins_script 资源针对 Jenkins master 执行 Java 或 Groovy 命令,并不是幂等的。
由于脚本不是幂等的,如果配方在初始运行后的后续时间在节点上运行,则 chef-client 运行失败,因为已启用安全性并且已创建管理员用户。
我的想法是将这个安全启用脚本移到它自己的配方文件中,然后在需要启用安全性时在节点的运行列表中指定安全配方。如果已经启用了安全性,我们就不会从运行列表中添加/删除安全配方。
- 这是解决此问题的合理方法吗?
- 如果这是一种合理的方法,是否应该像刚才一样简单 创建另一个 ruby 文件,将安全代码转储到其中,然后 在初始配方之后将其添加到节点的运行列表中 詹金斯安装?
【问题讨论】:
标签: security jenkins chef-infra cookbook