[root@labaix] /root/scripts> cat create_lpar.sh
#!/usr/bin/ksh93 #@(#) Create a new LPAR # v1.1 Manu 04-2017 #set -x dir=`dirname $0` if [ -f $dir/.env ] then . $dir/.env else path_script=$dir export sn=`basename $0 | cut -d. -f1` export logname=/tmp/$sn.log # path_script=/tmp export sn=`basename $0 | cut -d. -f1` export logpath=$path_script/log export logname=$logpath/$sn.log export configfile=$path_script/$sn.cfg fi ### HMC hmclist="labhmc1" hmcuser=hscroot DEFAULT_SERVER="p810-lab" ### LPAR CLIENT_PROFIL="normal" # Name of the profile CLIENT_ENV="aixlinux" # Operating environment CLIENT_MINMEM="2048" # Minimum memory in megabyte CLIENT_DESMEM="4096" # Desired memory in megabyte CLIENT_MAXMEM="8192" # Maximum memory in megabyte CLIENT_PMODE="shared" # shared or ded CLIENT_SMODE="uncap" # cap or uncap CLIENT_SWEIGHT="128" # Value between 0 and 255 CLIENT_MINPU="0.1" # Min processing units CLIENT_DESPU="0.4" # Des processing units CLIENT_MAXPU="2.0" # Max processing units CLIENT_MINVP="1" # Min virtual CPU CLIENT_DESVP="2" # Des virtual CPU CLIENT_MAXVP="4" # Max virtual CPU CLIENT_VSLOT="20" # Number of virtual slots CLIENT_VETH='2/0/1///0,3/0/2///0' # Virtual Ethernet adapter in VLAN 1 and 2 #CLIENT_VSCSI="3/client/1//4/1" # Virtual SCSI client adapter CLIENT_VFCS1="10/client//" # Virtual FC client adapter to VIOS1 CLIENT_VFCS2="11/client//" # Virtual FC client adapter to VIOS1 CLIENT_VFCS3="12/client//" # Virtual FC client adapter to VIOS2 CLIENT_VFCS4="13/client//" # Virtual FC client adapter to VIOS2 CLIENT_START="0" # Start with manages system or not CLIENT_BOOT="norm" # Boot mode = normal CLIENT_PWR="none" # Power controlling partition CLIENT_CON="0" # Connection monitoring CLIENT_IOPOOL="none" # IOPOOL ### SAN fabric_A="labsan-blue" fabric_B="labsan-red" sanuser="admin" ### Storage svc="labsvc" svcuser="lpardeploy" #------------------------------------------------ # Rotate logs mv $logname.1 $logname.2 > /dev/null 2>&1 mv $logname $logname.1 > /dev/null 2>&1 #------------------------------------------------ get_hmc () { for hmc1 in $(echo $hmclist) do echo $hmc1 if [ $(ping -c2 $hmc1 > /dev/null 2>&1;echo $?) -eq 0 ] then hmc=$hmc1 break fi done export HMCCMD="ssh $hmcuser@$hmc" } #------------------------------------------------ get_vios () { if [ $($HMCCMD "lssyscfg -r sys -F name" | sed -e 's/^/;/' -e 's/$/;/' | grep -q ";${MACHINE};"; echo $?) -ne 0 ] then echo "ERROR: server ${MACHINE} doesn't exists" exit 1 else if [ $($HMCCMD "lssyscfg -r lpar -m ${MACHINE} -F name" | sed -e 's/^/;/' -e 's/$/;/' | grep -q ";${CLIENT_NAME};"; echo $?) -eq 0 ] then echo "Partition name ${CLIENT_NAME} already exists on server ${MACHINE}" exit 1 fi VIOS=$($HMCCMD "lssyscfg -r lpar -m ${MACHINE} -F name,lpar_id,lpar_env,state" | grep Running | grep ",vioserver," | sed 's/^/;/' | cut -d',' -f1 | sort) (( cnt = $(echo $VIOS | tr ';' '\n' | wc -l) -1 )) if [ $(echo $cnt) -gt 2 ] then echo "ERROR: more than 2 VIOS on the server ${MACHINE}" exit 1 else if [ $(echo $cnt) -lt 2 ] then echo "ERROR: one or no VIOS on the server ${MACHINE}" exit 1 else VIOS1=$(echo $VIOS | awk -F';' '{print $2}' | awk '{print $1}') VIOS2=$(echo $VIOS | awk -F';' '{print $3}' | awk '{print $1}') fi fi echo "OK: VIOS $VIOS1 and $VIOS2 on server ${MACHINE}" fi } #------------------------------------------------ get_adapterid () { #ALL_ADAP=$($HMCCMD lssyscfg -r prof -m $MACHINE -F lpar_env,virtual_fc_adapters,virtual_scsi_adapters,virtual_eth_adapters | grep "^vioserver" | tr -s ',' '\n' | cut -d'/' -f1 | sed 's/\"//' | grep -v [^0-9*] | sort -nu) ALL_ADAP=$($HMCCMD lshwres -m $MACHINE -r virtualio --rsubtype fc --level lpar | grep "adapter_type=server" | sed 's/slot_num=/\ /' | cut -d' ' -f2- | cut -d',' -f1 | grep -v [^0-9*] | sort -nu) ok=0 i=20 # Minimum adapter ID while [ "$ok" -lt "2" ] do echo $ALL_ADAP | grep -q "$i" if [ $? -eq 0 ] then ok=0 ((i = i + 1)) else ADAPTER[$ok]=$i ((i = i + 1)) ((ok = ok + 1)) fi done if [ ${#ADAPTER[@]} != "2" ] then echo "No valid slots ID found on VIOS" else echo "Valid adapter ID found: ${ADAPTER[*]}" fi } #------------------------------------------------ generate_lpar () { ADAPTER_ID1=${ADAPTER[0]} ADAPTER_ID2=${ADAPTER[1]} CLIENT_VETHP=$(echo '"virtual_eth_adapters='$CLIENT_VETH'"') CLIENT_VFCS=$(echo ${CLIENT_VFCS1}${VIOS1}'/'${ADAPTER_ID1}'//0"",""'${CLIENT_VFCS2}${VIOS1}'/'${ADAPTER_ID2}'//0"",""'${CLIENT_VFCS3}${VIOS2}'/'${ADAPTER_ID1}'//0"",""'${CLIENT_VFCS4}${VIOS2}'/'${ADAPTER_ID2}'//0') CLIENT_VFCSP=$(echo '"virtual_fc_adapters=""'$CLIENT_VFCS'"""') # LPAR creation hmc command CMD=$( cat<<EOF mksyscfg -r lpar -m $MACHINE -i 'name=$CLIENT_NAME,\ profile_name=$CLIENT_PROFIL,lpar_env=$CLIENT_ENV,min_mem=$CLIENT_MINMEM,\ desired_mem=$CLIENT_DESMEM,max_mem=$CLIENT_MAXMEM,proc_mode=$CLIENT_PMODE,\ sharing_mode=$CLIENT_SMODE,min_proc_units=$CLIENT_MINPU,\ desired_proc_units=$CLIENT_DESPU,max_proc_units=$CLIENT_MAXPU,\ min_procs=$CLIENT_MINVP,desired_procs=$CLIENT_DESVP,max_procs=$CLIENT_MAXVP,\ uncap_weight=$CLIENT_SWEIGHT,lpar_io_pool_ids=$CLIENT_IOPOOL,\ max_virtual_slots=$CLIENT_VSLOT,auto_start=$CLIENT_START,\ boot_mode=$CLIENT_BOOT,power_ctrl_lpar_ids=$CLIENT_PWR,\ allow_perf_collection=1,sync_curr_profile=1,\ conn_monitoring=$CLIENT_CON,max_virtual_slots=$CLIENT_VSLOT,\ $CLIENT_VETHP,\ $CLIENT_VFCSP' EOF ) echo $HMCCMD $CMD } #------------------------------------------------ vio_create_vfc () { CMD=$( cat<<EOF chhwres -r virtualio -m $MACHINE -o a -p $VIOS --rsubtype fc -s $ADAP -a "adapter_type=server,remote_slot_num=$SLOT,remote_lpar_name=$CLIENT_NAME" EOF ) echo $HMCCMD $CMD if [ $EXECUTE -eq 1 ] then $HMCCMD $CMD echo "Status $?" fi } #------------------------------------------------ vio_map_vfc () { # Map virtual FC to physical FC on VIOS # List physical adapter on the VIOS, only the 2 first adapters will be used OUTPUT=$($HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c "lsdev" | grep '^fcs' | awk '{print $1}') set -A padapt $OUTPUT if [ $(echo $cnt) -lt 1 ] then echo "Error, no physical adapter detected on the VIOS: $VIOS" exit 1 fi # List virtual adapters available on the VIOS, and not mapped OUTPUT=$($HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"lsmap -all -npiv\" | sed 's/FC\ name/FCname/' | egrep '^vfchost|^FCname' | awk '{print $1}' | sed 's/FCname\://' | paste -d';' - -) OUTPUT1="" for line in $(echo $OUTPUT) do end=$(echo $line | awk -F';' '{print $2}') if [ ! -n "$end" ] then OUTPUT1="$OUTPUT1 $(echo $line | awk -F';' '{print $1}')" fi done i=0 for vadapt in $(echo $OUTPUT1) do echo $HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c "vfcmap -vadapter $vadapt -fcp ${padapt[$i]}" if [ $EXECUTE -eq 1 ] then $HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"vfcmap -vadapter $vadapt -fcp ${padapt[$i]}\" echo "Status $?" fi i=$(echo "($i+1) %2" | bc) done } #------------------------------------------------ enable_fc_login () { echo $HMCCMD chnportlogin -o login -m $MACHINE -p $CLIENT_NAME -n $CLIENT_PROFIL $HMCCMD chnportlogin -o login -m $MACHINE -p $CLIENT_NAME -n $CLIENT_PROFIL echo "Status $?" } #------------------------------------------------ create_zoning () { OUTPUT=$($HMCCMD lsnportlogin -m $MACHINE --filter "profile_names=$CLIENT_PROFIL" | grep "$CLIENT_NAME" | sed 's/wwpn=/\ /' | cut -d' ' -f2 | cut -d',' -f1) wwpn=$(echo $OUTPUT | sed 's/\ /\:/g') set -A WWPN $(echo $OUTPUT | tr ' ' '\n' | sed 's/../&:/g;s/:$//' | tr 'A-Z' 'a-z' | paste -d';' - -) greplist=$(echo ${WWPN[*]} | sed -e 's/;/\|/g' -e 's/\ /\|/g') for fab in A B do echo "Fabric: $fab" sw=fabric_$fab eval switch="$"$sw OUTPUT=$(ssh $sanuser@$switch nsshow | grep ' N ' | rev | cut -d';' -f2 | rev) SVC_alias=$(ssh $sanuser@$switch configshow | grep "^zone." | egrep -v "v7|v3" | cut -d':' -f2- | tr ';' '\n' | sort -u | grep svc | tr '\n' ';') if [ "$SVC_alias" = "" ] then echo "No SVC valid port found for zoning on fabric $fabric" else echo "# SVC valid ports for host" cfg=$(ssh $sanuser@$switch configshow | grep "^enable:" | cut -d':' -f2) p=0 for alias in $(echo $OUTPUT | tr ' ' '\n' | egrep "$greplist" | sort | paste -d';' - -) do CMD1=$(echo alicreate ${client_name}_p$p,'"'$alias'"') echo $CMD1 CMD="$CMD1" CMD1=$(echo zonecreate svc_${client_name}_p$p,'"'${SVC_alias}${client_name}_p$p'"') echo $CMD1 CMD="$CMD;$CMD1" CMD1=$(echo cfgadd $cfg,svc_${client_name}_p${p}) echo $CMD1 CMD="$CMD;$CMD1" (( p = p + 1 )) done CMD1=$(echo cfgsave) echo $CMD1 CMD="$CMD;$CMD1" CMD1=$(echo cfgenable $cfg) echo $CMD1 #CMD="$CMD;$CMD1" if [ $EXECUTE -eq 1 ] then echo "ssh $sanuser@$switch $CMD" echo "yes" | ssh $sanuser@$switch $CMD if [ $? -eq 0 ] then #echo "Wating zone creation";sleep 3 #echo "yes" | ssh $sanuser@$switch cfgsave echo "Wating cfgsave";sleep 3 echo "yes" | ssh $sanuser@$switch "cfgenable $cfg" echo "Wating cfgenable";sleep 3 ssh $sanuser@$switch configshow | grep "${client_name}_" else echo "Zoning for Fabric $fab Failed" fi fi fi done } #------------------------------------------------ disable_fc_login () { echo $HMCCMD chnportlogin -o logout -m $MACHINE -p $CLIENT_NAME -n $CLIENT_PROFIL $HMCCMD chnportlogin -o logout -m $MACHINE -p $CLIENT_NAME -n $CLIENT_PROFIL echo "Status $?" } ################################## # MAIN ################################## main () { EXECUTE=1 #set -A resp $(echo $@) #echo ${resp[0]} #if [ -z "${resp[0]}" ] if [ -z "$1" ] then echo "Not enough parameters, min is 1" exit 1 fi CLIENT_NAME=$(echo $1 | sed 's/[^A-Za-z0-9_-]//g') # exclude all non valid characters client_name=$(echo $CLIENT_NAME | tr 'A-Z' 'a-z') if [ -n "$2" ] then if [ ${resp[1]} == "\-x" ] then EXECUTE=1 else # MACHINE=${resp[1]} MACHINE=$2 fi else MACHINE=${DEFAULT_SERVER} fi echo "#********* Check HMC" get_hmc echo "#********* Check Valid VIOS" get_vios echo echo "#********* Check Valid adapter ID on VIOS" get_adapterid echo "#********* Generate HMC command to create the LPAR" generate_lpar # if '-x' used if [ $EXECUTE -eq 1 ] then $HMCCMD $CMD if [ $? -eq 0 ] then echo "LPAR $CLIENT_NAME created Successful" else echo "LPAR $CLIENT_NAME NOT created" exit 1 fi else exit 1 fi echo "#********* Generate HMC command to create the VFC adapter on VIOS" # create vio vfc adapter # server 1 on vios1 VIOS=${VIOS1} SLOT=$(echo $CLIENT_VFCS1 | cut -d'/' -f1 | sed 's/\"//g') ADAP=$ADAPTER_ID1 vio_create_vfc # server 2 on vios1 SLOT=$(echo $CLIENT_VFCS2 | cut -d'/' -f1 | sed 's/\"//g') ADAP=$ADAPTER_ID2 vio_create_vfc # save vios1 profile #save_vios_profile # server 1 on vios2 VIOS=${VIOS2} SLOT=$(echo $CLIENT_VFCS3 | cut -d'/' -f1 | sed 's/\"//g') ADAP=$ADAPTER_ID1 vio_create_vfc # server 2 on vios2 SLOT=$(echo $CLIENT_VFCS4 | cut -d'/' -f1 | sed 's/\"//g') ADAP=$ADAPTER_ID2 vio_create_vfc # save vios2 profile #save_vios_profile echo "#********* Map virtual adapters to physical on the VIOS" # server 1 on vios1 VIOS=${VIOS1} vio_map_vfc # server 1 on vios2 VIOS=${VIOS2} vio_map_vfc echo "#********* Enable login on FC adapter of the LPAR" enable_fc_login echo "#********* Create zoning for the LPAR" create_zoning echo "#********* Disable login on FC adapter of the LPAR" disable_fc_login & echo "#********* Register node in SVC, and create 1 disk" echo ssh $svcuser@$svc svctask mkhost -force -hbawwpn "$wwpn" -name ${CLIENT_NAME} -type generic ssh $svcuser@$svc svctask mkhost -force -hbawwpn "$wwpn" -name ${CLIENT_NAME} -type generic echo $svcuser@$svc svctask mkvdisk -iogrp 0 -mdiskgrp LABSTWS7001 -name ${CLIENT_NAME}_ROOTVG -size 40 -syncrate 50 -unit gb ssh $svcuser@$svc svctask mkvdisk -iogrp 0 -mdiskgrp LABSTWS7001 -name ${CLIENT_NAME}_ROOTVG -size 40 -syncrate 50 -unit gb echo "#********* Wating for logout FC ports" echo '...' } main $* | tee 2>&1 $logname
Still missing remove of zoning with check …
[root@labaix] /root/scripts> cat destroy_lpar.sh
#!/usr/bin/ksh93 #@(#) Remove completely a LPAR # v1.1 Manu 04-2017 #set -x dir=`dirname $0` if [ -f $dir/.env ] then . $dir/.env else path_script=$dir export sn=`basename $0 | cut -d. -f1` export logname=/tmp/$sn.log # path_script=/tmp export sn=`basename $0 | cut -d. -f1` export logpath=$path_script/log export logname=$logpath/$sn.log export configfile=$path_script/$sn.cfg fi ### HMC hmclist="labhmc01" hmcuser=hscroot DEFAULT_SERVER="p810-lab" ### SAN fabric_A="labsan01" fabric_B="labsan02" sanuser="admin" ### Storage svc="labsvc" svcuser="admin" #------------------------------------------------ # Rotate logs mv $logname.1 $logname.2 > /dev/null 2>&1 mv $logname $logname.1 > /dev/null 2>&1 #------------------------------------------------ get_hmc () { for hmc1 in $(echo $hmclist) do echo $hmc1 if [ $(ping -c2 $hmc1 > /dev/null 2>&1;echo $?) -eq 0 ] then hmc=$hmc1 break fi done export HMCCMD="ssh $hmcuser@$hmc" } #------------------------------------------------ get_lpar () { if [ $($HMCCMD "lssyscfg -r sys -F name" | sed -e 's/^/;/' -e 's/$/;/' | grep -q ";${MACHINE};"; echo $?) -ne 0 ] then echo "ERROR: server ${MACHINE} doesn't exists" exit 1 else if [ $($HMCCMD "lssyscfg -r lpar -m ${MACHINE} -F name" | sed -e 's/^/;/' -e 's/$/;/' | grep -q ";${CLIENT_NAME};"; echo $?) -eq 0 ] then echo "Partition name ${CLIENT_NAME} exists on server ${MACHINE}" else echo "Partition name ${CLIENT_NAME} unknown on server ${MACHINE}" exit 1 fi fi if [ $($HMCCMD "lssyscfg -r lpar -m ${MACHINE} -F name,state" | grep "^${CLIENT_NAME}," | grep -q 'Not\ Activated'; echo $?) -ne 0 ] then echo "Partition name ${CLIENT_NAME} must be first Power off" exit 1 fi echo } #------------------------------------------------ delete_zoning () { for fab in A B do echo "Fabric: $fab" sw=fabric_$fab eval switch="$"$sw echo "# For fabic $fab" ssh $sanuser@$switch configshow | egrep "^zone.|^alias." | grep "${client_name}_p" done } #------------------------------------------------ get_adapterid () { OUTPUT=$($HMCCMD lssyscfg -r prof -m $MACHINE --filter lpar_names=${CLIENT_NAME} -F lpar_env,virtual_fc_adapters) for line in $(echo "$OUTPUT" | tr -s ',' '\n' | grep client | rev | cut -d'/' -f2,3 | rev) do VIOS=$(echo $line | cut -d'/' -f1) ADAPid=$(echo $line | cut -d'/' -f2) vadap=$($HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"lsmap -all -npiv\" | sed 's/\ /;/g' | grep "\-C$ADAPid;" | cut -d';' -f1) echo $HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"vfcmap -vadapter $vadap -fcp\" echo $HMCCMD chhwres -r virtualio -m $MACHINE -o r -p $VIOS --rsubtype fc -s $ADAPid if [ $EXECUTE -eq 1 ] then $HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"vfcmap -vadapter $vadap -fcp\" sleep 2 $HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"rmdev -dev $vadap\" sleep 2 $HMCCMD chhwres -r virtualio -m $MACHINE -o r -p $VIOS --rsubtype fc -s $ADAPid if [ $? -eq 0 ] then echo "Status 0" else echo "Unable to remove adapter on the VIOS, check pending processes" $HMCCMD viosvrcmd -m $MACHINE -p $VIOS -c \"ps -ef\" fi fi done } #------------------------------------------------ delete_lpar () { # LPAR delete hmc command CMD="rmsyscfg -r lpar -m $MACHINE -n $CLIENT_NAME" if [ $EXECUTE -eq 1 ] then $HMCCMD $CMD if [ $? -eq 0 ] then echo "LPAR $CLIENT_NAME deleted Successful" else echo "LPAR $CLIENT_NAME NOT deleted" fi fi } ################################## # MAIN ################################## main () { EXECUTE=1 if [ -z "$1" ] then echo "Not enough parameters, min is 1" get_hmc > /dev/null 2>&1 MACHINE=${DEFAULT_SERVER} $HMCCMD "lssyscfg -r lpar -m ${MACHINE} -F name" exit 1 fi CLIENT_NAME=$(echo $1 | sed 's/[^A-Za-z0-9_-]//g') # exclude all non valid characters client_name=$(echo $CLIENT_NAME | tr 'A-Z' 'a-z') if [ -n "$2" ] then # if [ ${resp[1]} == "\-x" ] # then # EXECUTE="1" # else ## MACHINE=${resp[2]} MACHINE=$2 # fi else MACHINE=${DEFAULT_SERVER} fi echo "#********* Check HMC" get_hmc echo "#********* Check Valid LPAR" get_lpar echo "#********* Check and delete zoning" delete_zoning echo "#********* Check Valid adapter ID on VIOS" get_adapterid echo "#********* Generate HMC command to remove the LPAR" delete_lpar } main $* | tee 2>&1 $logname