===== AIX LPAR automation ===== ==== AIX create LPAR ==== [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<&1 $logname ==== AIX delete LPAR ==== 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