如何在Jenkinsfile定义的Docker容器中通过SSH连接本地网络节点
解决方案
你可以通过两种方式实现容器读取SSH密钥,无需自定义打包镜像:
方案1:挂载宿主机SSH目录(适配单Jenkins节点场景)
直接将宿主机上已有的.ssh目录挂载到InSpec容器的对应用户家目录下,修改你的Jenkinsfile docker agent配置,添加args参数即可:
stage('test') { agent { docker { image 'chef/inspec:latest' reuseNode true // 挂载宿主机ssh目录到容器root用户家目录,同时使用宿主机网络解决本地域名解析/访问问题 args '-v /root/.ssh:/root/.ssh --network=host' } } steps { script { parallel inspecTestStages(hosts, profiles) } } }
注意事项:
- 如果你的宿主机执行Jenkins agent的用户不是root,需要把前面的路径替换为对应用户的
.ssh目录路径,比如/home/jenkins/.ssh:/root/.ssh - 要保证宿主机上的私钥文件权限为
600,避免SSH因为权限问题拒绝读取密钥
方案2:通过Jenkins凭证注入密钥(适配多Jenkins节点/更安全的场景)
更推荐使用Jenkins内置的凭证管理器存储私钥,避免私钥散落在各个宿主机节点:
- 先在Jenkins后台「凭证」管理中新增类型为「SSH Username with private key」的凭证,填写你用于SSH登录的用户名、私钥内容,设置凭证ID为
inspec_ssh_private_key - 修改Jenkinsfile,在执行inspec命令前临时注入密钥:
stage('test') { agent { docker { image 'chef/inspec:latest' reuseNode true args '--network=host' } } steps { withCredentials([sshUserPrivateKey( credentialsId: 'inspec_ssh_private_key', keyFileVariable: 'SSH_KEY_PATH' )]) { script { // 把密钥复制到SSH默认读取路径,设置正确权限 sh 'mkdir -p ~/.ssh && cp $SSH_KEY_PATH ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa' parallel inspecTestStages(hosts, profiles) } } } }
注意事项:
- 如果你的InSpec测试命令中指定了不同的SSH用户名,可在凭证配置中填写默认用户名,也可以通过
usernameVariable参数拿到凭证中存储的用户名传入inspec命令 - 流水线执行完成后,临时创建的密钥文件会随容器销毁自动清除,不会留下敏感信息残留
内容的提问来源于stack exchange,提问作者Sebastian Sommerfeld
相关产品推荐
相关产品推荐

