Cet article fait suite à un premier article que vous pouvez retrouver => ici <=.
A l’origine, il était question de vous présenter un « framework » afin de rendre scriptable le redémarrage de WebLogic.
Ici, nous allons aller un peu plus loin pour nous confronter au cas d’un environnement clustérisé.
Pour manipuler les serveurs WebLogic des différentes machine nous allons utiliser le langage Python.
Nous ferons ainsi appel à « Node Manager » via la console WLST pour atteindre les différents nœuds à partir d’une seule machine.
Schéma d’architecture
Voici le schéma d’architecture de notre exemple :
Script « master »
Ci-dessous, le script qui assure l’arrêt et redémarrage de tous les serveurs à partir de l’endroit unique (a.domaine.name.fr) où il sera lancé.
#========================================================================================= #Import necessary classes/interfaces #========================================================================================= from java.io import FileInputStream import java.lang import os import string import socket; #========================================================================================= #========================================================================================= # CONNECT TO ADMIN SERVER (WLST)... # => configuration server #========================================================================================= print 'CONNECT TO ADMIN SERVER'; admin_server_listen_address = "a.domaine.name.fr"; admin_server_listen_port="8080"; admin_server_url = 't3://' + admin_server_listen_address + ':' + admin_server_listen_port; admin_username="userAdminWeblogic" admin_password="passwordAdminWeblogic" admin_server_name="nameAdminServer" #========================================================================================= # ...CONNECT TO ADMIN SERVER (WLST) # => Stopping servers with "running" status # => Launch Sleep Thread until all servers are 'shutdown' or 'failed_not_restartable' #========================================================================================= try: connect(admin_username, admin_password, admin_server_url); print 'STOPPING SERVERS'; domainRuntime(); server_lifecycles = cmo.getServerLifeCycleRuntimes(); for server_lifecycle in server_lifecycles: if (server_lifecycle.getState() == 'RUNNING' and server_lifecycle.getName() != admin_server_name): print 'STOP SERVER ' + server_lifecycle.getName(); task = server_lifecycle.shutdown(1000, java.lang.Boolean('true')); java.lang.Thread.sleep(1000); print task.getStatus() + ', ' + server_lifecycle.getState(); else: print 'SERVER ' + server_lifecycle.getName() + ' is in ' + server_lifecycle.getState() + ' state and will not be stopped'; all_stoped="false"; while all_stoped != "true" : all_stoped="true"; for server_lifecycle in server_lifecycles: if (server_lifecycle.getState() != 'SHUTDOWN' and server_lifecycle.getName() != admin_server_name and server_lifecycle.getState() != 'FAILED_NOT_RESTARTABLE'): all_stoped = "false"; print 'SERVER ' + server_lifecycle.getName() + ' is ' + server_lifecycle.getState(); java.lang.Thread.sleep(30000); else: print 'SERVER ' + server_lifecycle.getName() + ' is ' + server_lifecycle.getState(); try: for server_lifecycle in server_lifecycles: if (server_lifecycle.getState() == 'RUNNING' and server_lifecycle.getName() == admin_server_name): print 'STOP SERVER ' + server_lifecycle.getName(); task = server_lifecycle.shutdown(1000, java.lang.Boolean('true')); java.lang.Thread.sleep(10000); java.lang.Thread.sleep(10000); except: print 'AdminStop' except: print 'Unable to stop' print 'DISCONNECT FROM THE ADMIN SERVER'; disconnect(); #========================================================================================= #========================================================================================= # CONNECT TO THE NODEMANAGER A... # => configuration server # => nmType generally is "ssl" or "plain" (check your configuration) #========================================================================================= print 'CONNECT to the NodeManager A to start servers...'; Username="userNodemanagerA" Password="passwordNodemanagerA" nmType="ssl" Host="a.domain.name.fr" nmPort="5555" domainName="domainName" domainDir="/domainPath/domainDir" #========================================================================================= # ...CONNECT TO THE NODEMANAGER A # => nmConnect() to connect to the nodemanager with defined configuration # => nmStart() to start each node present on the defined configuration server #========================================================================================= nmConnect(Username,Password,Host,nmPort,domainName,domainDir,nmType) nmStart('AdminServer') nmStart('ManagedServer1') nmStart('ManagedServer2') nmDisconnect() #========================================================================================= #========================================================================================= # CONNECT TO THE NODEMANAGER B # => configuration server # => nmType generally is "ssl" or "plain" (check your configuration) #========================================================================================= print 'CONNECT to the NodeManager B to start servers...'; Username="userNodemanagerB" Password="passwordNodemanagerB" nmType="ssl" Host="b.domain.name.fr" nmPort="5555" domainName="domainName" domainDir="/domainPath/domainDir" #========================================================================================= # ...CONNECT TO THE NODEMANAGER B # => nmConnect() to connect to the nodemanager with defined configuration # => nmStart() to start each node present on the defined configuration server #========================================================================================= nmConnect(Username,Password,Host,nmPort,domainName,domainDir,nmType) nmStart('ManagedServer3') nmStart('ManagedServer4') nmDisconnect() #========================================================================================= #========================================================================================= # RESUME SERVER IF NEEDED (WLST)... # => configuration server #========================================================================================= print 'CONNECT TO ADMIN SERVER'; admin_server_listen_address = "a.domaine.name.fr"; admin_server_listen_port="8080"; admin_server_url = 't3://' + admin_server_listen_address + ':' + admin_server_listen_port; admin_username="userAdminWeblogic" admin_password="passwordAdminWeblogic" admin_server_name="nameAdminServer" connect(admin_username, admin_password, admin_server_url); print 'RESUME SERVERS'; domainRuntime(); server_lifecycles = cmo.getServerLifeCycleRuntimes(); #========================================================================================= # ... RESUME SERVER IF NEEDED (WLST) # => Check if servers with "ADMIN" status exists # => Launch Sleep Thread until all servers are "RUNNING" #========================================================================================= for server_lifecycle in server_lifecycles: if (server_lifecycle.getState() == 'ADMIN' and server_lifecycle.getName() != admin_server_name): print 'RESUME SERVER ' + server_lifecycle.getName(); task = server_lifecycle.resume(); java.lang.Thread.sleep(1000); print task.getStatus() + ', ' + server_lifecycle.getState(); else: print 'SERVER ' + server_lifecycle.getName() + ' is in ' + server_lifecycle.getState() + ' state and will not be RESUME'; all_stoped="false"; while all_stoped != "true" : all_stoped="true"; for server_lifecycle in server_lifecycles: if (server_lifecycle.getState() != 'RUNNING' and server_lifecycle.getName() != admin_server_name): all_stoped = "false"; java.lang.Thread.sleep(30000); else: if (server_lifecycle.getName() != admin_server_name): print 'SERVER ' + server_lifecycle.getName() + ' is in ' + server_lifecycle.getState() + ' state'; java.lang.Thread.sleep(10000); print 'DISCONNECT FROM THE ADMIN SERVER'; disconnect(); #================================================================================= #================================================================================= exit()
Afin de lancer le script « restartAll.py », il va falloir se placer dans le répertoire de la commande « wlst.sh », puis lancer la commande suivante :
cd $WELOGIC_HOME/common/bin/wlst.sh restartAll.py
Nous aurions pu également créer, pour aller plus loin, différents scripts modulables supplémentaires (par exemple : purges de fichiers ou clean des caches) dans des fichiers Python séparés que nous aurions appelé via ce même mécanisme avec la bonne pratique de les ajouter via crontab pour assurer une maintenance automatisée.