利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境
一、环境描述
安装有ansible的服务器:192.168.13.45
测试环境服务器:192.168.13.49
/home/app/api-tomcat/webapps/api.war为测试环境新版本war包位置
生产环境服务器:192.168.13.51
/home/app/api-tomcat/webapps/api.war为生产环境war包位置
/home/app/api-tomcat/webapps/api为生产环境项目位置
/home/app/tomcat.bak/api/webapps-时间戳,为老版本webapps备份位置
/home/app/newwar/api.war为从测试环境获得的新版本war包临时存放位置
/home/app/newwar/api为新版本war包解压后临时存放的位置
全部以app用户执行
二、编写ansible-playbook用的yml文件
1、升级
这里所有的#开头的注释文字在使用的时候都要去掉,因为yml是没有注释的
#生产环境主机的ip,这里也可以是/etc/ansible/hosts定义的组名
- hosts: 192.168.13.51
#变量,在yml文件中使用变量可以使整个文件可以用在不同的主机上升级,变量的使用方法是{{ 变量名 }},如果task中的变量在冒号后则一定要将冒号后整句加上双引号"",因为yml文件自动把冒号后的大括号的内容识别为列表,如shell:"{{ oldhome }}/bin/startup.sh"
vars:
#测试环境IP地址
testIP: 192.168.13.49
#测试环境中项目的位置
testhome: /home/app/api-tomcat/webapps
#测试环境中项目war包的名字
warname: api.war
#生产环境中项目的tomcat所在的位置
oldhome: /home/app/api-tomcat
#生产环境中老版本项目所在webapps备份目录的位置
backupwebapps: /home/app/tomcat.bak
#从测试环境获取的新版本war包所在的位置
newwar: /home/app/newwar
#新版本war包解压后目录的名字
zipname: api
#整个远程自动化操作中所使用的账户,这里整个从生产环境到测试环境的操作都是用app用户执行的
remote_user: app
#具体操作
tasks:
- name: 生产环境删除/home/app/newwar目录,若目录不存在则忽略错误(删这个目录的原因是因为之后要新建这个目录,确保整个yml文件可以多次执行,ignore_errors为是否忽略错误返回值)
file: path={{ newwar }} state=absent
ignore_errors: yes
- name: 生产环境创建/home/app/newwar目录,改权限,(其中recurse是递归创建目录,state是文件类型为目录)
file: path={{ newwar }} recurse=yes mode=775 owner=app group=app state=directory
- name: 从测试环境192.168.13.49复制新版本/home/app/api-tomcat/webapps/api.war包到生产环境192.168.13.51的/home/app/newwar目录下,此处之后的操作都是在生产环境下
shell: scp app@{{ testIP }}:{{ testhome }}/{{ warname }} {{ newwar }}
- name: 给/home/app/newwar递归改权限(因为整改操作都是以app用户身份执行的,所以一定要保证权限为app的权限)
file: dest={{ newwar}} recurse=yes mode=775 owner=app group=app
- name: 解压/home/app/newwar/api.war包在/home/app/newwar/api目录
shell: unzip -oq {{ newwar }}/{{ warname }} -d {{ newwar }}/{{ zipname }}
- name: 再次给/home/app/newwar递归改权限(确保新版本为app的权限)
file: dest={{ newwar}} recurse=yes mode=775 owner=app group=app
- name: 创建用来备份老版本webapps的目录/home/app/tomcat.bak/api并改递归权限
file: path={{ backupwebapps }}/{{ zipname }} recurse=yes mode=775 owner=app group=app state=directory
- name: 备份/home/app/api-tomcat/webapps到目录/home/app/tomcat.bak/api/webapps-时间戳(这个备份目录是用来回滚的)
shell: cp -a {{ oldhome }}/webapps {{ backupwebapps }}/{{ zipname }}/webapps-`date +%Y%m%d%H%M`
- name: kill进程方式停止服务.忽略错误返回值(用这种方式才能确保老版本停止运行,否则会出现冲突)
shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
ignore_errors: yes
- name: kill进程方式停止服务.忽略错误返回值(再次确保老版本不再运行)
shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
ignore_errors: yes
- name: 再次kill进程方式停止服务.忽略错误返回值
shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
ignore_errors: yes
- name: 查看停止服务的结果,进程是否还在
shell: ps -ef | grep {{ oldhome }}
- name: 删除老版本的/home/app/api-tomcat/webapps/api.war包
file: path={{ oldhome }}/webapps/{{ warname }} state=absent
ignore_errors: yes
- name: 删除老版本的/home/app/api-tomcat/webapps/api程序目录
file: path={{ oldhome }}/webapps/{{ zipname }} state=absent
ignore_errors: yes
- name: 复制新版本目录/home/app/newwar/api到/home/app/api-tomcat/webapps目录下
shell: cp -a {{ newwar }}/{{ zipname }} {{ oldhome }}/webapps/
- name: 复制新版本war包/home/app/newwar/api.war包到/home/app/api-tomcat/webapps目录下
shell: cp -a {{ newwar }}/{{ warname }} {{ oldhome }}/webapps/
- name: 启动服务/home/app/api-tomcat/bin/startup.sh(source是为了载入jdk的环境变量,nohup是为了保证yml跑完了进程依然不退出)
shell: "source /etc/profile;nohup {{ oldhome }}/bin/startup.sh &"
- name: 查看进程中是否存在启动的服务
shell: ps -ef | grep {{ oldhome }}
2、回滚
#生产环境主机地址
- hosts: 192.168.13.51
#变量和升级的相同
vars:
testIP: 192.168.13.49
testhome: /home/app/api-tomcat/webapps
warname: api.war
oldhome: /home/app/api-tomcat
backupwebapps: /home/app/tomcat.bak
newwar: /home/app/newwar
zipname: api
#远程操作依然使用app用户
remote_user: app
#以下操作都是在生产环境中进行
tasks:
- name: kill进程方式停止服务.忽略错误返回值
shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
ignore_errors: yes
- name: kill进程方式停止服务.忽略错误返回值
shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
ignore_errors: yes
- name: 再次kill进程方式停止服务.忽略错误返回值
shell: ps -ef | grep {{ oldhome }} | grep -v grep | xargs kill
ignore_errors: yes
- name: 查看停止服务的结果.进程是否还在
shell: ps -ef | grep {{ oldhome }}
- name: 删除/home/app/api-tomcat/webapps目录
file: path={{ oldhome }}/webapps state=absent
- name: 显示/home/app/tomcat.bak/api/中最新备份的webapps目录,目录名应该是webapps-最近时间戳
shell: ls -r {{ backupwebapps }}/{{ zipname }} | head -1
- name: 复制备份的/home/app/tomcat.bak/api/webapps-最新时间戳,到项目并改名/home/app/api-tomcat/webapps
shell: cp -a {{ backupwebapps }}/{{ zipname }}/$(ls -r {{ backupwebapps }}/{{ zipname }} | head -1) {{ oldhome }}/webapps
- name: 启动服务/home/app/api-tomcat/bin/startup.sh
shell: "source /etc/profile;nohup {{ oldhome }}/bin/startup.sh &"
- name: 删除刚才回滚的备份文件
shell: rm -rf {{ backupwebapps }}/{{ zipname }}/$(ls -r {{ backupwebapps }}/{{ zipname }}
- name: 查看进程中是否存在启动的服务
shell: ps -ef | grep {{ oldhome }}
三、升级操作和注意事项
1、升级前免密钥操作
ansible所在主机192.168.13.45
#在app用户下生成密钥
ssh-keygen -t rsa
#发送公钥到测试环境
ssh-copy-id -i .ssh/id_rsa.pub app@192.168.13.49
#发送公钥到生产环境
ssh-copy-id -i .ssh/id_rsa.pub app@192.168.13.51
生产环境主机192.168.13.51
#在app用户下生成密钥
ssh-keygen -t rsa
#发送公钥到测试环境
ssh-copy-id -i .ssh/id_rsa.pub app@192.168.13.49
为了业务安全,ansible所在主机和生产环境主机、测试环境主机是互通的。生产环境主机能连上测试环境主机,但测试环境主机不能连上生产环境主机,所以这里测试环境主机不需要将密钥发送给生产环境主机
2、升级和回滚
升级
ansible-playbook /home/app/api.yml -v
回滚
ansible-playbook /home/app/api-rollback.yml -v
ansible-playbook后面跟上之前写的yml文件路径,-v是为了显示详细执行信息
3、注意
如果在jenkins中执行升级和回滚的yml文件,一定要将在jenkins用户的公钥发送给生产环境主机和测试环境主机,否则会报权限错误
要操作的主机一定要填入/etc/ansible/hosts中
两个yml文件已在生产环境中验证
原创文章,作者:N17_信风,如若转载,请注明出处:http://www.178linux.com/64052
利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境的更多相关文章
- tomcat部署java项目
tomcat部署java项目 1.启动tomcat 进入到tomcat安装目录下的bin #cd /opt/tomcat/bin #./startup.sh // 执行重启命令 2.重建一个新目录导入 ...
- Java Web开发: Tomcat中部署项目的三种方法
web开发,在tomcat中部署项目的方法: 可以参考http://m.blog.csdn.net/blog/u012516903/15741727 定义$CATALINA_HOME指的是Tomcat ...
- JavaWeb之(1)Tomcat安装及项目的发布方法
Tomcat安装及项目的发布方法 Tomcat安装 1.直接解压,然后找到bin/startup.bat 2.双击,如果出现命令行界面且最后一句为"信息: Server startup in ...
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- 在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问
在Intellij上开发项目发布到tomcat时,同一个局域网内的其他机子访问不到自己电脑上tomcat中的项目,只能本机访问 问题描述:在Intellij上开发项目发布到tomcat时,同一个局域网 ...
- windows+nginx+tomcat实现集群负载均衡(生产环境必读)
概念理解(原文链接) 集群:多个tomcat服务器运行同一个web服务就能称之为集群 负载均衡:apache按照一定方式将不同的客户端访问分配到不同的tomcat服务器 简单负载均衡实现: 网上参考了 ...
- linux 环境下tomcat中部署jfinal项目
tomcat中部署jfinal项目 问题现象如下图 问题描述: 我在自己的windows7系统上tomcat下面跑这个项目没有任何问题吗,但是当我把项目上传到linux服务器上的tomcatwebap ...
- java获取tomcat中的properties文件
System.getProperty("catalina.home") 获取tomcat的绝对路径 获取文件的绝对路径 在windous中拼接路径是" \ " ...
- 在tomcat中布置项目的介绍(一)
一:为什么要在tomcat中单独布置项目 因为上线到服务器上需要项目的功能之间彼此独立,这个以后我会细说. 二:简单的步骤一个都不能少 conf文件里的配置文件需要配置好:logback.xml文件会 ...
随机推荐
- 【个人博客作业II】有关代码规范问题的讨论
参考课程辅导书<构建之法>可以知道,程序的代码规范常指代码风格规范和代码设计规范两个方面,其中:代码风格规范包括(缩进,行宽,括号,断行与空白行,分行,命名,下划线,大小写,注释这几个部分 ...
- 接口(interface)与多态
1. 接口(interface)是抽象方法与常量值的集合: 2. 从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量与方法的定义,而没有变量和方法的实现: 3. 接口中声明的属性默认为:pu ...
- Python装饰器的深入理解
装饰器 #装饰器:本质上是函数,(装饰其他函数)就是为其他函数添加附加功能 #原则: 1.不能修改被装饰的函数的源代码 # 2.不能修改被装饰的函数的调用方式 #实现装饰器知识储备 #1.函数即变量 ...
- MySQL下载安装详情教程
1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载 ...
- error eslint@5.12.0: The engine "node" is incompatible with this module.
初始化 react项目时报错: error eslint@5.12.0: The engine "node" is incompatible with this module. E ...
- BZOJ4229选择——LCT+并查集+离线(LCT动态维护边双连通分量)
题目描述 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路径可以从点u出 ...
- 快乐的Lambda表达式(一)
转载:http://www.cnblogs.com/jesse2013/p/happylambda.html 原文出处: Florian Rappl 译文出处:Jesse Liu 自从Lambda ...
- Java中字符串string的数据类型
Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...
- pandas的筛选功能,跟excel的筛选功能类似,但是功能更强大。
Select rows from a DataFrame based on values in a column -pandas 筛选 https://stackoverflow.com/questi ...
- 自学Python2.9-循环(while、for)
自学Python之路 自学Python2.9-循环(while.for) 1. while循环 Python中while语句的一般形式: while 判断条件: 语句 作用:提高开发效率,提高代码重用 ...