Some notes on dynamic variables
Creating pointers / variable variables is required to loop through any number of vSwitches listed in the host configuration file. The easiest way is to normally use the “${!ReferenceVariable}” syntax, or arrays/associative arrays, but as mentioned in part 1 these simply don’t work in the Busybox Ash shell. The only way I’ve managed to get this to work is “$(eval echo “\${ReferenceVariable”)” – this seems to work OK, and I’ll stick with it until I come across something better.
vSwitches
All fairly straight forward – loop through the vSwitch variables set in the host configuration file and configure accordingly. I’ve set these up with standard vSwitches with
- Uplinks
- Failover / failback
- Switch notify
- Loadbalancing
- Number of ports
- MTU
- etc
but this can be expanded to include any config required.
######################################################################################################################## # Configure networking, iterate through host configuration file to determine which vswitches and port groups and # vmkernel interfaces to configure intVswitchCounter=0; while : do echo "INFO ${DELIMITER1}" >> ${strLogfile}; # Check if vswitch has been specified in host configuration file strVswitchName=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_NAME}"); if [ ! "${strVswitchName}" ]; then echo "INFO No further vSwitches found in host configuration file." >> ${strLogfile}; break; else echo "INFO Configuring vSwitch${intVswitchCounter}." >> ${strLogfile}; # Parse variable variables strVswitchUplink1=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_UPLINK1}"); strVswitchUplink2=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_UPLINK2}"); strVswitchActive=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_ACTIVE}"); strVswitchStandby=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_STANDBY}"); strVswitchFailback=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_FAILBACK}"); strVswitchFailuredetection=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_FAILUREDETECTION}"); strVswitchNotify=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_NOTIFY}"); strVswitchLoadbal=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_LOADBAL}"); strVswitchPorts=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_PORTS}"); strVswitchMTU=$(eval echo "\${CFG_VSWITCH${intVswitchCounter}_MTU}"); # Configure vswitch echo "INFO Creating ${strVswitchName} with ${strVswitchPorts} ports." >> ${strLogfile}; esxcli network vswitch standard add --ports=${strVswitchPorts} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; echo "INFO Adding uplink ${strVswitchUplink1} to ${strVswitchName}." >> ${strLogfile}; esxcli network vswitch standard uplink add --uplink-name=${strVswitchUplink1} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; echo "INFO Adding uplink ${strVswitchUplink2} to ${strVswitchName}." >> ${strLogfile}; esxcli network vswitch standard uplink add --uplink-name=${strVswitchUplink2} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; echo "INFO Configuring ${strVswitchName} with MTU ${strVswitchMTU}." >> ${strLogfile}; esxcli network vswitch standard set --mtu=${strVswitchMTU} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; # vSwitch failover policy if [ "${strVswitchStandby}" == "" ]; then echo "INFO Configuring ${strVswitchName} with active uplinks ${strVswitchActive} and no standby uplinks." >> ${strLogfile}; esxcli network vswitch standard policy failover set --active-uplinks=${strVswitchActive} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; else echo "INFO Configuring ${strVswitchName} with active uplink ${strVswitchActive} and passive uplink ${strVswitchStandby}." >> ${strLogfile}; esxcli network vswitch standard policy failover set --active-uplinks=${strVswitchActive} --standby-uplinks=${strVswitchStandby} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; fi # Failback if [ "${strVswitchFailback}" ]; then echo "INFO Configuring ${strVswitchName} failback policy set to ${strVswitchFailback}." >> ${strLogfile}; esxcli network vswitch standard policy failover set --failback=${strVswitchFailback} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; fi # Failure detection echo "INFO Configuring ${strVswitchName} with ${strVswitchFailuredetection} failure detection." >> ${strLogfile}; esxcli network vswitch standard policy failover set --failure-detection=${strVswitchFailuredetection} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; # Notify switches if [ "${strVswitchNotify}" ]; then echo "INFO Configuring ${strVswitchName} switch notify policy set to ${strVswitchNotify}." >> ${strLogfile}; esxcli network vswitch standard policy failover set --notify-switches=${strVswitchNotify} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; fi # Loadbal echo "INFO Configuring ${strVswitchName} with ${strVswitchLoadbal} load balancing." >> ${strLogfile}; esxcli network vswitch standard policy failover set --load-balancing=${strVswitchLoadbal} --vswitch-name=${strVswitchName} >> ${strLogfile} 2>&1; fi #Checking for existance of vSwitch config entries # Next vSwitch intVswitchCounter=$((intVswitchCounter + 1)); done
Portgroups
Continues in the same fashion. Configures port group on specified vSwitch, sets VLAN and vmmic override if need be (e.g. for iSCSI).
######################################################################################################################## # Configure portgroups intPortgroupCounter=0; while : do echo "INFO ${DELIMITER1}" >> ${strLogfile}; # Check if portgroup has been specified in host configuration file strPortgroupName=$(eval echo "\${CFG_PORTGROUP${intPortgroupCounter}_NAME}"); if [ ! "${strPortgroupName}" ]; then echo "INFO No further portgroups found in host configuration file." >> ${strLogfile}; break; else echo "INFO Configuring portgroup ${intPortgroupCounter}." >> ${strLogfile}; # Parse variables strPortgroupVswitch=$(eval echo "\${CFG_PORTGROUP${intPortgroupCounter}_VSWITCH}"); strPortgroupVLAN=$(eval echo "\${CFG_PORTGROUP${intPortgroupCounter}_VLAN}"); strPortgroupActive=$(eval echo "\${CFG_PORTGROUP${intPortgroupCounter}_ACTIVE}"); echo "INFO Configuring portgroup ${strPortgroupName} on ${strPortgroupVswitch}." >> ${strLogfile}; esxcli network vswitch standard portgroup add --portgroup-name="${strPortgroupName}" --vswitch-name=${strPortgroupVswitch} >> ${strLogfile} 2>&1; echo "INFO Configuring portgroup ${strPortgroupName} to use VLAN ${strPortgroupVLAN}." >> ${strLogfile}; esxcli network vswitch standard portgroup set --portgroup-name="${strPortgroupName}" --vlan-id=${strPortgroupVLAN} >> ${strLogfile} 2>&1; if [ "${strPortgroupActive}" ]; then echo "INFO Configuring portgroup ${strPortgroupName} with active uplink ${strPortgroupActive}." >> ${strLogfile}; esxcli network vswitch standard portgroup policy failover set --portgroup-name=${strPortgroupName} --active-uplinks=${strPortgroupActive} >> ${strLogfile} 2>&1; fi fi #Checking for existance of portgroup config entries # Next portgroup intPortgroupCounter=$((intPortgroupCounter + 1)); done
Interfaces
Vmkernel interfaces, set IP details, MTU and tags.
######################################################################################################################## # Configure vmkernel interfaces intVmkCounter=0; while : do echo "INFO ${DELIMITER1}" >> ${strLogfile}; # Check if portgroup has been specified in host configuration file strVmkName=$(eval echo "\${CFG_VMK${intVmkCounter}_NAME}"); if [ ! "${strVmkName}" ]; then echo "INFO No further interfaces found in host configuration file." >> ${strLogfile}; break; else echo "INFO Configuring vmk${intVmkCounter}." >> ${strLogfile}; # Parse variable variables strVmkPortgroup=$(eval echo "\${CFG_VMK${intVmkCounter}_PORTGROUP}"); strVmkType=$(eval echo "\${CFG_VMK${intVmkCounter}_TYPE}"); strVmkIP=$(eval echo "\${CFG_VMK${intVmkCounter}_IP}"); strVmkNetmask=$(eval echo "\${CFG_VMK${intVmkCounter}_NETMASK}"); strVmkMTU=$(eval echo "\${CFG_VMK${intVmkCounter}_MTU}"); strVmkTags=$(eval echo "\${CFG_VMK${intVmkCounter}_TAGS}"); # Add interface echo "INFO Configuring interface ${strVmkName} on portgroup ${strVmkPortgroup}." >> ${strLogfile}; esxcli network ip interface add --interface-name=${strVmkName} --portgroup-name="${strVmkPortgroup}" >> ${strLogfile} 2>&1; if [ "${strVmkType}" == "static" ]; then echo "INFO Configuring static IP ${strVmkIP}/${strVmkNetmask}." >> ${strLogfile}; esxcli network ip interface ipv4 set --interface-name=${strVmkName} --ipv4=${strVmkIP} --netmask=${strVmkNetmask} --type=${strVmkType} >> ${strLogfile} 2>&1; elif [ "${strVmkType}" == "dhcp" ]; then echo "INFO Configuring DHCP." >> ${strLogfile}; esxcli network ip interface ipv4 set --interface-name=${strVmkName} --type=${strVmkType} >> ${strLogfile} 2>&1; fi # Enable interface echo "INFO Enabling ${strVmkName}." >> ${strLogfile}; esxcli network ip interface set --enabled=true --interface-name=${strVmkName} >> ${strLogfile} 2>&1; # Set MTU echo "INFO Configuring ${strVmkName} with MTU ${strVmkMTU}." >> ${strLogfile}; esxcli network ip interface set --mtu=${strVmkMTU} --interface-name=${strVmkName} >> ${strLogfile} 2>&1; # Tag network for strVmkTag in $(echo ${strVmkTags} | sed 's/,/\ /g'); do echo "INFO Tagging ${strVmkName} with tag ${strVmkTag}." >> ${strLogfile}; esxcli network ip interface tag add --interface-name=${strVmkName} --tagname=${strVmkTag} >> ${strLogfile} 2>&1; done fi #Checking for existance of vmk config entries # Next portgroup intVmkCounter=$((intVmkCounter + 1)); done
Next – storage, general system settings and tidy up.