Linux环境一键自动化安装oracle软件的构想(附shell脚本)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux环境一键自动化安装oracle软件的构想(附shell脚本)相关的知识,希望对你有一定的参考价值。

一、自动化批量安装ORACLE软件的构想
1、1构想从哪里来?
熟悉PXE+KICKSTART一键批量安装Liunx操作系统的童鞋都知道,该方式可实现快速定制,规范化,自动化的无人值守安装。基于此方式,安装oracle软件也可通过类似方式实现。
1、2为什么要自动化安装oracle软件
? 可实现自动化,批量化,省时省力快速安装(如一次性安装10个oracle客户端)。
? 使安装软件更加标准化,规范化(如UID,GID,安装目录等保持一致,便与管理)。
? oracle安装介质同一存放,易于管理和维护。
二、自动化批量安装ORACLE软件的架构
2、1自动化批量安装oracle软件的大致架构
基本实现思路是:搭建软件资源库,提供HTTP或FTP服务,并提供YUM服务,然后下发安装oracle软件所需要的文件,所需安装软件的服务器作为客户端,接收文件,通过shell脚本实现自动化配置安装的成所需的数据库环境。

技术分享图片

 

2、2搭建软件资源库服务
这里通过tomcat搭建一个WEB站点,提供HTTP的服务(过程略,通过apache、vsftp等也是可以实现相同功能的),搭建后的效果如下:

技术分享图片

2、3制作响应RESPONSE文件模板

技术分享图片

 

三、实现自动化静默安装的SHELL脚本(LINUX平台)


(脚本还存在还得需要调整的地方,希望有兴趣的朋友一起继续完成,这里先将我个思路分享出来,有兴趣的童鞋,欢迎一起研究,或者有好的方法一起改写)


3、1静默安装oracle软件shell主体(install_oracle_main.sh)

#!/bin/sh -
#!/usr/bin/sh
#--------------------------------------------------------------------------------
# Install softeare -- Install oracle 11g database software
#
# History: 2018/01/14 zhuwei First release
#--------------------------------------------------------------------------------

# set a safe path before doing anything else
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH

# This script must be executed as root
RUID=`/usr/bin/id|awk -F\( '{print $1}'|awk -F\= '{print $2}'`

if [ ${RUID} != "0" ] ; then
    echo "This script must be executed as root"
    exit 1
fi

# Display a usage message and exit
usage() {
    cat >&2 <<EOF
Usage:
    ./install_oracle_main.sh  [options]

options:
    --client: version[11.2.0.3|11.2.0.4]
    --db: type[rac|signle] version[11.2.0.3|11.2.0.4]

examples:
    ./install_oracle_main.sh client
 ./install_oracle_main.sh db rac 11.2.0.4
 ./install_oracle_main.sh db signle 11.2.0.4
 
EOF
    exit 1
}

# Retrieve name of the platform
PLATFORM=`uname`
PWD=`pwd`
WEBSITE="http://172.16.1.20/zwdir"
NUM_OF_NODES=3
NODE1="node1"
NODE2="node2"
NODE3="node3"
PASSWD="Rootpasswd"

if [ ${PLATFORM} = "HP-UX" ] ; then
    echo "This script does not support HP-UX platform for the time being"
elif [ ${PLATFORM} = "SunOS" ] ; then
    echo "This script does not support SunOS platform for the time being"
elif [ ${PLATFORM} = "AIX" ] ; then
    echo "This script does not support AIX platform for the time being"
elif [ ${PLATFORM} = "Linux" ] ; then
    TYPE1=$1
    TYPE2=$2
    VERSION=$3
    case ${TYPE1} in
    db|DB)
        case ${TYPE2} in
        rac|RAC)
            case ${VERSION} in
                11.2.0.3|11.2.0.4|12.1.0.2)
     sh ${PWD}/install_rpm.sh
                    sh ${PWD}/install_configure.sh ${TYPE2}
              sh ${PWD}/create_user.sh ${TYPE2} ${PASSWD}
     #以下两个脚本暂未完全调整好
           sh ${PWD}/ssh_setup.sh ${NUM_OF_NODES} ${NODE1} ${NODE2} ${PASSWD}
     sh ${PWD}/silent_install.sh ${TYPE2} ${VERSION}
     ;;
          *)
     usage
           ;;
             esac
   ;;
        signle|SIGNLE)
      case ${VERSION} in
                11.2.0.3|11.2.0.4|12.1.0.2)
        sh ${PWD}/install_rpm.sh
                    sh ${PWD}/install_configure.sh ${TYPE2}
     #以下两个脚本暂未完全调整好
              sh ${PWD}/create_user.sh ${TYPE2} ${PASSWD}
     sh ${PWD}/silent_install.sh ${TYPE2} ${VERSION}
     ;;
          *)
     usage
           ;;
             esac
   ;;
        *)
   usage
   ;;
     esac
  ;;
    client|CLIENT) #暂未将安装客户端的脚本考虑进来
     sh ${PWD}/install_rpm.sh
        sh ${PWD}/install_configure.sh
  sh ${PWD}/create_user.sh
  sh ${PWD}/silent_install.sh ${TYPE2} ${VERSION}
  ;;
    *)
  usage
        ;;
    esac
