利用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:"/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= state=absent
      ignore_errors: yes
    - name: 生产环境创建/home/app/newwar目录,改权限,(其中recurse是递归创建目录,state是文件类型为目录)
      file: path= 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 [email protected]:/ 
    - name: 给/home/app/newwar递归改权限(因为整改操作都是以app用户身份执行的,所以一定要保证权限为app的权限)
      file: dest= recurse=yes mode=775 owner=app group=app
    - name: 解压/home/app/newwar/api.war包在/home/app/newwar/api目录
      shell: unzip -oq / -d /
    - name: 再次给/home/app/newwar递归改权限(确保新版本为app的权限)
      file: dest= recurse=yes mode=775 owner=app group=app
    - name: 创建用来备份老版本webapps的目录/home/app/tomcat.bak/api并改递归权限
      file: path=/ 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 /webapps //webapps-`date +%Y%m%d%H%M`
    - name: kill进程方式停止服务.忽略错误返回值(用这种方式才能确保老版本停止运行,否则会出现冲突)
      shell: ps -ef | grep  | grep -v grep | xargs kill
      ignore_errors: yes
    - name: kill进程方式停止服务.忽略错误返回值(再次确保老版本不再运行)
      shell: ps -ef | grep  | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 再次kill进程方式停止服务.忽略错误返回值
      shell: ps -ef | grep  | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 查看停止服务的结果,进程是否还在
      shell: ps -ef | grep 
    - name: 删除老版本的/home/app/api-tomcat/webapps/api.war包
      file: path=/webapps/ state=absent
      ignore_errors: yes
    - name: 删除老版本的/home/app/api-tomcat/webapps/api程序目录
      file: path=/webapps/ state=absent
      ignore_errors: yes
    - name: 复制新版本目录/home/app/newwar/api到/home/app/api-tomcat/webapps目录下
      shell: cp -a / /webapps/
    - name: 复制新版本war包/home/app/newwar/api.war包到/home/app/api-tomcat/webapps目录下
      shell: cp -a / /webapps/
    - name: 启动服务/home/app/api-tomcat/bin/startup.sh(source是为了载入jdk的环境变量,nohup是为了保证yml跑完了进程依然不退出)
      shell: "source /etc/profile;nohup /bin/startup.sh &"
    - name: 查看进程中是否存在启动的服务
      shell: ps -ef | grep

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  | grep -v grep | xargs kill
      ignore_errors: yes
    - name: kill进程方式停止服务.忽略错误返回值
      shell: ps -ef | grep  | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 再次kill进程方式停止服务.忽略错误返回值
      shell: ps -ef | grep  | grep -v grep | xargs kill
      ignore_errors: yes
    - name: 查看停止服务的结果.进程是否还在
      shell: ps -ef | grep 
    - name: 删除/home/app/api-tomcat/webapps目录
      file: path=/webapps state=absent
    - name: 显示/home/app/tomcat.bak/api/中最新备份的webapps目录,目录名应该是webapps-最近时间戳
      shell: ls -r / | head -1
    - name: 复制备份的/home/app/tomcat.bak/api/webapps-最新时间戳,到项目并改名/home/app/api-tomcat/webapps
      shell: cp -a //$(ls -r / | head -1) /webapps
    - name: 启动服务/home/app/api-tomcat/bin/startup.sh
      shell: "source /etc/profile;nohup /bin/startup.sh &"
    - name: 删除刚才回滚的备份文件
      shell: rm -rf //$(ls -r /
    - name: 查看进程中是否存在启动的服务
      shell: ps -ef | grep

三、升级操作和注意事项

1、升级前免密钥操作

ansible所在主机192.168.13.45

#在app用户下生成密钥
ssh-keygen -t rsa
#发送公钥到测试环境
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
#发送公钥到生产环境
ssh-copy-id -i .ssh/id_rsa.pub [email protected]

生产环境主机192.168.13.51

#在app用户下生成密钥
ssh-keygen -t rsa
#发送公钥到测试环境
ssh-copy-id -i .ssh/id_rsa.pub [email protected]

