声明:
如果您有更好的技术与作者分享,或者商业合作;
请访问作者个人网站 http://www.esqabc.com/view/message.html 留言给作者。
如果该案例触犯您的专利,请在这里:http://www.esqabc.com/view/message.html 留言给作者说明原由
作者一经查实,马上删除。
准备工具:
服务器三台或者以上
a,主服务器:docker_t (安装Ansible和Jenkins)
b,被控制的服务器A:esqabc_a
c,被控制的服务器B:esqabc_b
注意,由于我的三台服务器都是国外服务器,显示与提示,相比国内会有所不同
安装Ansible和Jenkins,请访问地址:https://blog.csdn.net/esqabc/article/details/90257590
不清楚怎么使用Ansible,请访问地址:https://blog.csdn.net/esqabc/article/details/92773041
不清楚怎么使用Jenkins发布项目,请访问地址:https://blog.csdn.net/esqabc/article/details/90481880
本文出现的192.168.0.111或者192.168.0.222都是虚假的
1,为远程连接主机生成公/私钥
(1)在主服务器下执行命令:
[root@docker_t ~]# cd /home & mkdir key & ssh-keygen -t dsa -f /root/.ssh/id_dsa -P ""
(2)查看公/私钥是否生成成功
(3)分发公钥给被控制的服务器(esqabc_a和esqabc_b),请输入一下yes和密码授权一下就可以了
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.0.111
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub root@192.168.0.222
或者修改端口(24680)的方式分发:
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub -p 24680 root@192.168.0.111
[root@docker_t key]# ssh-copy-id -i ~/.ssh/id_dsa.pub -p 24680 root@192.168.0.222
(4)测试一下是否成功(ssh + 服务器ip)
在主服务器中执行命令:
[root@docker_t key]# ssh 192.168.0.111 "hostname"
esqabc_a
[root@docker_t key]# ssh 4192.168.0.222 "hostname"
esqabc_b
2,定义(ansible)主机
(1)编辑文件:hosts
[root@docker_t ~]# vim /etc/ansible/hosts
添加一个主机组(rj-bai)
[rj-bai]
192.168.0.111
192.168.0.222
然后保存退出,注意:rj-bai 为模块名,下面是要管理的主机 ip 地址,模块名随便写
(2)测试一下是否成功
执行命令:
[root@docker_t ~]# ansible rj-bai -m command -a pwd
出现这个,就算是成功了
3,安装Jenkins
(1)添加Jenkins插件:
1、Maven
2、SSH
3、Ansible
(2)创建一个任务
(3)配置
1,源码管理(我这里是SVN,如果是使用其它的请自行)
2,添加SVN账号
3,构建触发器(根据自己的选择,我这里选择的是定时执行)
日程表:是cron表达式,每分钟执行一次:*/1 * * * *
就是说,每分钟检测一次SVN代码有没有更改
4,选择构建
(1)选择调用顶层Maven目标
(2)选择执行 shell
jenkins自动打包jar文件,会在主机目录:/root/.jenkins/workspace/ 下创建一个任务名称的文件夹,存放打包后的jar文件
如:任务名称为:jarweb-jen-ans-t,打包文件名称为:jarweb-jen-ans.jar
即:/root/.jenkins/workspace/jarweb-jen-ans-t/target/jarweb-jen-ans.jar
上面命令的说明:
#把项目jar文件复制到ansible发布目录(ansible目录可以随意地方)
cp /root/.jenkins/workspace/jarweb-jen-ans-t/target/jarweb-jen-ans.jar /etc/ansible/roles/jarweb/
#进入jenkins任务打包目录
cd /root/.jenkins/workspace/jarweb-jen-ans-t/target/
#删除旧的打包文件
rm -rf *.jar
(3)选择Invoke Ansible Playbook
说明:
Playbook path:填写deploy-jarweb.yml地址,如:/etc/ansible/roles/jarweb/deploy-jarweb.yml
File or host list:填写主机组的地址,如:/etc/ansible/hosts
文件:deploy-jarweb.yml
#
- hosts: rj-bai
remote_user: root
tasks:
- name: copy jar
copy : src=/etc/ansible/roles/jarweb/jarweb-jen-ans.jar dest=/home/tools/jar/jarweb-jen-ans.jar
- name: copy sh
copy: src=/etc/ansible/roles/jarweb/jarweb-script.sh dest=/home/tools/jar/jarweb-script.sh
- name: shell sh
shell: sh /home/tools/jar/jarweb-script.sh
文件:hosts
[rj-bai]
192.168.0.111
192.168.0.222
文件:jarweb-script.sh
#!/bin/sh
#设置输出语言
export LANG=en_US.UTF-8
project=jarweb-jen-ans.jar
#输出信息
echo "begin>>>>>>>>>>>>>>>>>>>>"
#获取当前服务器时间,并格式化
dqtime=$(date "+%Y-%m-%d %H:%M:%S")
#输出当前服务器时间
echo "datetime: ${dqtime}"
#获取项目正在运行的进程PID(方法有很多,这是其它一种)
javapid=$(ps -ef|grep $project |grep -v grep|awk '{print $2}')
#输出PID
echo "javapid: $javapid"
#通过项目的PID,判断有没有在运行
process=$(ps -ef |grep $javapid |grep java)
echo "process: $process"
if [ "$process" = "" ]
then
echo "Not found>$project<, running Java program"
else
#如果已经在运行,就直接杀死进程
echo "Start killing the process ID of jarweb-jen-ans.jar"
echo "kill -9 $javapid"
kill -9 $javapid
fi
echo "<<<<<<<<<<<<<<<<<<
#输出友好的倒计时提示,项目在5秒钟后启动
seconds_left=5
echo "Start the project after 5 seconds"
while [ $seconds_left -gt 0 ];
do
echo -n "Please wait for> ${seconds_left}
sleep 1
seconds_left=$(($seconds_left - 1))
#清除上一行内容,即上一个倒计时输出的信息
echo -ne "\r \r"
done
echo "Startup project $project"
#项目启动需要执行的命令
source /etc/profile
nohup java -jar /home/tools/jar/jarweb-jen-ans.jar > /home/tools/jar/nohup.out 2>&1 &
echo "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
#显示项目启动的日志输出
#tail -999f /home/tools/jar/nohup.out
(5)最后点击确定,等待jenkins自动生成吧
打包项目的地址:https://github.com/esqabc/jarweb-jen-ans
检测是否打包发布成功,请自行在浏览器输入:http://ip:8080/index 是否出现你的网页
我想到了两种方案,如果不符合或者有什么疑问,
请通过我的个人网站留言给我:http://www.esqabc.com/view/message.html
方案1:
方案2:
下面介绍方案2的使用:
准备服务器三台或者以上
1,主服务器:docker_t (安装Ansible,Jenkins,Docker,harbor)-192.168.0.001
2,项目服务器A:esqabc_a (安装Docker)-192.168.0.111
3,项目服务器B:esqabc_b (安装Docker)-192.168.0.222
注意:harbor私仓库可以安装在其他服务器,这里以安装在192.168.0.001为例
打包项目地址:https://github.com/esqabc/docker-jen-ans
首先在项目服务器A、B的:/etc/docker 目录下,创建文件:daemon.json
执行命令:
[root@esqabc_a ~]# cd /etc/docker/
[root@esqabc_a docker]# touch daemon.json
[root@esqabc_a docker]# vi daemon.json
输入:
{ “insecure-registries”:[“192.168.0.001:8088”] }
A、B服务器都一样
a,在Jenkins创建一个任务:docker-jen-ans
b,源码管理
c,构建触发器(根据自己的选择,我这里选择的是定时执行)
日程表:是cron表达式,每分钟执行一次:*/1 * * * *
就是说,每分钟检测一次SVN代码有没有更改
d,选择构建
(1)选择调用顶层Maven目标
#把打包好的镜像(tag docker-jen-ans:v1)标记为(192.168.0.001:8088/esqabc/docker-jen-ans:v1)
docker tag docker-jen-ans:v1 192.168.0.001:8088/esqabc/docker-jen-ans:v1
#把我们标记好的镜像(192.168.0.001:8088/esqabc/docker-jen-ans:v1)发送到私仓库(192.168.0.001:8088)esqabc项目下
docker push 192.168.0.001:8088/esqabc/docker-jen-ans:v1
#删除标记为(192.168.0.001:8088/esqabc/docker-jen-ans:v1)
docker rmi 192.168.0.001:8088/esqabc/docker-jen-ans:v1
#删除打包好的镜像(tag docker-jen-ans:v1)
docker rmi docker-jen-ans:v1
(3)选择Invoke Ansible Playbook
说明:
Playbook path:填写deploy-jarweb.yml地址,如:/etc/ansible/roles/jarweb/deploy-jarweb.yml
File or host list:填写主机组的地址,如:/etc/ansible/hosts
文件:deploy-jarweb.yml
#
#使用Ansible的主机组rj-bai,把脚本文件jarweb-script.sh发送到主机组rj-bai里面的服务器中,然后再执行脚本
- hosts: rj-bai
remote_user: root
tasks:
- name: copy sh
copy: src=/etc/ansible/roles/jarweb/jarweb-script.sh dest=/home/tools/jar/jarweb-script.sh
- name: shell sh
shell: sh /home/tools/jar/jarweb-script.sh
文件:hosts
#主机组
[rj-bai]
192.168.0.111
192.168.0.222
文件:jarweb-script.sh
#!/bin/sh
#设置输出语言
export LANG=en_US.UTF-8
#当前项目版本
project=docker-jen-ans:v1
#输出信息
echo "begin>>>>>>>>>>>>>>>>>>>>"
#获取当前服务器时间,并格式化
dqtime=$(date "+%Y-%m-%d %H:%M:%S")
#输出当前服务器时间
echo "datetime: ${dqtime}"
#删除旧的运行信息
docker kill $project
#删除旧的容器
docker rm $project
#删除旧的镜像
docker rmi $project
#下载新镜像
docker pull 192.168.0.001:8088/esqabc/docker-jen-ans:v1
#标记(镜像重命名)把192.168.0.001:8088/esqabc/docker-jen-ans:v1改为docker-jen-ans:v1
docker tag 192.168.0.001:8088/esqabc/docker-jen-ans:v1 docker-jen-ans:v1
#删除镜像
docker rmi 192.168.0.001:8088/esqabc/docker-jen-ans:v1
#运行镜像
docker run -it -d --name esqabcweb -p 8888:8888 docker-jen-ans:v1