利用 ANT 实现自动化部署管理 WebSphere 下的应用

WebSphere Application Server (WAS) 确实给我们提供了一个很方便的管理控制台,可以手工很轻松的部署应用程序,管理服务器;有得亦有失,因为它不能像其他很多应用服务器那般拷贝文件的方式进 行部署,所以给像 DailyBuild 那样全自动化的过程制造了一些障碍。

其实 WAS 也提供了接口(SOAP 和 RMI)可通过脚本来完成对服务器及应用程序的管理,只是使用起来稍显麻烦,还得钻研一番。你可以采用三种途径来使用 WAS 的接口:

1. WASADMIN 命令行。最灵活,可以编制自己的 Jacl 脚本文件
2. WAS 提供的 ANT  TASK,对常用功能进行了封装,WAS_HOME/bin/ 下有这个 ws_ant.bat
3. 自行编程调用,曾有浅尝

下 面介绍的是通用 WAS 提供的 ANT  TASK 来完成 WAS 应用的部署、卸载、起停。我们要用到的已封装好 ANT  TASK 的包是 WAS_HOME/lib/wsanttasks.jar,打开这个文件,在包 com.ibm.websphere.ant.tasks 可以看到许多的 Task 类:

DefaultBindings, InstallApplication, Java2WSDL,JspC,ListApplications, Messages, ModuleValidator, NLSEcho, ServerControl, ServerStatus, StartApplication,StartServer, StopApplication, StopServer, UninstallApplication, WsAdmin, WSDL2Java, WsEjbDeploy

