mkhacmp




#!/usr/bin/ksh93
#################################################################
#### 
#### Description: 
#### 
#### This script generates the HACMP commands necessary to
#### build/rebuild a 2 node - 1 or 2 way cascading cluster,
#### each node with one or more resource groups, each
#### resource group with one or more application servers.
#### 
#### The output of this script must be saved to a file and 
#### executed separately to actually build the HACMP cluster.
#### 
#### Assumptions:
#### 
#### This script is designed for a 2 node - 1 or 2 way 
#### cascading cluster.
#### 
#### The HACMP cluster utilities directory is:
####     /usr/es/sbin/cluster/utilities/
#### 
#### The HACMP application start/stop scripts directory is:
####     /usr/local/hascripts/
#### 
#### Resource group names and volume groups conform to the naming
#### standards defined by Mt Xia: http://www.mtxia.com/css
#### 
#### IP addresses exist for DNS names identical to the Node names.
#### IP addresses exist for boot names assigned as: nodename-boot
#### IP addresses exist for persistent names assigned as: nodename-pers
#### IP addresses exist for resource group names assigned as defined
####     by the Mt Xia naming standard: http://www.mtxia.com/css
#### 
#### The /etc/hosts file contains all IP addresses and names.
#### 
#### The /usr/es/sbin/cluster/etc/rhosts file contains the IP names for
#### the nodename and bootname of both cluster nodes.
#### 
#### The /usr/es/sbin/cluster/netmon.cf file contains the IP names for
#### the nodename and bootname of both cluster nodes.
#### 
#### The /.rhosts is configured to permit HACMP to operate correctly.
#### 
#### This script assumes an ethernet network and that all IP addresses
#### will exist in the first network discovered by the HACMP
#### network discovery, although this can be modified by the user.
#### 
#################################################################
# Define two node names representing each node of the cluster
# USER MUST EDIT THIS ARRAY TO CONTAIN DESIRED NODE NAMES
NODES=( "nodename01"
        "nodename02" )

# Service address priority
# NOT NECESSARY FOR USER TO EDIT THIS ARRAY
SAORD=( "${NODES[0]}"
        "${NODES[1]}" )

# Resource groups to configure
# USER MUST EDIT THIS ARRAY TO CONTAIN DESIRED RESOURCE GROUP NAMES
RGS=( abcapmx1 abcapmx2 abcapmx3 defapmx1 defapmx2 )

# Define the Node priority for each resource group listed in the RGS array
# USER MUST EDIT THIS ARRAY TO CONTAIN DESIRED NODE PRIORITY 
# FOR EACH RESOURCE GROUP NAME, HIGHEST PRIORITY NODE FIRST
RGORD=( "${NODES[0]} ${NODES[1]}"
        "${NODES[0]} ${NODES[1]}"
        "${NODES[0]} ${NODES[1]}"
        "${NODES[1]} ${NODES[0]}"
        "${NODES[1]} ${NODES[0]}" )

# Define the application servers for each resource group listed 
# in the RGS array.  One or more application servers may be specified.
# USER MUST EDIT THIS ARRAY TO CONTAIN DESIRED APPLICATION SERVER NAMES
# FOR EACH RESOURCE GROUP
APPLS=( "${RGS[0]}_appl01 ${RGS[0]}_appl02"
         ${RGS[1]}_appl01
         ${RGS[2]}_appl01
         ${RGS[3]}_appl01
         ${RGS[4]}_appl01 )

# Define the volume groups for each resource group listed 
# in the RGS array.  One or more volume groups may be specified.
# USER MUST EDIT THIS ARRAY TO CONTAIN DESIRED VOLUME GROUP NAMES
# FOR EACH RESOURCE GROUP
VGS=(   "${RGS[0]}01vg ${RGS[0]}02vg"
         ${RGS[1]}01vg
         ${RGS[2]}01vg
         ${RGS[3]}01vg
         ${RGS[4]}01vg )

#################################################################
TRUE="0"
FALSE="1"
VERBOSE="${TRUE}"
DOMAIN="${DOMAIN:-.domain.com}"			# User MUST modify this value
DD_CL="${DD_CL:-/usr/es/sbin/cluster/utilities}"
DD_SS="${DD_SS:-/usr/local/hascripts}"
NETWORK="${NETWORK:-net_ether_01}"


#### NO MORE USER EDITS ARE REQUIRED OR RECOMMENDED BELOW THIS LINE

for IDX in "${!RGS[@]}"
do
  print -- "# "
  print -- "#   RGS[${IDX}] = ${RGS[${IDX}]}"
  print -- "# RGORD[${IDX}] = ${RGORD[${IDX}]}"
  print -- "# APPLS[${IDX}] = ${APPLS[${IDX}]}"
  print -- "#   VGS[${IDX}] = ${VGS[${IDX}]}"
done
print -- "# "
# print -- "DD_CL=\"\${DD_CL:-${DD_CL}}\""
# print -- "DD_SS=\"\${DD_SS:-${DD_SS}}\""
# print -- "NETWORK=\"${NETWORK:-${NETWORK}}\""
# print -- "# "
 
################################################################
COMMADDR="${NODES[@]/%(*)/\1-boot${DOMAIN}}"
print -- "#      COMMADDR = ${COMMADDR}"

