侧边栏壁纸
博主头像
惬意小蜗牛博主等级

海内存知己,天涯若比邻!

  • 累计撰写 54 篇文章
  • 累计创建 143 个标签
  • 累计收到 65 条评论

目 录CONTENT

文章目录

Jenkinsfile 中配置使用 ssh agent 连接远程主机

惬意小蜗牛
2021-11-08 / 0 评论 / 10 点赞 / 4,852 阅读 / 1,079 字 / 正在检测是否收录...

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 类型凭证免密登录时)

说明:

  1. 将公钥写入到 authorized_keys 文件
  2. 如果不生成此文件,则 jenkins 在使用 SSH Username with private key 类型凭证免密登录时会一直验证不通过
cat id_rsa.pub >> authorized_keys

二、Jenkins 配置

1. 安装 SSH Agent 插件

2. 添加SSH Username with private key 类型凭据

2.1

file

2.2

file

2.3

file

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'
}}

说明:

  1. 目标服务器免密登录的用户名 : 与配置凭据时填写的用户名保持一致
  2. 目标服务器IP地址 : 目标服务器IP地址,注意内外网IP
  3. 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"
    

结束

完成以上配置后,其他的请自由发挥吧

10

评论区