使用Ansible进行项目的自动部署(Tomcat、Weblog
问题:
Weblogic/Tomcat 通过JAVA直接远程调用或者调用本地Shell还是通过Ansible来部署新程序 + 启动停止服务 如何管理?需要哪些配置信息?
采用方案:
通过Ansible来部署新程序+启动停止服务;
Java代码使用介绍:
1.AnsibleHelper.java是一个工具类,接收外部传过来的参数,替换hosts配置,执行playbook剧本,部分代码如下:
/**
* 完成Tomcat或weblogic的项目自动部署(tomcat支持多个项目同时部署,weblogic一次只能部署一个项目)
*
* @param ansibleSettingsMap
* 该参数需要提供如下几个键值对:
* ansibleSettingsMap.put("ansible_ssh_hosts_path"
* ,"本机hosts文件路径,带hosts文件名");
* ansibleSettingsMap.put("ansible_ssh_host", "目标主机ip地址");
* ansibleSettingsMap.put("ansible_ssh_user", "目标主机用户名");
* ansibleSettingsMap.put("ansible_ssh_pass", "目标主机用户密码");
* @param playbookParamMap
* 若为tomcat部署,该参数需要提供如下几个键值对:
* playbookParamMap.put("local_war_path", "本机要部署的war包路径,不带文件名");
* playbookParamMap.put("project_name_arr",
* 字符串数组格式的项目(war包)名,不带.war后缀});
* playbookParamMap.put("tomcat","目标主机tomcat路径,到tomcat/主目录为止");
* -----------------------------------------------------------------
* 若为weblogic部署,该参数需要提供如下几个键值对:
* playbookParamMap.put("user_name","目标主机weblogic用户名");
* playbookParamMap.put("password", "目标主机weblogic密码");
* playbookParamMap.put("weblogic_path",
* "目标主机weblogic路径,到Oracle_Home/为止");
* playbookParamMap.put("local_war_file", "本机要部署的war包路径,带文件名");
* playbookParamMap.put("domain_name", "weblogic域名");
* playbookParamMap.put("server_name", "weblogic服务名称");
* playbookParamMap.put("admin_url", "weblogic服务的地址,需使用iiop协议" );
* playbookParamMap.put("war_file_path", "目标主机war包的存储路径" );
* playbookParamMap.put("project_name",
* "项目名称(即war包名称,不带.war后缀)");
* @param playbookPath
* ansible tomcat或weblogic的playbook路径,带文件名
*/
public static void doDeploy(Map<String, Object> ansibleSettingsMap, Map<String, Object> playbookParamMap, String playbookPath) {
setAnisbleHosts(ansibleSettingsMap);
String res = doAnisblePlaybook(playbookParamMap, playbookPath);
System.out.println("==========输出=============");
System.out.println(res);
}
2.AnsibleController.java是调用以上工具类的测试示例,里面包含了执行playbook所需的参数(部分参数定义在application-development.properties)
3.FileContentReplaceHelper.java和ExecLinuxCMD.java分别是替换文件文本内容和知道你给Linux命令的两个工具类。
具体实现步骤:
1.准备工作:
两台Linux服务器:
主服务器(本系统需要部署该服务器上),需要的软件环境:
Python 、Ansible、Jdk
从服务器(目标服务器),需要的软件环境:
Python 、Tomcat、Weblogic、Jdk
2.配置信息:
主服务器ansible目录下的hosts文件、tomcat.yaml文件和weblogic.yaml文件。
1)hosts文件里面配置从服务器的ip、端口、用户名、密码等信息,例如:
host1 ansible_ssh_host=192.168.10.129 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="123456" #host_to_replace
2)tomcat.yaml文件是一个playbook(剧本),该文件里定义了Tomcat的整个部署流程:
---
- hosts: all
tasks:
- name: stop tomcat service #调用脚本shutdown_tomcat.sh,停止Tomcat服务
script: "/etc/ansible/shutdown_tomcat.sh"
- name: remove old war file #删除旧的war包及文件
shell: cd {{ tomcat }}webapps&&rm -rf {{ item }} {{ item }}.war
with_items: "{{ project_name_arr }}"
- name: copy new war file #从主服务器拷贝新war包到从服务器
copy: src={{ local_war_path }}{{ item }}.war dest={{ tomcat }}webapps/
with_items: "{{ project_name_arr }}"
- name: start tomcat service #启动Tomcat
shell: chdir={{ tomcat }}bin/ nohup ./startup.sh &
在命令行传入{{参数名 }}内的参数,运行该playbook:
ansible-playbook /etc/ansible/tomcat.yaml --extra-vars '{"tomcat":"/usr/local/tomcat8/","local_war_path":"/opt/store/","project_name_arr":["gr","hw2"]}'
3)weblogic.yaml定义了Weblogic的整个部署流程:
---
- hosts: all
tasks:
- name: remove old war file #删除从服务器上旧的war包
shell: cd {{ war_file_path }}&&rm -rf {{ project_name }}.war
- name: copy new war file #拷贝主服务器上的war包到从服务器指定目录
copy: src={{ local_war_file }} dest={{ war_file_path }}
- name: start weblogic service #调用shell脚本,传入指定参数,完成启停服务、部署项目
script: "/etc/ansible/start_weblogic.sh {{ user_name }} {{ password }}
{{ weblogic_path }} {{ domain_name }} {{ server_name }} {{ admin_url }}
{{ war_file_path }} {{ project_name }}"