Jenkins(二): Jenkins 之 Shell+Publish Over SSH
一、SSH命令批量操作Linux服务器
Xshell、FinalShell
手动登录服务器,敲部署命令进行部署
多台部署得 一 一 登录,因此若台数少可用ssh命令。若多的话,还是建议使用ansible等批量执行工具。
SSH管理
通常,第一次从本机连接远程主机登录时,需要输入yes,
#vim /etc/ssh/ssh_config
StrictHostKeyChecking no(该参数取消第一次连接时的的"yes/no"验证)
修改后,立即生效,不必重启sshd服务。
若每次登录都需要输入密码,可采用密钥的方式批量管理服务器,实现脚本批量部署
Linux密钥生成
公钥: 相当于锁
私钥: 相当于钥匙,防止丢失
SSH命令生成公钥私钥,并传输
①Linux使用命令生成公私钥:
指定生成"rsa"类型的秘钥,默认存放目录为当前用户的"家目录/.ssh/"目录下。 #ssh-keygen -t rsa
回车确认后,在下列提示信息中,有这两行,表示公钥,私钥的存放位置:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
②使用工具将公钥传输到指定机器上
#ssh-copy-id -i /root/.ssh/id_rsa.pub 用户@IP
-i:指定公钥
输入远程主机用户密码,下发公钥
例:
[root@centos7-3 opt]# ssh-copy-id root@192.168.24.122
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.24.122's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.24.122'"
and check to make sure that only the key(s) you wanted were added.
SSH命令操作服务器
ssh登录服务器 -> 执行Shell命令 -> 执行完退出
[root@centos7-3 opt]# ssh 192.168.24.122 "echo this is $HOSTNAME" this is centos7-3
#######上条命令知,命令行的变量是从centos7-3本机获取的,而不是获取对应的远程主机变量########
[root@centos7-3 opt]# ssh 192.168.24.122 "cat /home/gaokai/centos7-2.txt"
centos7-2 ip 192.168.24.122
Shell批量部署示例
ssh命令连接远程主机时,若不输入用户,默认为root用户。
例
for ip in $(cat /root/sjghost);do echo $ip ssh ${ip} "echo deploying" done
Shell批量下发部署脚本、部署包等
#/root/iphost文件中记录的是IP地址,每一行一个IP地址。
for ip in $(cat /root/iphost);do echo $ip scp -r /tmp/test.log ${ip}:/usr/local/src/ done
Shell批量拉取文件等
for ip in $(cat /root/iphost);do echo $ip scp root@${ip}:/usr/local/src/sjg.log /tmp/test.log.${ip} echo "$ip传输完成" done
二、ssh公钥批量下发
#ssh-copy-id 下发公钥 #ssh-copy-id -i /root/.ssh/id_rsa.pub 127.0.0.1
需要手动输入密码,服务器数量多的话,不可能光重复敲该命令,必须借用脚本。
sshpass命令可实现自动输入密码
#yum install sshpass -y #sshpass -p "xxx" ssh-copy-id -i /root/.ssh/id_rsa.pub 用户@IP地址(用户若为root,可不写)
其中"xxx"为sshpass使用的密码,该密码为用户密码。
编写脚本实现公钥批量下发:
#vim /root/iphost.sh #IP、root密码 192.168.24.122 roottoor 批量下发公钥实现脚本/root/deployrsa.sh IFSBAK=$IFS IFS=$'\n' for line in $(cat /root/iphost);do myip=$(echo "$line" | awk '{print $1}') mypwd=$(echo "$line" | awk '{print $2}') sshpass -p "$mypwd" ssh-copy-id -i /root/.ssh/id_rsa.pub $myip done IFS=$IFSBAK
三、Jenkins运行Shell命令
Jenkins学习流程,按顺序来
第一步.操作本机Shell命令。
第二步.通过ssh操作服务器。
第三步.通过ansible批量操作服务器。
使用Jenkins操作本机Shell命令
1.Dashboard栏选择"新建视图"
2.创建视图(自己创建视图名称[testShell],并选择Type(List View)),点击确定。
3.Dashboard栏选择"新建Item",即创建任务。任务名"gk_testShell",自由风格的项目(Freestyle project),选择OK(并画√)。
4.之后在跳出的页面下,选择构建,增加构建步骤,选择执行shell命令
然后填写要执行的shell命令。
然后点击保存。
里面也可以放脚本执行 ,对应的iphost文件是已经存放在linux对应的目录下。如图:
5.然后在Dashboard栏,点击立即构建。
6.可以通过构建历史(Build History)选择,查看执行是否成功,并查看执行结果。
如图,"x"为执行失败,"√"为执行成功:
查看执行成功的:然后选择控制台输出:
若选择"文本方式查看",则会单独列出一页来展示输出内容。
四、Jenkins通过shell管理服务器
工具:publish over ssh
①通过ssh部署Linux类服务器。
②可跟git或svn结合,直接拉取版本控制里的代码进行部署。对于php、python类的部署非常有用。
开始部署SSH管理服务器:
⑴部署前需要先添加ssh服务器
Dashboard栏下"系统管理" -> 系统设置 -> 添加SSH服务器(最下面Puhlish over ssh栏"SSH Servers",新增)
点击系统配置后,在新出的页面拉到最下面,看到"Publish over SSH",填写"Path to key = /root/.ssh/id_rsa",配置私钥的路径。
然后在下面的"SSH Servers"栏配置,该SSH Server栏,对应的是公钥所在的服务器。
⑵Jenkins创建部署项目
配置好SSH服务器后,就可以在"我的视图"中,选择新建任务
新建任务"ssh_remote",选择自由风格,然后确定。
然后跳到"ssh_remote"任务的配置页面,选择"构建"栏,增加构建步骤 ,选择"Send files or execute commands over SSH"选项,然后选择指定的SSH服务器(这里就有个缺点:SSH构建需要一台一台的构建,即若需要对100台进行操作,则需要配置100台,量多时工作繁琐)。
点击应用后,保存。然后"立即构建",看是否能执行成功。
执行成功。
Jenkins创建任务时,通过复制的方法
补充:在新建任务时,也可以选择复制任务,之后再自己进行局部修改。
Publish Over Ssh部署的优点缺点
服务器数量少的,使用ssh管理方便
对于服务器数量过多时,配置繁琐: 添加ssh服务器繁琐,添加项目指定服务器繁琐
另外安全注意
Jenkins由于有直接管理服务器的权限,所以Jenkins网页一定要IP白名单、密码复杂度要高
Jenkins的权限要正确配置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统