基础说明
在日常运维过程上经常需要安装weblogic环境,常规的思路是通过安装VNC至操作系统,再通过界面安装JDK + weblogic软件。
这次通过shell + jython的方式实现weblogic环境的自动化部署
环境信息
Linux
JDK1.8 ,tar.gz版本
weblogic 12c(12.1.3.0)
自动化部署工具
JDK的自动安装
默认安装目录为:/usr/java
通过交互式提示,输入安装包的绝对路径,然后默认安装到/usr/java目录下,并配置环境变量,并生效变量
代码具体实现:jdkInstaller.sh
#!/bin/bash
#========
# JDK installer 安装JDK到/usr/java目录下
# 配置/etc/profile中JAVA_HOME环境变量,并生效 source /etc/profile
# 此脚本只需要执行一次,如果安装,则需要提前删除/usr/java安装的jdk
# 示例安装文件:jdk-8u211-linux-x64.tar.gz
function jdkInstaller()
{
echo '
################
JDK自动安装工作
工具默认目录:安装JDK到/usr/java目录下
配置/etc/profile中JAVA_HOME环境变量,并生效 source /etc/profile
注意:
本工具需要使用root权限执行
本工具需要使用jdk的tar.gz格式的源文件
'
echo '请输入安装包文件位置(绝对路径):'
read input
if [[ ! -f $input ]]; then
#statements
echo "$input 文件不存在,推出程序"
fi
# 配置一些参数
j_dir="/usr/java"
p_file="/etc/profile"
#j_dir="/app/install/wls/testdir"
#p_file="/app/install/wls/1.txt"
mkdir -p $j_dir
#last_dir_name=`echo $input|awk -F '/' '{print $NF}'|cut -d '.' -f1`
last_dir_name=`tar -ztf $input|head -1|sed 's/.$//'`
JAVA_HOME="$j_dir/$last_dir_name"
#将文件解压到指定目录
tar zxvf $input -C $j_dir
# 获取java_home目录
chown -R root:root $JAVA_HOME
#设定环境变量至/etc/profile
echo "export JAVA_HOME=$JAVA_HOME" >> $p_file
echo "export PATH=$PATH:$JAVA_HOME/bin" >> $p_file
source $p_file
}
jdkInstaller
weblogic 12c自动化部署和配置
通过交互式操作完成weblogic软件环境安装
在执行脚本前,在脚本的环境变量部分需要配置一些使用到的基本信息
如安装目录、domain目录、控制台用户密码、创建的server名和使用端口信息等,然后执行wlsInstaller.sh来实现自动安装
代码实现:
wlsInstaller.sh
#!/bin/bash
# weblogic12c自助安装
clear
####安装目录配置
wls_install_home=/app/weblogic
inventory_loc=$wls_install_home/oraInventory
inst_group=oinstall
oraInst=$inventory_loc/oraInst.doc # for silent mode
responseFile=$inventory_loc/wls.rsp
mv_home=$wls_install_home/Oracle/Middleware/Oracle_Home
#####
# domain_name AND weblogic_password 后期可以做成交互式输入参数
# for create domain
wlst_scripts=$mv_home/oracle_common/common/bin/wlst.sh
domain_py_template="create_domain.py"
domain_name="fr_domain" # pass the domain_name to py template for creating domain
domain_home=$mv_home/user_projects/domains/ # default domain_home
weblogic_password="weblogic123"
jar_template_name=$mv_home/wlserver/common/templates/wls/wls.jar
host_ip="10.1.111.26"
###########
# nodemanger config使用这一部分环境变量
# 配置使用nmRoll注册nodemanager home和domain_home
machine_name=`hostname`
osuser="weblogic"
osuser_group="oinstall"
admin_user="weblogic"
admin_pasword=$weblogic_password
host_ip="10.1.111.26"
admin_url="t3://$host_ip:7001"
my_domain=$domain_home$domain_name/
py_config_nm="configNodeManager.py"
####
# 创建server1的部分
####
sv_name="fr_server2"
port="7007"
mem_args="-Xms4096m -Xmx4096m -XX:MaxPermSize=256M" #请注意通过脚本只能设置这三个参数大小值
py_create_sv="createServer.py"
# check dirs
function checkDirs()
{
# check install dirs
if [[ ! -d $wls_install_home ]]; then
#statements
mkdir -p $wls_install_home
mkdir -p $inventory_loc
fi
}
# 1·配置oraInst.doc文件
function createOraInst()
{
cat /dev/null > $oraInst
echo "inventory_loc=$inventory_loc" >> $oraInst
echo "inst_group=$inst_group">> $oraInst
echo "oraInst.doc 的位置 : $oraInst"
echo "oraInst.doc文件内容:"
cat $oraInst
}
# 2.配置response文件
function createResponseFile()
{
cat /dev/null > $responseFile
echo "[ENGINE]" >> $responseFile
echo "Response File Version=1.0.0.0.0" >> $responseFile
echo "[GENERIC]" >> $responseFile
echo "DECLINE_AUTO_UPDATES=true" >> $responseFile
echo "MOS_USERNAME=" >> $responseFile
echo "MOS_PASSWORD=<SECURE VALUE>" >> $responseFile
echo "AUTO_UPDATES_LOCATION=" >> $responseFile
echo "SOFTWARE_UPDATES_PROXY_SERVER=" >> $responseFile
echo "SOFTWARE_UPDATES_PROXY_PORT=" >> $responseFile
echo "SOFTWARE_UPDATES_PROXY_USER=" >> $responseFile
echo "SOFTWARE_UPDATES_PROXY_PASSWORD=<SECURE VALUE>" >> $responseFile
echo "ORACLE_HOME=$wls_install_home/Oracle/Middleware/Oracle_Home" >> $responseFile
echo "FEDERATED_ORACLE_HOMES=" >> $responseFile
echo "INSTALL_TYPE=WebLogic Server" >> $responseFile
echo "responseFile响应文件位置: $responseFile"
echo "显示响应文件的内容:"
cat $responseFile
}
# 执行默认安装weblogic软件
function instll_wls()
{
echo "请输入wls jar安装包位置:"
read input
java -jar $input -silent -responseFile $responseFile -invPtrLoc $oraInst
}
# create Domain use create_domian.py
function createDomain()
{
d_array[0]=$domain_name
d_array[1]=$domain_home
d_array[2]=$weblogic_password
d_array[3]=$jar_template_name
d_array[4]=$host_ip
# 打印参数输出
echo "Print the create DomainParas:"
for i in ${d_array[*]}
do
echo $i
done
# 临时使用
rm -rf $domain_home$domain_name
# create domian use wlst.sh
$wlst_scripts $domain_py_template ${d_array[@]}
if [[ $? -eq 0 ]]; then
#statements
echo "Create Domain : $domain_name SUCSESS!!"
fi
# (yes or no)? to start AdminServer
echo "We try to start AdminServer, Please input:(yes or no)?"
while
read input
do
#statements
case $input in
yes )
echo "Input value: $input . Started AdminServer"
cd $domain_home$domain_name
nohup ./startWebLogic.sh &
break
;;
no )
echo "Input value: $input . Not Start AdminServer, Exit"
break
;;
* )
echo "输入错误,请重新输入 yes or no"
continue
;;
esac
done
}
#
function configNodeManger()
{
# machine_name=`hostname`
# osuser="weblogic"
# osuser_group="oinstall"
# admin_url="t3://localhost:7001"
d_array[0]=$machine_name
d_array[1]=$osuser
d_array[2]=$osuser_group
d_array[3]=$admin_user
d_array[4]=$admin_pasword
d_array[5]=$admin_url
d_array[6]=$my_domain
d_array[7]=$host_ip
# 先修改nodemanager配置文件参数,方便后续使用wlst启动
#
nm_pros=$my_domain/nodemanager/nodemanager.properties
echo $nm_pros
sed -i 's/SecureListener=true/SecureListener=false/g' $nm_pros
# cat $nm_props|grep SecureListener
# 使用for打印数组
for i in ${d_array[@]} ; do echo $i ; done
echo "$wlst_scripts $py_config_nm ${d_array[@]}"
#执行创建部分
echo "### Config NM start: running ...."
$wlst_scripts $py_config_nm ${d_array[@]}
echo "### Config NM stop: ended."
# 通过脚本启动nodemanager
echo "We try to start node manager, Please input:(yes or no)?"
while
read input
do
#statements
case $input in
yes )
echo "Input value: $input . Started NodeManager"
cd $domain_home$domain_name/bin
nohup ./startNodeManager.sh &
break
;;
no )
echo "Input value: $input . Not Start NodeManager, Exit"
break
;;
* )
echo "输入错误,请重新输入 yes or no"
continue
;;
esac
done
# nmEnroll('$my_domain','$my_domain/nodemanager')
}
# 按照模板创建server1,并指定到当前hostname的machine
function createServer()
{
echo "
###########
按照模板创建单个 $sv_name
默认计算机: $machine_name
IP地址:$host_ip
默认端口:$port
启动参数:$mem_args
###########
"
d_array[0]=$sv_name
d_array[1]=$machine_name
d_array[2]=$host_ip
d_array[3]=$port
#d_array[4]=$mem_args
# for : connect to admin control
d_array[4]=$admin_user
d_array[5]=$admin_pasword
d_array[6]=$admin_url
d_array[7]=$mem_args
echo $mem_args
$wlst_scripts $py_create_sv ${d_array[@]}
echo "完成创建$sv_name .."
}
showmenu()
{
echo '
**********************************
weblogic12c 自动安装工具
(0) 自动安装weblogic12c
(1) 创建domain
(2) 配置nodemanager
(3) 创建app server
(9) Exit
请输入执行步骤:
'
}
# 主程序部分
while
showmenu
read input
do
#statements
case $input in
0)
echo "开始自动安装"
checkDirs
createOraInst
createResponseFile
instll_wls
continue
;;
1)
echo "创建domain"
# $wlst_scripts $domain_template $domain_name $domain_dir $weblogic_password
createDomain
continue
;;
2)
echo "配置nodemanager"
configNodeManger
continue
;;
3)
echo "创建app server"
createServer
continue
;;
9)
echo "退出程序"
exit 0
;;
*)
echo "其它错误选项,请重新选择"
continue
;;
esac
done
创建domain的jython文件:
create_domain.py
import os
import time
import sys
# Create the Domain Dir
# domain_name="fr_domain"
# 传递参数 domain_name
# this file parameter IS passed for A shell ARRAY
domain_name = sys.argv[1]
domain_home = sys.argv[2]
weblogic_password= sys.argv[3]
jar_template = sys.argv[4]
host_ip=sys.argv[5] # added for set adminserver
# domain_dir= "/app/weblogic/Oracle/Middleware/Oracle_Home/user_projects/domains/"+domain_name
# 其实创建目录的时候,可以放到linux shell的部分处理
domain_dir = domain_home + domain_name
print "domain_dir: " + domain_dir
if os.path.exists(domain_dir) == False:
os.makedirs(domain_dir)
print "### Create " + domain_name + " StartTime : "
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
#=======================================================================================
# Open a domain template.
#=======================================================================================
#template_name = "/app/weblogic/Oracle/Middleware/Oracle_Home/wlserver/common/templates/wls/wls.jar"
template_name = jar_template
#template_name = "/app/weblogic/Oracle/Middleware/Oracle_Home/wlserver/common/templates/wls/wls.jar"
readTemplate(template_name)
#=======================================================================================
# Configure the Administration Server and SSL port.
#
# To enable access by both local and remote processes, you should not set the
# listen address for the server instance (that is, it should be left blank or not set).
# In this case, the server instance will determine the address of the machine and
# listen on it.
#=======================================================================================
cd('Servers/AdminServer')
set('ListenAddress','')
set('ListenPort', 7001)
# #### we do not enable SSL for AdminServer
#create('AdminServer','SSL')
#cd('SSL/AdminServer')
#set('Enabled', 'True')
#set('ListenPort', 7002)
#=======================================================================================
# Define the user password for weblogic.
#=======================================================================================
cd('/')
cd('Security/base_domain/User/weblogic')
# Please set password here before using this script, e.g. cmo.setPassword('value')
cmo.setPassword(weblogic_password)
# ====================================
# Saved Configuration
setOption('OverwriteDomain', 'true')
writeDomain(domain_dir)
closeTemplate()
# End Time
print "### Create Domain " + domain_name +" End Time:"
print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
#=======================================================================================
# Exit WLST.
#=======================================================================================
exit()
配置nodemanager:
configNodeManager.py
import sys
import time
import os
# 获取传递过来的环境变量
machine_name = sys.argv[1]
osuser = sys.argv[2]
osgroup = sys.argv[3]
admin_user=sys.argv[4]
admin_password=sys.argv[5]
admin_url=sys.argv[6]
my_domain=sys.argv[7]
host_ip=sys.argv[8]
def nmRegisterToDomain():
# connect(admin_user,admin_password,admin_url)
cd('/')
nmEnroll(my_domain,my_domain + "nodemanager")
def createMachine():
cd('/')
cmo.createUnixMachine(machine_name)
cd("/Machines/" + machine_name + "/NodeManager/" + machine_name)
cmo.setNMType('Plain')
cmo.setListenAddress('localhost')
cmo.setListenPort(5556)
cmo.setDebugEnabled(false)
#绑定machine的用户和用户组
cd("/Machines/" + machine_name)
cmo.setPostBindGIDEnabled(true)
cmo.setPostBindUID(osuser)
cmo.setPostBindGID(osgroup)
cmo.setPostBindUIDEnabled(true)
###############
# main 函数执行部分
connect(admin_user,admin_password,'t3://localhost:7001')
cd('/')
edit()
startEdit()
print my_domain
print my_domain + "nodemanager"
nmRegisterToDomain()
#启动nodemanger
# startNodeManager(my_domain + "nodemanager")
createMachine()
activate()
创建server:
createServer.py
import os
import time
import sys
#####
# 获取参数
sv_name=sys.argv[1]
machine_name=sys.argv[2]
host_ip=sys.argv[3]
port=sys.argv[4]
#mem_args=sys.argv[5]
admin_user=sys.argv[5]
admin_password=sys.argv[6]
admin_url=sys.argv[7]
minHeapSize=sys.argv[8]
maxHeapSize=sys.argv[9]
maxHeapPermSize=sys.argv[10]
print "port: " + port
print "admin_user: :" + admin_user
print "admin_password: :" + admin_password
print "admin_url: :" + admin_url
def createServer():
cd('/')
cmo.createServer(sv_name)
cd("/Servers/" + sv_name)
cmo.setListenAddress(host_ip)
cmo.setListenPort(int(port))
cmo.setListenPortEnabled(true)
cmo.setClientCertProxyEnabled(false)
cmo.setJavaCompiler('javac')
cmo.setMachine(getMBean("/Machines/" + machine_name))
cmo.setCluster(None)
cd("/Servers/"+ sv_name + "/SSL/" + sv_name)
cmo.setEnabled(false)
# cd('/Servers/server1/ServerDiagnosticConfig/server1')
# cmo.setWLDFDiagnosticVolume('Low')
cd("/Servers/" + sv_name + "/ServerStart/" + sv_name)
#cmo.setClassPath('-Xms4096m -Xmx4096m -XX:MaxPermSize=256M')
cmo.setClassPath(maxHeapPermSize + " " + maxHeapSize + " " + maxHeapPermSize)
connect(admin_user,admin_password,admin_url)
cd('/')
edit()
startEdit()
createServer()
save()
activate()