# Remove any Existing Cluster:
(( VERBOSE == TRUE )) && print -- "\n# Remove existing Cluster: "
print -- "${DD_CL}/clrmclstr"

# Create Cluster:
(( VERBOSE == TRUE )) && print -- "\n# Create Cluster: ${NODES[0]}cl"
(( VERBOSE == TRUE )) && print -- "\n# Comm Paths: ${COMMADDR}"
print -- "${DD_CL}/clmodclstr -n ${NODES[0]}cl \
    -p \"${COMMADDR}\""

################################################################
# Remove/Create Service Addresses
for NODE in "${NODES[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Remove Service Addr: ${NODE}${DOMAIN}"
  print -- "${DD_CL}/clrmnode -a ${NODE}${DOMAIN}"

done

for NODE in "${NODES[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Create Service Addr: ${NODE}${DOMAIN}"
  print -- "${DD_CL}/claddnode -T service -B ${NODE}${DOMAIN} \
      -w ${NETWORK}"

done

################################################################
# Remove/Create Application Servers
for APPL in "${APPLS[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Remove Appl Server: ${APPL}"
  print -- "${DD_CL}/clrmserv ${APPL}"

done

for APPL in "${APPLS[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Create Appl Server: ${APPL}"
  print -- "${DD_CL}/claddserv -s ${APPL} \
  -b \"${DD_SS}/${APPL}_start.sh\" \
  -e \"${DD_SS}/${APPL}_stop.sh\""

done

################################################################
# Remove/Create persistant addresses
for NODE in "${NODES[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Remove Pers Addr: ${NODE}-pers${DOMAIN}"
  print -- "${DD_CL}/clrmnode -a ${NODE}-pers${DOMAIN}"

done

for NODE in "${NODES[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Create Pers Addr: ${NODE}-pers${DOMAIN}"
  print -- "${DD_CL}/claddnode -a ${NODE}-pers${DOMAIN} \
  :ether :${NETWORK} : :persistent : : -n ${NODE}"

done

################################################################
# Remove/Create resource groups to contain service addresses

for IDX in "${!NODES[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Remove Res Group: ${NODES[IDX]}"
  print -- "${DD_CL}/clrmgrp -g ${NODES[IDX]}"

  (( VERBOSE == TRUE )) && print -- "\n# Create Res Group: ${NODES[IDX]}"
  print -- "${DD_CL}/claddgrp -g ${NODES[IDX]} \
    -n "${SAORD[IDX]}" \
    -S OHN \
    -O FNPN \
    -B NFB"

done

################################################################
# Remove/Create resource groups to contain application servers and VG's

for IDX in "${!RGS[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Remove Res Group: ${RGS[IDX]}"
  print -- "${DD_CL}/clrmgrp -g ${RGS[IDX]}"

  (( VERBOSE == TRUE )) && print -- "\n# Create Res Group: ${RGS[IDX]}"
  print -- "${DD_CL}/claddgrp -g ${RGS[IDX]} \
    -n "${SAORD[IDX]}" \
    -S OHN \
    -O FNPN \
    -B NFB"

done

################################################################
# Add the Service address to the resource group

for IDX in "${!NODES[@]}"
do

  (( VERBOSE == TRUE )) && print -- "\n# Add Serv Addr: ${NODES[IDX]}"
  print -- "${DD_CL}/claddres -g \"${NODES[IDX]}\" \
  FALLBACK_AT= \
  SERVICE_LABEL=\"${NODES[IDX]}${DOMAIN}\" \
  APPLICATIONS= \
  VOLUME_GROUP= \
  FORCED_VARYON=\"false\" \
  VG_AUTO_IMPORT=\"false\" \
  FILESYSTEM= \
  FSCHECK_TOOL=\"fsck\" \
  RECOVERY_METHOD=\"sequential\" \
  FS_BEFORE_IPADDR=\"false\" \
  EXPORT_FILESYSTEM= \
  MOUNT_FILESYSTEM= \
  NFS_NETWORK= \
  SHARED_TAPE_RESOURCES= \
  DISK= \
  AIX_FAST_CONNECT_SERVICES= \
  COMMUNICATION_LINKS= \
  MISC_DATA="

done

################################################################
# Add application servers and volumes to resource groups

for IDX in "${!RGS[@]}"
do
  (( VERBOSE == TRUE )) && print -- "\n# Add Appl Server: ${RGS[IDX]}"
  print -- "${DD_CL}/claddres -g \"${RGS[IDX]}\" \
  FALLBACK_AT= \
  SERVICE_LABEL=\"${RGS[IDX]}\"  \
  APPLICATIONS=\"${APPLS[IDX]}\"  \
  VOLUME_GROUP=\"${VGS[IDX]}\" \
  FORCED_VARYON=\"false\"  \
  VG_AUTO_IMPORT=\"false\"  \
  FILESYSTEM=  \
  FSCHECK_TOOL=\"fsck\" \
  RECOVERY_METHOD=\"sequential\"  \
  FS_BEFORE_IPADDR=\"false\"  \
  EXPORT_FILESYSTEM= \
  MOUNT_FILESYSTEM=  \
  NFS_NETWORK=  \
  SHARED_TAPE_RESOURCES=  \
  DISK= \
  AIX_FAST_CONNECT_SERVICES=  \
  COMMUNICATION_LINKS=  \
  MISC_DATA="

done