看看那些可以发掘来用的,其中 WsAdmin 是个领头的,相当于 WsAdmin 命令行,如果你熟悉 WsAdmin 命令的话,只要它你就能完成所有的操作,我在脚本中对不便于用其他 Task 完成的任务就使用 WsAdmin。看下面的 ANT build.xml 脚本及完成部署及启动应用的执行效果。

  1. <project name="wasant" basedir="." default="installAndStart">  
  2.     <!-- Important:本脚本要让 ant 使用 WAS 的 JRE 来执行  
  3.         或者用 WAS_HOME/bin/ws_ant.bat 来执行,否则不能成功执行  
  4.         有兴趣可去研究一下,让它在 SUN JRE 下也能成功执行  
  5.     -->  
  6.     <!--  
  7.     修改 WAS_HOME/properties/wsadmin.properties 的  
  8.     com.ibm.ws.scripting.connectionType=SOAP #可选RMI  
  9.     com.ibm.ws.scripting.port=8879     #视协议和设置所对应端口,可能是 8880  
  10.     com.ibm.ws.scripting.host=10.128.38.110 #要管理的WAS服务器IP  
  11.     然后执行 WAS_HOME/bin/wsadmin.bat 就连接到了 10.128.38.110 的WAS上了  
  12.     不过有些奇怪,WAS配置了安全性,但没有指定用户名和密码也行了  
  13.     连上之后用 $AdminApp list 就能显示上面所有应用程序了  
  14.       
  15.     如果不配置 wsadmin.properties 文件,可以直接指定连接参数,如  
  16.     wsadmin -conntype SOAP -host 10.128.38.110 -port 8879 -user xxxxxxx -password xxxxxx  
  17.       
  18.     wsadmin 中有四个对象可以在脚本中使用:  
  19.     $AdminControl   
  20.     $AdminConfig   
  21.     $AdminApp   
  22.     $Help  
  23.     -->  
  24.   
  25.     <property name="was.root" value="D:/Program Files/IBM/WebSphere51/AppServer" />  
  26.     <property name="wsanttasks.jar" value="${was.root}/lib/wsanttasks.jar"/>  
  27.     <property name="app.name" value="test"/>  
  28.     <property name="ear.file" value="c:/test.ear"/>  
  29.       
  30.     <!--登录信息-->  
  31.     <property name="username" value="xxxxxx"/>  
  32.     <property name="password" value="xxxxxx"/>  
  33.     <property name="host" value="10.128.38.110"/>  
  34.     <property name="port" value="8879"/>  
  35.     <property name="conntype" value="SOAP"/>  
  36.       
  37.     <!-- WsAdmin 命令定义-->  
  38.     <property name="startApp.sr3Serv1"  
  39.        value="$AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv1,*] startApplication ${app.name}"/>  
  40.     <property name="startApp.sr3Serv2"  
  41.     value="$AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv2,*] startApplication ${app.name}"/>  
  42.     <property name="stopApp.sr3Serv1"  
  43.         value="$AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv1,*] stopApplication ${app.name}"/>  
  44.     <property name="stopApp.sr3Serv2"  
  45.         value="$AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv2,*] stopApplication ${app.name}"/>  
  46.   
  47.     <!--  
  48.      启动应用服务器,加入了集群的服务器必须通过节点代理来启动,如  
  49.      $AdminControl invoke [$AdminControl queryNames type=NodeAgent,node=sr3,*] launchProcess server1  
  50.      $AdminControl invoke [$AdminControl queryNames type=NodeAgent,node=sr3,*] launchProcess sr3Serv1      
  51.      
  52.       如果是独立的 WAS 就简单些了,直接  
  53.      $AdminControl startServer server1 启动  
  54.     -->  
  55.   
  56.     <!--  
  57.      停止应用服务器,无论有没加入集群,都可以不通过节点代理来停止,如  
  58.      $AdminControl stopServer server1  
  59.      $AdminControl stopServer sr3Serv1  
  60.        
  61.       节点下的应用服务器可通过节点代理来停止,但是 server1不能用这种方式  
  62.      $AdminControl invoke [$AdminControl queryNames type=Server,node=sr3,name=sr3Serv1,*] stop {}  
  63.      $AdminControl invoke [$AdminControl queryNames type=NodeAgent,node=sr3,*] launchProcess server1    
  64.     -->  
  65.   
  66.     <taskdef name="wsStartServer" classname="com.ibm.websphere.ant.tasks.StartServer" classpath="${wsanttasks.jar}" />  
  67.     <taskdef name="wsStopServer" classname="com.ibm.websphere.ant.tasks.StopServer" classpath="${wsanttasks.jar}" />  
  68.     <taskdef name="wsInstallApp" classname="com.ibm.websphere.ant.tasks.InstallApplication" classpath="${wsanttasks.jar}" />  
  69.     <taskdef name="wsUninstallApp" classname="com.ibm.websphere.ant.tasks.UninstallApplication" classpath="${wsanttasks.jar}" />  
  70.     <taskdef name="wsStartApp" classname="com.ibm.websphere.ant.tasks.StartApplication" classpath="${wsanttasks.jar}" />  
  71.     <taskdef name="wsStopApp" classname="com.ibm.websphere.ant.tasks.StopApplication" classpath="${wsanttasks.jar}" />  
  72.     <taskdef name="wsListApps" classname="com.ibm.websphere.ant.tasks.ListApplications" classpath="${wsanttasks.jar}" />  
  73.     <taskdef name="wsAdmin" classname="com.ibm.websphere.ant.tasks.WsAdmin" classpath="${wsanttasks.jar}" />  
  74.   
  75.     <!-- wsadmin 命令行下输入   
  76.        llength [$AdminControl queryNames type=Application,name=hello_war,*]  
  77.        运行的实例数,如果大于零表示正在运行,否则就是停止状态  
  78.     -->  
  79.   
  80.     <!-- wsadmin 命令行下输入 $AdminApp list 的效果 -->  
  81.     <target name="wsListApps" description="List All Applications">  
  82.         <wsListApps conntype="SOAP" host="10.128.38.110" port="8879"  
  83.             user="xxxxxx" password="xxxxxx" washome="${was.root}">  
  84.         </wsListApps>  
  85.     </target>  
  86.   
  87.     <!-- wsadmin 命令行下输入   
  88.        $AdminApp install c:/test.ear {-cluster sr3Cluster -appname test -usedefaultbindings}  
  89.        $AdminConfig save      #不要忘记了,save一下,不然不生效  
  90.          
  91.        可以通过 $AdminApp options c:/test.ear 查看安装这个包可指定什么 options  
  92.     -->  
  93.     <target name="wsInstallApp" description="Install Application ${app.name}">  
  94.         <wsInstallApp user="${username}" password="${password}" host="${host}"  
  95.             ear="${ear.file}" port="${port}" conntype="${conntype}" washome="${was.root}"  
  96.             options="-cluster sr3Cluster -appname ${app.name} -usedefaultbindings">  
  97.         </wsInstallApp>  
  98.     </target>  
  99.       
  100.     <!-- 卸载应用程序比较简单,只要   
  101.     $AdminApp uninstall test  
  102.     $AdminConfig save  
  103.     -->  
  104.     <target name="wsUninstallApp" description="Uninstall Application ${app.name}">  
  105.         <wsUninstallApp user="${username}" password="${password}" host="${host}"  
  106.            conntype="${conntype}" port="${port}" washome="${was.root}" application="${app.name}">  
  107.         </wsUninstallApp>  
  108.     </target>  
  109.   
  110.     <!--  
  111.        启动应用,按照红皮书的介绍用$AdminControl invoke [$AdminControl queryNames type=ApplicationManager,node=sr3,*] startApplication test  
  112.        无法启动应用程序,出现“无法创建 ObjectName”错误,必须在对所有所在服务器逐个的启动  
  113.          
  114.        $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=server1,*] startApplication test  
  115.        $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv1,*] startApplication test  
  116.        $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv2,*] startApplication test  
  117.     -->  
  118.     <!--因为下面的脚本实质就是采用的  
  119.     $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,node=sr3,*] startApplication test  
  120.     所以会报同样的错,“无法创建 ObjectName”错误,改用wsAdmin直接执行命令的方式来启动  
  121.     <target name="wsStartApp" description="Start Application ${app.name}">  
  122.         <wsStartApp user="${username}" password="${password}" host="${host}"  
  123.             conntype="${conntype}" port="${port}" washome="${was.root}" application="${app.name}">  
  124.         </wsStartApp>  
  125.     </target>  
  126.     -->  
  127.   
  128.     <!-- 采用 WsAdmin 直接执行命令的方式来启动应用程序 -->  
  129.     <target name="wsStartApp" description="Start Application ${app.name}">  
  130.         <echo>Start Application ${app.name} on sr3Serv1/sr3Serv2</echo>  
  131.         <wsAdmin  user="${username}" password="${password}" host="${host}"  
  132.             conntype="${conntype}" port="${port}" washome="${was.root}"   
  133.             command="${startApp.sr3Serv1};${startApp.sr3Serv2}">  
  134.         </wsAdmin>  
  135.     </target>  
  136.   
  137.     <!--  
  138.        启动应用,按照红皮书的介绍用$AdminControl invoke [$AdminControl queryNames type=ApplicationManager,node=sr3,*] startApplication test  
  139.        无法启动应用程序,出现“无法创建 ObjectName”错误,必须在对所有所在服务器逐个的启动  
  140.          
  141.        $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=server1,*] stopApplication test  
  142.        $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv1,*] stopApplication test  
  143.        $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,process=sr3Serv2,*] stopApplication test  
  144.     -->  
  145.   
  146.     <!--因为下面的脚本实质就是采用的  
  147.       $AdminControl invoke [$AdminControl queryNames type=ApplicationManager,node=sr3,*] startApplication test  
  148.       所以会报同样的错,“无法创建 ObjectName”错误,改用wsAdmin直接执行命令的方式来启动  
  149.     <target name="wsStopApp" description="Stop Application ${app.name}">  
  150.         <wsStopApp user="${username}" password="${password}" host="${host}"  
  151.             conntype="${conntype}" port="${port}" washome="${was.root}" application="${app.name}">  
  152.         </wsStopApp>  
  153.     </target>  
  154.     -->  
  155.   
  156.     <!-- 采用 WsAdmin 直接执行命令的方式来启动应用程序 -->  
  157.     <target name="wsStopApp" description="Start Application ${app.name}">  
  158.         <echo>Stop Application ${app.name} on sr3Serv1/sr3Serv2 </echo>  
  159.         <wsAdmin user="${username}" password="${password}" host="${host}"  
  160.             conntype="${conntype}" port="${port}" washome="${was.root}"   
  161.             command="${stopApp.sr3Serv1};${stopApp.sr3Serv2}">  
  162.         </wsAdmin>  
  163.     </target>  
  164.       
  165.     <!-- 实际的任务组合 -->  
  166.     <target name="installAndStart" description="Install and Start ${app.name}">  
  167.         <antcall target="wsInstallApp"/>  
  168.         <antcall target="wsStartApp"/>  
  169.     </target>  
  170.       
  171.     <target name="stopAndUninstall" description="Stop and Uninstall ${app.name}">  
  172.         <antcall target="wsStopApp"/>  
  173.         <antcall target="wsUninstallApp"/>  
  174.     </target>  
  175. </project>  

