Jenkinsfile 中配置使用 ssh agent 连接远程主机
在使用 Jenkins 做持续集成的时候,我们经常会通过ssh连接到远程主机来进行一些操作。因为所有的操作都是脚本自动运行的,所以我们通常会使用免密登录。那么在Jenkinsfile中我们如何来实现呢?
之前找到一些文章,但是在配置过程中出现了问题,在此记录一下。
一、目标服务器
1. 检查服务器 ssh 配置文件
路径 /etc/ssh/sshd_config
检查以下两个配置, 必须为 “yes”
PubkeyAuthentication yesPermitRootLogin yes
如有修改记得重启 SSH 服务
service sshd restart
2. 配置SSH公钥与私钥
首先,进入到SSH目录
cd ~/.ssh#注意如果该目录提示不存在,需要先ssh localhost#用root用户登录一下ssh,然后,进入到~/.ssh目录
生成秘钥, 输入该命令
# ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
id_rsa 为私钥
id_rsa.pub 为公钥
生成 authorized_keys
文件,这个文件会在 ssh
私钥登录时用到(也就是 Jenkins 使用 SSH Username with private key
类型凭证免密登录时)
说明:
- 将公钥写入到
authorized_keys
文件- 如果不生成此文件,则 jenkins 在使用
SSH Username with private key
类型凭证免密登录时会一直验证不通过
cat id_rsa.pub >> authorized_keys
二、Jenkins 配置
1. 安装 SSH Agent
插件
2. 添加SSH Username with private key
类型凭据
2.1
2.2
2.3
3. Jenkins 流水线脚本配置
大家都知道 Jenkins 有一个 “流水线脚本” 的功能,使用 Jenkins “流水线脚本”生成样例代码放到pipeline里是不行的。
sshagent(['xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx']) { // some block}
正确的书写方法为
sshagent (credentials: ['xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx']) {
sh 'ssh -o StrictHostKeyChecking=no -l 目标服务器免密登录的用户名 目标服务器IP地址 uname -a'
}
脚本式流水线语法
node { sshagent (credentials: ['xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx']) {
sh 'ssh -o StrictHostKeyChecking=no -l root 192.168.2.31 uname -a'
}}
声明式流水线语法
steps { sshagent (credentials: ['xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx']) {
sh 'ssh -o StrictHostKeyChecking=no -l root 192.168.2.31 uname -a'
}}
说明:
- 目标服务器免密登录的用户名 : 与配置凭据时填写的用户名保持一致
- 目标服务器IP地址 : 目标服务器IP地址,注意内外网IP
uname -a
为需要免密登录目标服务器后执行的命令,也可以是目标服务器中 shell 脚本全路径
StrictHostKeyChecking
在上面的sh语句中,我们发现一个很重要的参数StrictHostKeyChecking,那么这个参数的作用是什么呢,下面我们来讲解一下。
在使用 SSH 连接到远程主机的时候,会检查主机的公钥。如果是第一次连接该主机,会显示该主机的公钥摘要,提示用户是否信任该主机。我们需要输入yes才可以连接到远程主机,并且会把该主机的公钥追加到~/.ssh/known_hosts文件中。当再次连接到该主机时,就不会再提示该问题了。
The authenticity of host '192.168.2.31 (192.168.2.31)' can't be established.ECDSA key fingerprint is SHA256:NWbwTrGB+hWDGVd8kDaZXyvZybruyGDP848ejoHTKUU.Are you sure you want to continue connecting (yes/no)?
这样会导致一个问题,如果我们用 Jenkins 跑自动化任务,是没有输入yes这个过程的,任务会因此中断。所以我们需要做到连接新主机时,不进行公钥确认。
连接新主机,不进行公钥确认
我们上面提到的StrictHostKeyChecking配置就可以实现当第一次连接到主机时,自动接受新的公钥。它有两种使用方式:
-
一种就是修改ssh的配置文件:/etc/ssh/ssh_config或~/.ssh/config,在里面加入下面的语句:
Host *StrictHostKeyChecking no
-
另一种就是在ssh的命令中使用-o参数
ssh -o StrictHostKeyChecking=no root@192.168.2.31 "ls -l"
结束
完成以上配置后,其他的请自由发挥吧
评论区