===== 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