fi


3、2RPM包安装及配置(install_rpm.sh)

#!/bin/sh -
#!/usr/bin/sh
#-----------------------------------------------------------------------------------------------
# Install softeare -- Install oracle 11g database software
#
# History: 2018/01/14 zhuwei First release
#-----------------------------------------------------------------------------------------------

# set a safe path before doing anything else
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH

# This script must be executed as root
RUID=`/usr/bin/id|awk -F\( '{print $1}'|awk -F\= '{print $2}'`

if [ ${RUID} != "0" ] ; then
    echo "This script must be executed as root"
    exit 1
fi

# Display an error and exit
errorExit() {
    echo "[email protected]" >&2
    exit 1
}

# Display the normal print
displayheader() {
    echo -e "\033[32m********************************************************************\033[0m"
    echo -e "\033[32m*\033[0m"[email protected]""
    echo -e "\033[32m********************************************************************\033[0m"
    echo ""
}

# Detect and install oracle rpm package you need

if [ -e "/etc/oracle-release" ] ; then
    VERSION1=`sed -n '1p' /etc/issue|awk 'BEGIN{OFS=""} {print $1,$2,$7}'`
    VERSION2=`sed -n '1p' /etc/issue|awk 'BEGIN{OFS=""} {print $1,$2,$7}'|awk -F. '{print $1}'`
elif [ -e "/etc/redhat-release" ] ; then
    VERSION1=`sed -n '1p' /etc/issue|awk 'BEGIN{OFS=""} {print $1,$2,$7}'`
    VERSION2=`sed -n '1p' /etc/issue|awk 'BEGIN{OFS=""} {print $1,$2,$7}'|awk -F. '{print $1}'`
elif [ -e "/etc/SuSE-release" ] ; then
    VERSION1=`sed  '/^$/d' /etc/issue|awk 'BEGIN{OFS=""} {print $3,$7,$8}'`
    VERSION2=`sed  '/^$/d' /etc/issue|awk 'BEGIN{OFS=""} {print $3,$7}'`
elif [ -e "/etc/centos-release" ] ; then
    VERSION1=`sed -n '1p' /etc/issue|awk 'BEGIN{OFS=""} {print $1,$2,$7}'`
    VERSION2=`sed -n '1p' /etc/issue|awk 'BEGIN{OFS=""} {print $1,$2,$7}'|awk -F. '{print $1}'`
fi


#VALUE=`/usr/bin/getconf LONG_BIT`
OSDIGIT=`/bin/uname -m`
YUM=`which yum`
P_YUM="/etc/yum.repos.d/"

#-----------------------------------------------------------------------------------------------
# Download yum client configure file
if [ -d $P_YUM ] ; then
   mv $P_YUM /etc/yum.repos.d.bak
   mkdir -p $P_YUM
fi
/usr/bin/wget -N -q -P $P_YUM $1/rhelrepo/$VERSION2.repo \
|| errorExit 'Failed to download the yum client files,Please manually configure!'
/bin/sed -i 's/RedHat/'$VERSION1\_$OSDIGIT'/g' $P_YUM$VERSION2.repo \
|| errorExit 'Replace the files is not successful,Please manually configure!'
if [ -f $P_YUM$VERSION2.repo ]; then
    displayheader "Successfully configured yum client, please continue"
fi

