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

1、环境描述

安装有ansible的服务器:192.168.13.45web

测试环境服务器:192.168.13.49shell

/home/app/api-tomcat/webapps/api.war为测试环境新版本war包位置

生产环境服务器:192.168.13.51api

/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用户执行tomcat

2、编写ansible-playbook用的yml文件

一、升级

这里全部的#开头的注释文字在使用的时候都要去掉,由于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 app@:/ 
    - 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

二、回滚

#生产环境主机地址
- 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

3、升级操做和注意事项

一、升级前免密钥操做

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.51app

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

为了业务安全,ansible所在主机和生产环境主机、测试环境主机是互通的。生产环境主机能连上测试环境主机,但测试环境主机不能连上生产环境主机,因此这里测试环境主机不须要将密钥发送给生产环境主机ssh

二、升级和回滚

升级webapp

ansible-playbook /home/app/api.yml -v

回滚ide

ansible-playbook /home/app/api-rollback.yml -v

ansible-playbook后面跟上以前写的yml文件路径,-v是为了显示详细执行信息

三、注意

若是在jenkins中执行升级和回滚的yml文件,必定要将在jenkins用户的公钥发送给生产环境主机和测试环境主机,不然会报权限错误

要操做的主机必定要填入/etc/ansible/hosts中

两个yml文件已在生产环境中验证

相关文章
相关标签/搜索