使用SSH Agent插件,可以在Jenkins Pipeline中SSH免登录访问远程服务器来执行命令。
SSH Agent插件可以用来在Jenkins Pipeline中SSH访问远程服务器。
https://wiki.jenkins.io/display/JENKINS/SSH+Agent+Plugin
安装插件:
jenkins
账号生成SSH keysJenkins进程运行在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。
将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,打开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访问远程服务器执行命令的示例代码:
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,在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
“