#-----------------------------------------------------------------------------------------------
# RedHat 5 and RedHat 6 install oracle software required RPM package
#-----------------------------------------------------------------------------------------------
#Red Hat Enterprise Linux 5:The following packages (or later versions) must be installed:
Red5=(binutils-2* compat-libstdc++-33* elfutils-libelf-0.* elfutils-libelf-devel-0.* \
elfutils-libelf-devel-static-0.* gcc-4.* gcc-c++-4*  glibc-2.* glibc-common-2.* glibc-devel-2.* \
glibc-headers-2* kernel-headers-2.* libaio-0.* libaio-devel-0.* libgcc-4.* libgomp-4.* \
libstdc++-4.* libstdc++-devel-* make-* numactl-devel-* sysstat-* pdksh-* ksh-* \
unixODBC-* unixODBC-devel-*)

#Red Hat Enterprise Linux 6:The following packages (or later versions) must be installed:
Red6=(binutils-2* compat-libstdc++-33* elfutils-libelf-0.* elfutils-libelf-devel-0.* \
gcc-4.* gcc-c++-4* glibc-2.* glibc-common-2.* glibc-devel-2.* glibc-headers-2* \
kernel-headers-2.* libaio-0.* libaio-devel-0.* libgcc-4.* libgomp-4.* libstdc++-4.* \
libstdc++-devel-* make-* numactl-devel-* sysstat-* ksh-* unixODBC-* unixODBC-devel-*)

#Red Hat Enterprise Linux 7:The following packages (or later versions) must be installed:
Red7=(binutils-2* compat-libstdc++-33* elfutils-libelf-0.* elfutils-libelf-devel-0.* \
gcc-4.* gcc-c++-4* glibc-2.* glibc-common-2.* glibc-devel-2.* glibc-headers-2* \
kernel-headers-2.* libaio-0.* libaio-devel-0.* libgcc-4.* libgomp-4.* libstdc++-4.* \
libstdc++-devel-* make-* numactl-devel-* sysstat-* ksh-* unixODBC-* unixODBC-devel-*)

#SUSE 11 packages: The following packages (or later versions) must be installed:
Suse11=(binutils-2.* gcc-4.* gcc-c++-4.* glibc-2.9* glibc-devel-2.9* ksh-* libstdc++33-* \
libstdc++43-* libstdc++43-devel-* libaio-* libaio-devel-* libgcc43-* libstdc++-devel-* \
make-* sysstat-*)

