Jenkins设置SSH免登录访问远程服务器

文章目录

  • Jenkins设置SSH免登录访问远程服务器
    • 安装SSH Agent插件
    • 以`jenkins`账号生成SSH keys
    • 在远程服务器(SSH服务端)上配置SSH客户端的public key
    • 在Jenkins上配置SSH Credential
    • 在Jenkins Pipeline中SSH访问
    • 在Jenkins freestyle job中访问远程服务器
    • 参考文档

Jenkins设置SSH免登录访问远程服务器

使用SSH Agent插件,可以在Jenkins Pipeline中SSH免登录访问远程服务器来执行命令。

安装SSH Agent插件

SSH Agent插件可以用来在Jenkins Pipeline中SSH访问远程服务器。

https://wiki.jenkins.io/display/JENKINS/SSH+Agent+Plugin

安装插件:

  1. 用管理员账号登录Jenkins
  2. 点击Manage Jenkins -> Manage Plugins
  3. 打开Installed页面,搜索ssh,查看SSH Agent插件是否已安装
  4. 如果还没有安装,则打开Avaiable页面,搜索ssh,选择SSH Agent,点击Download now and install after restart
  5. 勾选Restart Jenkins when installation is complete and no jobs are running
  6. 等待Jenkins重启成功
  7. 再次用管理员账号登录Jenkins验证插件是否安装成功

jenkins账号生成SSH keys

Jenkins进程运行在jenkins的Linux账号上,因此需要用jenkins账号来生成SSH keys。如果用其它Linux账号生成SSH keys,会遇到Permission Denied的错误。

可通过ps -ef|grep jenkins查看Jenkins进程。

jenkins账号没有bash (见下方的/bin/false),不能直接登录。

cat /etc/passwd | grep jenkins
# jenkins:x:473:474:Jenkins Automation Server:/var/lib/jenkins:/bin/false

因此在切换到jenkins时需要指定bash为/bin/bash

# 切换到jenkins账号
sudo su -s /bin/bash jenkins
# 确认切换成功
whoami

jenkins账号生成SSH keys:

# 生成SSH keys
ssh-keygen -t rsa -b 4096
# 查看生成的SSH private key和public key
cd ~/.ssh
ll

id_rsa为SSH private key,id_rsa.pub为SSH public key。

在远程服务器(SSH服务端)上配置SSH客户端的public key

将Jenkins服务器(SSH客户端)的SSH public key文件id_rsa.pub的内容追加到服务端对应用户的~/.ssh/authorized_keys文件末尾。

如果~/.ssh/authorized_keys文件还不存在,则需要手工创建。

确保~/.ssh文件权限为700,~/.ssh/authorized_keys文件权限为600,否则会导致SSH失败。

设置文件权限:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

配置好后,在Jenkins服务器上用jenkins账号验证是否可以SSH成功:

# 切换到jenkins账号
sudo su -s /bin/bash jenkins
ssh <remote_server_account>@<remote_server_ip>

在Jenkins上配置SSH Credential

用管理员账号登录Jenkins,打开Credentials

点击Global链接,点击Add Credential,选择Kind为SSH user name with private key。

在ID中输入Credential ID,在Username中输入远程服务器(SSH服务端)的账号,在Private Key粘贴SSH客户端即Jenkins服务器上jenkins账号生成的SSH private key文件的内容

在Jenkins Pipeline中SSH访问

Jenkins Pipeline中SSH访问远程服务器执行命令的示例代码:

sshagent(["${params.SSH_CREDENTIALS_ID}"]) {
        sh """
            ssh -o StrictHostKeyChecking=no -l ${account} ${server} '${command}'
        """
    }

SSH_CREDENTIALS_ID需要和上一步的SSH Credential的ID一致,account和上一步的Username一致。

在Jenkins freestyle job中访问远程服务器

打开Jenkins freestyle job,在Build Environment中勾选“SSH Agent",选择上面配置好的SSH Credential。

在Build step中添加Execute shell。

Jenkins部署Docker容器示例:Jenkins通过SSH远程服务器,并从Harbor拉取当前Maven版本的Docker镜像,并以后台方式启动Docker容器。

. ./target/maven-archiver/pom.properties

ssh -o StrictHostKeyChecking=no -l root 192.168.87.155 "
docker login -u ${HARBOR_USERNAME} -p ${HARBOR_PASSWORD} 192.168.87.151:10090
docker stop gs-rest-service
docker rm gs-rest-service
nohup docker run --name gs-rest-service -p 10080:8080 192.168.87.151:10090/demo/gs-rest-service:${version} -d > /dev/null 2>&1 &
docker logout 192.168.87.151:10090
"

说明如下:

# 获取Maven version的值作为环境变量
. ./target/maven-archiver/pom.properties

# ssh登录要进行部署的目标服务器,并执行一系列命令
ssh -o StrictHostKeyChecking=no -l root 192.168.87.155 "

# 在目标服务器上
# 登录Harbor,HABOR_USERNAME和HARBOR_PASSWORD为配置在Jenkins上的Harbor credential
docker login -u ${HARBOR_USERNAME} -p ${HARBOR_PASSWORD} 192.168.87.151:10090
# 停掉和删除容器
docker stop gs-rest-service && docker rm gs-rest-service
# 以后台方式运行Docker容器,并且因为示例代码的Spring Boot应用是常驻进程,因此再用nohup以后台运行命令
# version的值来自上面的pom.properties
nohup docker run --name gs-rest-service -p 10080:8080 192.168.87.151:10090/demo/gs-rest-service:${version} -d > /dev/null 2>&1 &

# 退出Harbor登录
docker logout 192.168.87.151:10090
“

参考文档

  • https://www.cnblogs.com/yixue2017/p/7559970.html
  • https://stackoverflow.com/questions/18068358/cant-su-to-user-jenkins-after-installing-jenkins

你可能感兴趣的:(Linux,Jenkins)