为了业务安全,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文件已在生产环境中验证

时间: 2024-10-14 05:43:16

利用ansible-playbook从测试环境获取tomcat中java项目新版本发布到生产环境的相关文章

利用VS的预生成事件获取SVN版本作为项目内部版本号

VS中的Properties下的AssemblyInfo.cs可以设置相应的版本号.下面是AssemblyInfo.cs设置版本的方式. [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] 但是,这个需要每次都设定,而且与SVN上的版本号并不一致,追塑起来不是很方便.所以就想着取SVN上的版本号作为项目的版本号.要得到SVN的版本号,可以在SVN的节眯下,

Java Web开发: Tomcat中部署项目的三种方法

web开发,在tomcat中部署项目的方法: 注意大小写 1.在conf目录中新建Catalina\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,改xml文件的内容为: <Context path="/qxmobile"  docBase="/usr/local/webroot/qxmobile" reloadable="false"  debug="0" p

tomcat中java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException錯誤

當我加載web應用時,發現會有java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException:這個錯誤. 原來是我的web.xml中出現了問題. 下面是我的web.xml文件部分內容. <servlet> <servlet-name>regeister</servlet-name> <servlet-class>org.eblly.bean.Register<

如何启动本地环境的tomcat及查看项目效果

1.先双击  D:\videosolution\apache-tomcat-7.0.42-jndi\bin\starup.bat(启动本地环境的tomcat) 2.把自己的新项目(月福)复制 放在D:\videosolution\apache-tomcat-7.0.42-jndi\webapps\月福前端页面代码 3.在浏览器输入网址 localhost:8080/月福前端页面代码/index.html(测试首页) 用svn查看别人上传新的代码与以前代码的区别方法: 1.选中该项目(月福)——右

linux 环境下tomcat中部署jfinal项目

tomcat中部署jfinal项目 问题现象如下图 问题描述: 我在自己的windows7系统上tomcat下面跑这个项目没有任何问题吗,但是当我把项目上传到linux服务器上的tomcatwebapps目录下后,启动tomcat,服务器死活找不到工程目录. 然后我就郁闷了............. 分析运行环境: 本机: 系统  win7 64 tomcat 8.0.33 jdk版本 1.8.0_51 linux服务器: 系统   Linux version 2.6.32-431.el6.x8

在tomcat中布置项目的介绍(一)

一:为什么要在tomcat中单独布置项目 因为上线到服务器上需要项目的功能之间彼此独立,这个以后我会细说. 二:简单的步骤一个都不能少 conf文件里的配置文件需要配置好:logback.xml文件会生成运行logs日志文件到外面对应的路径:另外还会生成cache文件作为缓存记录,里面全部是方的项目的打包文件夹: 三:配置好了tomcat启动 tomcat的配置项目的环境有3个文件需要更改. 第一个:新建文件夹将自己项目的入口的文件放进去:META-INF.WEB-INF.index.html(

Linux中java项目环境部署,简单记录一下

这里只是简单的记录一下linux环境下面如何快速的搭配好环境,使你的项目能在linux环境上面运行. 很多时候,我们都是用windows环境进行配置调试的,而真正很多服务器都是在linux服务器上面的. 下面我就引用一些别人的网页,然后简单的描述记录一下,如何才能快速的配置好环境.至于很多细节的处理,我就点到为止了. 首先记录一下配置,我用得linux是contentOS,服务器用的是阿里云. 下面是记录: 大致安装流程:http://www.cnblogs.com/ada-zheng/p/37

spring 项目分开发和生产环境

1.pom 文件修改 <profile> <!-- 本地开发环境 --> <id>dev</id> <properties> <profiles.active>dev</profiles.active> <webXmlPath>src/main/filters/dev/web.xml</webXmlPath> </properties> <activation> <ac

利用Maven把Web应用部署到tomcat中

1.打开tomcat的manager功能 在tomcat-users.xml文件夹中 1 <role rolename="manager-gui"/> 2 <role rolename="manager-script"/> 3 <user username="tomcat" password="tomcat" roles="manager-gui,manager-script"