rlen5=${#Red5[@]}
rlen6=${#Red6[@]}
rlen7=${#Red7[@]}
slen11=${#Suse11[@]}

COUNT=0

#-----------------------------------------------------------------------------------------------
# Test your system has been installed the RPM package
displayheader "You have installed the required RPM package is as follows:"
if [ $VERSION2 == "RedHat5" or  $VERSION2 == "Centos5" or  $VERSION2 == "Oracle5" ] ; then
for((i=0;i<rlen5;i++));
do
        CHAR=${Red5[$i]}
        rpm -qa | grep "^$CHAR"
        if [ $? != 0 ] ; then
                UNINSTALL[$COUNT]=${Red5[$i]}
                COUNT=$(($COUNT+1))
        fi
done
fi

if [ $VERSION2 == "RedHat6" or $VERSION2 == "Centos6" or $VERSION2 == "Oracle6" ] ; then
for((i=0;i<len6;i++));
do
        CHAR=${Red6[$i]}
        rpm -qa | grep "^$CHAR"
        if [ $? != 0 ] ; then
                UNINSTALL[$COUNT]=${Red6[$i]}
                COUNT=$(($COUNT+1))
        fi
done
fi

if [ $VERSION2 == "RedHat7" or $VERSION2 == "Centos7" or $VERSION2 == "Oracle7" ] ; then
for((i=0;i<len7;i++));
do
        CHAR=${Red7[$i]}
        rpm -qa | grep "^$CHAR"
        if [ $? != 0 ] ; then
                UNINSTALL[$COUNT]=${Red7[$i]}
                COUNT=$(($COUNT+1))
        fi
done
fi

if [ $VERSION2 == "SUSE11" ] ; then
for((i=0;i<slen11;i++));
do
        CHAR=${Suse11[$i]}
        rpm -qa | grep "^$CHAR"
        if [ $? != 0 ] ; then
                UNINSTALL[$COUNT]=${Suse11[$i]}
                COUNT=$(($COUNT+1))
        fi
done
fi

printf '\n'

#-----------------------------------------------------------------------------------------------
# Will not install the RPM packages for installation
if [ $COUNT -gt "0" ];then
     displayheader "Do you have "$COUNT" rpm package not installed,not installed patch is:"
     len=${#UNINSTALL[@]}
     for((j=0;j<len;j++));
     do
         echo "${UNINSTALL[$j]}"
     done
     printf '\n'
     #read -p  "Are you sure to install the patch[yes or y]:" SELECT
     #printf '\n'
     if [ $SELECT == "yes" -o $SELECT == "y" ]; then
         for((l=0;l<len;l++));
         do
             VAR=${UNINSTALL[$l]}
    #         if [ $VAR == "pdksh-5.2.14-36.el5.x86_64.rpm" ]; then
    #            rpm -qa ksh-*
    #            if [ $? == 0 ]; then
    #              yum -q -y remove ksh-* >/dev/null 2 > &1
    #            fi
    #         fi
             yum -q -y install $VAR  >/dev/null 2 > &1
         done
     fi
else
    displayheader "Required RPM packages have been installed"
fi


3、3系统配置及yum服务配置(install_configure.sh)


#!/bin/sh -
#!/usr/bin/sh
#--------------------------------------------------------------------------------
# Install softeare -- Install oracle 11g database software
#
# History: 2018/01/14 zhuwei First release
#--------------------------------------------------------------------------------

# set a safe path before doing anything else
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH

# This script must be executed as root
RUID=`/usr/bin/id|awk -F\( '{print $1}'|awk -F\= '{print $2}'`

if [ ${RUID} != "0" ] ; then
    echo "This script must be executed as root"
    exit 1
fi

# Display an error and exit
errorExit() {
    echo "[email protected]" >&2
    exit 1
}

# Display the normal print
displayheader() {
    echo -e "\033[32m**********************************************************\033[0m"
    echo -e "\033[32m*\033[0m"[email protected]""
    echo -e "\033[32m**********************************************************\033[0m"
    echo ""
}

prepareSystem(){
# Set SElinux to disabled mode regardless of its initial value
  sed -i -e 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  setenforce 0
# stop iptables
  /etc/init.d/iptables stop > /dev/null 2>&1
# *** Chkconfig section
# Turn off unwanted services
  chkconfig --level 0123456 iptables off
  chkconfig --level 0123456 ip6tables off
}

#Configure the kernel params
Configure1(){
    cat >> /etc/sysctl.conf <<EOF
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF
    if [ $? != 0 ]; then
        errorExit 'Unable to configure sysctl settings for database'
    fi

 return 0
}

Configure_signle(){
    cat >> /etc/security/limits.conf <<EOF
oracle   soft  nproc   2047
oracle   hard  nproc   16384
oracle   soft  nofile  1024
oracle   hard  nofile  65536
EOF
   if [ $? != 0 ]; then
        errorExit 'Unable to configure settings for database'
   fi
  
   return 0
}

Configure_rac(){
    cat >> /etc/security/limits.conf <<EOF
oracle   soft  nproc   2047
oracle   hard  nproc   16384
oracle   soft  nofile  1024
oracle   hard  nofile  65536
grid   soft  nproc   2047
grid   hard  nproc   16384
grid   soft  nofile  1024
grid   hard  nofile  65536
EOF
   if [ $? != 0 ]; then
        errorExit 'Unable to configure settings for database'
   fi
  
   return 0
}

Configure3(){
    cat >> /etc/pam.d/login <<EOF
session    required     pam_limits.so
EOF
   if [ $? != 0 ]; then
        errorExit 'Unable to configure settings for database'
   fi
  
   return 0
}

if [ $1 == "rac" ] || [ $1 == "RAC" ] ; then
  prepareSystem Configure1 && Configure_rac && Configure3 || errorExit ""
  if [ -f /etc/ntp.conf ]; then
    mv /etc/ntp.conf /etc/ntp.conf.bak
   /etc/init.d/ntpd stop > /dev/null 2>&1
    chkconfig --level 0123456 ntpd off
  fi
elif [ $1 == "signle" ] || [ $1 == "SIGNLE" ] ; then
  prepareSystem Configure1 && Configure_signle && Configure3 || errorExit ""
fi


3、4软件安装用户建立及用户环境配置(create_user.sh)

#!/bin/sh -
#!/usr/bin/sh
#-----------------------------------------------------------------------------------------------
# Install softeare -- Install oracle 11g database software
#
# History: 2018/01/14 zhuwei First release
#-----------------------------------------------------------------------------------------------

# set a safe path before doing anything else
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH

# This script must be executed as root
RUID=`/usr/bin/id|awk -F\( '{print $1}'|awk -F\= '{print $2}'`

if [ ${RUID} != "0" ] ; then
    echo "This script must be executed as root"
    exit 1
fi

upassword=$2

# Display an error and exit
errorExit() {
    echo "[email protected]" >&2
    exit 1
}

# Display the normal print
displayheader() {
    echo -e "\033[32m********************************************************************\033[0m"
    echo -e "\033[32m*\033[0m"[email protected]""
    echo -e "\033[32m********************************************************************\033[0m"
    echo ""
}
#-----------------------------------------------------------------------------------------------
CheckPath(){
    if [ ! -n "$path" ]; then
       printf "\n\tYou input is invalid!\n"
       GetPath $1
    fi
    if [ ! -d "$path" ]; then
    mkdir -p $path
    pathsize=`df "$path"|sed '1d' |awk '{print $4}'`
       if [ $pathsize -lt 31457820 ] ; then
       printf "The path -ge 30gb will be created! \n"
    rm -rf $path
          GetPath $1
       else 
          return 0
       fi
    else
    #path=`echo "$path"|awk -F "/" '{print $NF}'`
 pathsize=`df "$path"|sed '1d' |awk '{print $4}'`
       if [ $pathsize -lt 31457820 ] ; then
          GetPath $1
       else
          return 0
       fi
 fi
}

AuzPath(){
    if [ $i == "oracle_base" ] ; then
   chown -R oracle:oinstall $path
   chmod -R 775 `dirname $path`
 elif [ $i == "grid_base" ] ; then
   chown -R grid:oinstall $path
   chmod -R 775 `dirname $path`
 elif [ $i == "grid_home" ] ; then
   chown -R root:oinstall `dirname $path`
   chmod -R 775 `dirname $path`
 fi
}

GetPath(){
  paths=(oracle_base grid_base grid_home)
  printf '\nplease input the path of '${paths[0]}':'
  read install_path
  path=$install_path
  if CheckPath $path
  then
    i=${paths[0]}
    AuzPath $i $path
  fi
  obase=`grep -w "ORACLE_BASE=" /home/oracle/.bash_profile |awk -F"=" '{print $2}'`
  sed -i "s#${obase}#$path#" /home/oracle/.bash_profile
  if [ $1 == "rac" ] || [ $1 == "RAC" ] ; then
    printf '\nplease input the path of '${paths[1]}':'
    read install_path
    path=$install_path
    if CheckPath $path
    then
    i=${paths[1]}
       AuzPath $i $path
    fi
 gbase=`grep -w "ORACLE_BASE=" /home/grid/.bash_profile |awk -F"=" '{print $2}'`
 sed -i "s#${gbase}#$path#" /home/grid/.bash_profile
 printf '\nplease input the path of '${paths[2]}':'
    read install_path
    path=$install_path
    if CheckPath $path
    then
   i=${paths[2]}
      AuzPath $i $path
    fi
 ghome=`grep -w "ORACLE_HOME=" /home/grid/.bash_profile |awk -F"=" '{print $2}'`
 sed -i "#${ghome}#$path#" /home/grid/.bash_profile
  fi
}

#-----------------------------------------------------------------------------------------------
#Configure the oracle user's environment
profile(){
    cat > /home/${user[j]}/.bash_profile <<EOF
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
 . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
export TMP=/tmp
export TMPDIR=\$TMP
export ORACLE_SID=test
export ORACLE_BASE=/u/app/oracle
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db_1
export TNS_ADMIN=\$ORACLE_HOME/network/admin
export ORACLE_TERM=xterm
export PATH=/usr/sbin:\$PATH
export PATH=\$ORACLE_HOME/bin:\$PATH
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib:\$ORACLE_HOME/jdbc/lib
export CLASSPATH=\$ORACLE_HOME/JRE:\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
export NLS_LANG="AMERICAN_AMERICA.ZHT16BIG5"
export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'
umask 022
if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi
EOF
    if [ $? != 0 ]; then
       errorExit 'bash_profile this file does not exist'
 fi
 
 return 0
}
#-----------------------------------------------------------------------------------------------
#In the table below for the list of users and user groups
#
#   User Name          User ID
#   ---------          -------
#   oracle             601
#   grid               602
#
#   Group Name         Group ID
#   ---------          -------
#   oinstall           601
#   dba                602
#   asmadmin           603
#   asmdba             604
#   oper               605
#   asmoper            606
#Add Users and Groups
adduser_rac(){
  group=(oinstall dba asmadmin asmdba oper asmoper)
  user=(oracle grid)
  groups=`echo ${group[@]:1:4}|tr " " ","`
  for((i=0;i<${#group[@]};i++));
  do
    groupexit=`grep -w ${group[i]} /etc/group | awk -F: '{print $1}'`
 if [ -z ${groupexit} ]; then
   groupadd -g `expr 600 + $i + 1` ${group[i]} || errorExit ""
 else
   groupmod -g `expr 600 + $i + 1` ${group[i]} || errorExit ""
 fi
  done
  for((j=0;j<${#user[@]};j++));
  do
    userexit=`grep -w ${user[j]} /etc/shadow | awk -F: '{print $1}'`
 if [ -z ${userexit} ]; then
   useradd -d /home/${user[j]} -u `expr 600 + $j + 1` -g ${group[0]} \
   -G ${groups} ${user[j]} && echo ${user[j]}:${upassword}|chpasswd \
   && profile ${user[j]} || errorExit ""
 else
   usermod -u `expr 600 + $j + 1` ${user[j]} && echo ${user[j]}:${upassword}|chpasswd \
   && profile ${user[j]} || errorExit ""
 fi
  done
}

adduser_sigle(){
  group=(oinstall dba)
  for((i=0;i<${#group[@]};i++));
  do
    groupexit=`grep -w ${group[i]} /etc/group | awk -F: '{print $1}'`
 if [ -z ${groupexit} ]; then
   groupadd -g `expr 600 + $i + 1` ${group[i]} || errorExit ""
 else
   groupmod -g `expr 600 + $i + 1` ${group[i]} || errorExit ""
 fi
  done
  userexit=`grep -w oracle /etc/shadow | awk -F: '{print $1}'`
  if [ -z ${userexit} ]; then
 useradd -d /home/oracle -u `expr 600 + $j + 1` -g oinstall \
 -G oracle && echo oracle:${upassword}|chpasswd && profile ${user[j]} || errorExit ""
  else
 usermod -u `expr 600 + $j + 1` oracle && echo oracle:${upassword}|chpasswd \
 && profile ${user[j]} || errorExit ""
  fi 
}
#-----------------------------------------------------------------------------------------------
if [ $1 == "rac" ] || [ $1 == "RAC" ] ; then
  adduser_rac $upassword && GetPath $1 || errorExit ""
elif [ $1 == "signle" ] || [ $1 == "SIGNLE" ] ; then
  adduser_sigle $upassword && GetPath $1 || errorExit ""
fi


3、5 RAC安装的SSH等效配置(sshUserSetup.sh)

#!/bin/bash

#--------------------------------------------------------------------------------------
#这里本来是想着调用oracle安装包里面的sshUserSetup.sh进行SSH配置的,发现存在问题
#echo $USER | tr " " "\n"| while read LINE
#do
# EXPECT <<EOF
# spawn sh ./sshUserSetup.sh -user $LINE -hosts $NODES -verify -advanced
#        expect {
#        "yes/no" { send "yes\r";exp_continue }
#  "yes' or 'no" { send "yes\r";exp_continue }
#        "password:"{send "$PASSWORD\r";exp_continue }
#              }
# EXPECT eof
#EOF
#done
#---------------------------------------------------------------------------------------

NUM_OF_NODES=$1
NODE1=$2
NODE2=$3
NODE3=$4
LINE="root oracle grid"
EXPECT=/usr/bin/expect
PASSWD=$5
#USER_PROMPT="*$ "
USER_PROMPT="*# "

#以下脚本还未进行大批量的测试,有兴趣的童鞋欢迎一起研究
echo $LINE | tr " " "\n"| while read USER
do
if [ "x${NODE1}" == "x" -o "x${USER}" == "x" -o "x${PASSWD}" == "x" ]; then

echo ""

echo "Please set the NODE INFO, USER and PASSWD"

echo "then $0 to start..."

exit 1

fi

declare -i l_i=1

while [ $l_i -le $NUM_OF_NODES ]

do

eval l_current_node=\$NODE$l_i

$EXPECT <<EOF

spawn ssh [email protected]$l_current_node

expect "*(yes/no)?*" {

send -- "yes\r"

expect "*?assword:*"

send -- "$PASSWD\r"

} "*?assword:*" {send -- "$PASSWD\r"}

expect "$USER_PROMPT"

send -- "ssh-keygen -t rsa -q -f ~/.ssh/id_rsa -P '' \r"

expect "*Overwrite (yes/no)? " {

send -- "yes\r"

} "$USER_PROMPT" {send -- "\r"}

expect "$USER_PROMPT"

send -- "cat ~/.ssh/id_rsa.pub | ssh [email protected]$NODE1 'cat - >> ~/.ssh/authorized_keys' \r"

expect "*(yes/no)?*" {

send -- "yes\r"

expect "*?assword:*"

send -- "$PASSWD\r"

} "*?assword:*" {send -- "$PASSWD\r"}

expect "$USER_PROMPT"

send -- "exit\r"

EOF

((l_i++))

done

declare -i l_n=1

while [ $l_n -le $NUM_OF_NODES ]

do

eval l_current_node=\$NODE$l_n

$EXPECT <<EOF

spawn ssh [email protected]$NODE1

expect "*?assword:*" {

send -- "$PASSWD\r"

expect "$USER_PROMPT"

} "$USER_PROMPT" {send -- "scp ~/.ssh/authorized_keys $l_current_node:~/.ssh/ \r"}

expect "*?assword:*"

send -- "$PASSWD\r"

expect "$USER_PROMPT"

send -- "exit\r"

EOF

((l_n++))

done
done


3、6安装介质下载并执行静默安装(silent_install.sh)

#!/bin/sh -
#!/usr/bin/sh
#-----------------------------------------------------------------------------------------------
# Install softeare -- Install oracle 11g database software
#
# History: 2018/01/14 zhuwei First release
#-----------------------------------------------------------------------------------------------
#暂时未调整好如下的脚本
# set a safe path before doing anything else
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH

# This script must be executed as root
RUID=`/usr/bin/id|awk -F\( '{print $1}'|awk -F\= '{print $2}'`

if [ ${RUID} != "0" ] ; then
    echo "This script must be executed as root"
    exit 1
fi

WEBSITE=$1
HOSTNAME=`hostname`
PATH1="/u/database/response"
ORACLE_BASE=`grep -w "ORACLE_BASE=" /home/oracle/.bash_profile |awk -F"=" '{print $2}'`
GRID_BASE=`grep -w "ORACLE_BASE=" /home/grid/.bash_profile |awk -F"=" '{print $2}'`
GRID_HOME=`grep -w "ORACLE_HOME=" /home/grid/.bash_profile |awk -F"=" '{print $2}'`

#-----------------------------------------------------------------------------------------------
#Configure the oracle silent installation files
#暂时未调整好如下的脚本
silent_oracle(){
 ORACLE_BASE="\/u\/app\/oracle"
 ORACLE_HOME=${ORACLE_BASE}"\/product\/11\.2\.0\/db_1"
 A1="ORACLE_HOSTNAME\="
 A2="INVENTORY_LOCATION\="
 A3="ORACLE_HOME\="
 A4="ORACLE_BASE\="
 B1=${A1}${HOSTNAME}
 B2=${A2}${ORACLE_BASE}"\/oraInventory"
 B3=${A3}${ORACLE_HOME}
 B4=${A4}${ORACLE_BASE}
 mv -f $PATH1/db_install.rsp $PATH1/db_install.rsp.bak
 wget -N -q -P  $PATH1 $WEBSITE/oracle11g/db_install.rsp
 sed -i -e "s/${A1}/${B1}/g" -e "s/${A2}/${B2}/g" -e "s/${A3}/${B3}/g" \
 -e "s/${A4}/${B4}/g" $PATH1/db_install.rsp || errorExit "The configuration file failed!"
}
#暂时未调整好如下的脚本
silent_grid(){
 ORACLE_BASE="\/u\/app\/oracle"
 ORACLE_HOME=${ORACLE_BASE}"\/product\/11\.2\.0\/db_1"
 A1="ORACLE_HOSTNAME\="
 A2="INVENTORY_LOCATION\="
 A3="ORACLE_HOME\="
 A4="ORACLE_BASE\="
 B1=${A1}${HOSTNAME}
 B2=${A2}${ORACLE_BASE}"\/oraInventory"
 B3=${A3}${ORACLE_HOME}
 B4=${A4}${ORACLE_BASE}
 mv -f $PATH1/db_install.rsp $PATH1/db_install.rsp.bak
 wget -N -q -P  $PATH1 $WEBSITE/oracle11g/db_install.rsp
 sed -i -e "s/${A1}/${B1}/g" -e "s/${A2}/${B2}/g" -e "s/${A3}/${B3}/g" \
 -e "s/${A4}/${B4}/g" $PATH1/db_install.rsp || errorExit "The configuration file failed!"
}

#download oracle software
download(){

    wget -N -q -P $ORACLE_BASE  $WEBSITE/$2/p*_[1-3]of7.zip
 
    unzip -q -d $ORACLE_BASE $ORACLE_BASE/p*_1of7.zip
    unzip -q -d $ORACLE_BASE $ORACLE_BASE/p*_2of7.zip
 unzip -q -d $ORACLE_BASE $ORACLE_BASE/p*_3of7.zip
 
    rm -rf /u/p*_[1-3]of7.zip
 
    chown -R oracle:oinstall $ORACLE_BASE/database
}
#暂时未调整好如下的脚本
if [ $1 == "rac" ] || [ $1 == "RAC" ] ; then
  chmod a+x ${PATH1}/db_install.rsp
  chown oracle:oinstall ${PATH1}/db_install.rsp
  su - oracle -c "/u/database/./runInstaller -silent -force -responseFile \
  ${PATH1}/db_install.rsp -ignoreSysPrereqs" >>/dev/null
elif [ $1 == "signle" ] || [ $1 == "SIGNLE" ] ; then
  chmod a+x ${PATH1}/db_install.rsp
  chown oracle:oinstall ${PATH1}/db_install.rsp
  su - oracle -c "/u/database/./runInstaller -silent -force -responseFile \
  ${PATH1}/db_install.rsp -ignoreSysPrereqs" >>/dev/null
fi


3、7 配置脚本执行用法

技术分享图片

因脚本化,需要考虑的问题还有很多,所以还有很多细节需要调整,脚本目前只给出的框架,有兴趣的童鞋,欢迎一起研究,或者有好的方法一起改写。


四、克隆安装ORACLE软件实现补丁一同安装
4、1 克隆安装ORACLE的可行性
通过上面的安装过程,细心的你一定发现,只是安装了oracle软件,而相应要打的PSU并没有打上,有没办法安装和打补丁一起呢?有,那就是克隆。为了保证克隆安装后,不出现问题,首先要保证tar包的准确性,这种安装方式用于生产环境是有一定风险的,但对于开发环境和测试环境,我觉得是可行的。
4、2 克隆安装ORACLE的大概步骤
?系统环境准备,ip、/etc/hosts等这些配置,之后再执行其它环境配置的脚本
?克隆安装oracle软件shell主体(install_oracle_main.sh)
?系统配置及tar安装介质下载(install_configure.sh)
?RPM包安装及配置(install_rpm.sh)
?软件安装用户建立及用户环境配置(create_user.sh)
?RAC安装的SSH等效配置(ssh_setup.sh)
?进行克隆安装,这里考虑的地方还是蛮多的,难点也在于ASM的克隆,若是RAC,OCR的注册这些。用户的uid、gid是否一致,需要安装的oracle home目录是否一致等。
五、延伸扩展(定制ORACLE安装的ISO镜像文件)
熟悉操作系统安装和ORACLE的童鞋都知道,我们在Linux环境安装ORACLE的时候都知道,很多服务都是用 不到的,比如bluetooth蓝牙、cups打印服务这些都是不需要的,像这类服务如果在安装操作系统的时候多安装了,并开启了肯定是会占用一定的资源的。这里有个构想,使用UltraISO直接制作安装ORACLE的ISO镜像,去除不必要服务RPM包,将oracle安装包”database”加入到ISO镜像中,直接在安装操作系统的同时,一同安装数据库。有兴趣的童鞋可以研究一下。

 

以上是关于Linux环境一键自动化安装oracle软件的构想(附shell脚本)的主要内容,如果未能解决你的问题,请参考以下文章

RAC:Oracle 19C 数据库一键安装

RAC:Oracle 19C 数据库一键安装

RAC:Oracle 19C 数据库一键安装

RAC:Oracle 19C 数据库一键安装

RAC:Oracle 12CR2 数据库一键安装

RAC:Oracle 12CR2 数据库一键安装