Ansible自动发布JavaWeb项目
CentOS7下使用Ansible自动发布Web项目到tomcat
CentOS7下使用Ansible自动发布Web项目到tomcat
-
- 主机信息
192.168.0.100 本地机器,ansible安装的机器,操作都在这台机器 192.168.0.101 远程机器1,tomcat运行的机器,要发布到这台机 192.168.0.102 远程机器2,tomcat运行的机器,要发布到这台机
首先需要确保 192.168.0.100 可以远程ssh到 192.168.0.101 和 192.168.0.102,参考 上传公钥实现ssh登录;
两台远程主机都安装了JDK,安装目录是 /opt/jdk
-
- 安装Ansible
在本地机器192.168.0.100安装Ansible。整个过程都是在192.168.0.100操作,不用操作另外两台机器。
$ yum install -y ansible查看版本
$ ansible --version-
- 配置远程主机
在192.168.0.100设置两台远程机器的别名为tomcat,修改ansible配置文件 /etc/ansible/hosts并添加下列配置。
[tomcat]192.168.0.101192.168.0.102检查是否可以成功连接远程主机
$ ansible tomcat -m ping成功时返回“pong”,如下
192.168.0.101 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"}192.168.0.101 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong"}下载 apache-tomcat-7.0.94.tar.gz, 路径 /opt/download/apache-tomcat-7.0.94.tar.gz
添加bash脚本 upload-tomcat.sh 替换配置并重新打包tomcat,脚本也放在/opt/download中。
脚本如下:
#!/bin/bashset -e# 配置信息SOURCE_HOME=/opt/downloadTOMCAT_PKG=apache-tomcat-7.0.94TOMCAT_PORT=8080JDK_HOME=/opt/jdk
mkdir -p uploader
# 1 删除旧文件cd uploaderrm -rf *
# 2 复制文件cp ${SOURCE_HOME}/${TOMCAT_PKG}.tar.gz .
# 3 解压并重新命名tar -zxf ${TOMCAT_PKG}.tar.gzrm -f ${TOMCAT_PKG}.tar.gz
## 添加备份目录和配置
mkdir -p ${TOMCAT_PKG}/backup
echo '<?xml version="1.0" encoding="UTF-8"?><Server port="-1" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Connector port="'${TOMCAT_PORT}'" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" relaxedPathChars="|{}" relaxedQueryChars="|{}" URIEncoding="UTF-8" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> </Engine> </Service></Server>' > ${TOMCAT_PKG}/conf/server.xml
# 添加JVM配置(可选)sed -i '107iJAVA_OPTS="-Xms512m -Xmx4096m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=512m"' ${TOMCAT_PKG}/bin/catalina.sh# 设置jdk路径sed -i '107iJAVA_HOME="'${JDK_HOME}'"' ${TOMCAT_PKG}/bin/catalina.sh
cd ${TOMCAT_PKG}/webappsrm -rf *cd ../../
# 重新打包tar -czf ${TOMCAT_PKG}.tar.gz -C ${TOMCAT_PKG} .
cd ${SOURCE_HOME}#4. 执行ansible脚本
ansible-playbook upload-tomcat.ymlupload-tomcat.yml配置如下,将上面重新生成的tomcat压缩包上传到远程机器并解压
---- hosts: tomcat remote_user: root vars: archive_file: "/opt/download/uploader/apache-tomcat-7.0.94.tar.gz" target_path: /opt/project target_name: 8080-tomcat-7 tasks: - name: delete directory file: path: "{{target_path}}/{{target_name}}" state: absent - name: create directory file: path: "{{target_path}}/{{target_name}}" state: directory - name: upload file and unarchive unarchive: copy: yes src: "{{archive_file}}" dest: "{{target_path}}/{{target_name}}"执行脚本上传文件
$ bash upload-tomcat.sh添加bash脚本 release.sh 从git上clone项目并打包。脚本中的 common/variable.sh 中设置了一些全局变量,保存程序路径信息
#!/bin/bashset -esource ../common/variable.sh
WORK_SPACE=${PROJECT_HOME}/web1CONF_SPACE=${TASK_HOME}/web1/confTARGET_FILE=web1-0.0.1-SNAPSHOT
cd ${WORK_SPACE}echo "=====================>> 进入目录:" ${WORK_SPACE}
# 1. packagegit fetch --allgit reset --hard origin/mastermLog web1 $(git rev-parse HEAD)
# 2.替换配置文件cp -r ${CONF_SPACE}/classes/* ${WORK_SPACE}/src/main/resourcescp ${CONF_SPACE}/web.xml ${WORK_SPACE}/src/main/webapp/WEB-INF/
# 打包mvn clean package -Dmaven.test.skip=true
cd ${TASK_HOME}/web1#4. ansible jobsansible-playbook release.ymlrelease.yml 完成压缩包的上传和备份,检查tomcat后重启tomcat。
---- hosts: tomcat remote_user: root vars_files: - ../common/variable.yml vars: source_path: "/opt/code/web1" tomcat_path: /opt/project/8080-tomcat-7 target_path: "{{ tomcat_path }}/webapps/ROOT" archive_file: web1-0.0.1-SNAPSHOT.war tasks: - name: upload files copy: src: "{{source_path}}/target/{{archive_file}}" dest: "{{tomcat_path}}/backup" backup: yes - name: delete directory file: path: "{{target_path}}" state: absent - name: create directory file: path: "{{target_path}}" state: directory - name: extract files unarchive: src: "{{tomcat_path}}/backup/{{archive_file}}" dest: "{{target_path}}" remote_src: yes - name: checking tomcat shell: ps -ef | grep {{tomcat_path}} | grep -v grep | awk '{print $2}' register: command_result - name: stop tomcat shell: "kill -9 {{command_result.stdout}}" when: command_result.stdout != '' - debug: msg="tomcat was killed" when: command_result.stdout == '' - name: start the tomcat shell: setsid /bin/sh -i -c "{{ tomcat_path }}/bin/startup.sh"common/variable.yml中可以添加一些公用的配置。其它yml中使用 vars_files引入即可
release_home: /opt/download执行脚本发布项目,以后程序更新只需要重新执行该脚本即可。
$ bash release.sh具体的文档可以参考官网 Ansible官网
五、优化改进
程序使用Git作为版本控制库,可以使用一些工具(jenkins)检测项目是否更新,检测到之后执行 release.sh 发布项目即可,不用手动执行。
重启tomcat的另一个方式: 可以将tomcat添加为服务,修改release.yml重启脚本
- name: restart tomcat8080.service service: name: tomcat8080.service state: restarted- SSH公钥登录 - 上传公钥实现免密登录
- 添加springboot应用为服务 - CentOS7下添加springboot包为Systemd服务
- Tomcat配置HTTPS - Tomcat配置HTTPS证书