执行效果:

Buildfile: E:/Workspace/Eclipse/TestSwt/build.xml
installAndStart
:
wsInstallApp :
[ wsInstallApp ] 正在安装应用程序 [c:/test.ear]...
  [
wsadmin ] WASX7209I: 使用 SOAP 连接器连接到节点 sr3Manager 上的进程“dmgr”;进程的类型为:DeploymentManager
  [
wsadmin ] ADMA5016I: 启动安装 test。
  [
wsadmin ] ADMA5005I: 在 WebSphere 资源库中配置应用程序 test
  [
wsadmin ] ADMA5001I: 应用程序二进制文件保存于 /opt/WebSphere51/DeploymentManager/wstemp/Script116f1164d5a/workspace/cells/sr3Network/applications/test.ear/test.ear
  [wsadmin] ADMA5011I: 清除应用程序 test 的临时目录完成。

  [ wsadmin ] ADMA5013I: 应用程序 test 安装成功。
[
wsInstallApp ] 已安装的应用程序 [c:/test.ear]
wsStartApp:
     [ echo ] Start Application test on sr3Serv1/sr3Serv2
  [ wsadmin ] WASX7209I: 使用 SOAP 连接器连接到节点 sr3Manager 上的进程“dmgr”;进程的类型为:DeploymentManager
