User Tools

Site Tools


aix:script_create_lpar

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

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
aix/script_create_lpar.txt · Last modified: 2021/01/01 21:22 (external edit)