BUILD SUCCESSFUL
Total time: 33 seconds


说明:

1. 在 build.xml 间杂着许多的注释来更清楚的阐述,也用来同 WsAdmin 命令进行对照理解,实际中可去除那些累赘。

2. 以上测试是基于 Cluster 的,在 sr3Cluster 下有两个应用服务器 sr3Serv1 和 sr3Serv2,应用程序是部署在 sr3Cluster 上的。对于未配置集群的 WAS 会更简单些,脚本中也有提及,请看官自已斟酌裁剪,如有什么疑问可与本人共同探讨
大致就是 wsInstallApp 的 options 中 -cluster sr3Cluster 改为 -server server1,应用启停时的命令中 process=server1

3. 并且配置了 WAS 的安全性,所以登录时必须提供用户名和密码

4. 例子中是部署了一个 ear 包,如要是部署 war 包的话,在 options 中要指定访问 Web 的上下文,如 -contextroot test

5. 安装应用之后立即就启动,可能会因服务器还没有真正完成对新应用的配置而启动失败,所以可以在安装完应用之后适当的 <sleep seconds="5"/> 像这样等待几秒钟。

后记:其实一个部署脚本写成这样远远比编制一个 Jacl 脚本复杂不知多少倍,所以在实际应用中我还是打算把部署的任务写到一个 Jacl 脚本中(大概想来写不上十行代码就能搞定),再交由 Ant 去 exec 执行 wsadmin -f scriptfile,这样做还有一个好处就是无需去设置使用谁的 jdk,或者打定了用 ws_ant.bat,更不用与服务器来回建立多个 SOAP 会话。如此设想想,以上内容可能也就是纯做研究,知道 WAS 有这么回事,也行适当时候会用上,只现在未曾预见而已。

相关资料:

1. WAS中关于命令行部署EAR
2. 使用脚本编制(wsadmin)
3. wsadmin管理WebSphere
4. IBM WebSphere 应用服务器 5.0 系统管理与配置 红皮书
5. WebSphere Application Server6.0无人执守部署概要
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值