#!/bin/bash
###################################################
# 安装前网络bond配置与环境预检查
# bond0:管理 bond1:业务
# 需要设置参数如下:
# 1、管理地址网关
# 2、业务地址网关
# 示例1: sh initEnvConfig.sh 192.168.78.2 192.168.79.2
# 示例2: sh initEnvConfig.sh 2 2
# 示例3: sh initEnvConfig.sh 2 2 desc
###################################################
GL_GATEWAY="139.161.12.1" # 192.168.78.1 (未输入完整IP情况下必填)
GL_NETMASK="255.255.255.0" # 255.255.255.0 (未填写将采用默认值)
YW_GATEWAY="139.161.27.1" # 192.168.79.1 (未输入完整IP情况下必填)
YW_NETMASK="255.255.255.0" # 255.255.255.0 (未填写将采用默认值)
# 网络地址
GL_IP="" # 根据配置和动态参数1自动获取
YW_IP="" # 根据配置和动态参数2自动获取
# bond策略默认设置
SWITCH=0
#活跃网口
PORTS_ARR=""
BOND="bond"
##########################################
# 1、准备创建临时工作空间
# 2、进行用户赋权
# 3、备份原配置
##########################################
WORKSPACE="/tmp/workspace/`date +'%Y-%m-%d'`/"
BAKSPACE="/tmp/workspace/bak/"
NETWORK_DIR="/etc/sysconfig/network-scripts/"
mkdir -p $WORKSPACE
chmod -R 755 $WORKSPACE
mkdir -p $BAKSPACE
chmod 755 $BAKSPACE
cp -r ${NETWORK_DIR} ${BAKSPACE}
################################################################################
# Function: check_ip
# Description: ip格式检查
# Parameter:
# input:
# ip : xx.xx.xx.xx
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function check_ip() {
VALID_CHECK=$(echo $1|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo "$1"|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$">/dev/null; then
if [ ${VALID_CHECK:-no} == "yes" ]; then
return 0
else
return 1
fi
else
return 1
fi
}
################################################################################
# Function: check_param_config
# Description: 网络地址预配置检查,输入参数检查
# Parameter:
# input:
# 参数1:管理地址,格式为 192.168.78.2 或者 2
# 参数2:业务地址,格式为 192.168.79.2 或者 2
# 参数3:是否为默认bond策略
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function check_param_config()
{
# 没有IP参数退出执行
if [ $# -lt 2 ];then
echo "没有配置管理地址和业务地址"
return 1
fi
# 手工参数未配置且输入不完全退出执行
if [ "${GL_GATEWAY}" == "" ] || [ "${YW_GATEWAY}" == "" ]; then
if [ ! `check_ip $1` ] && [ ! `check_ip $2` ]; then
GL_GATEWAY=`echo "${1}.1" | awk -F '.' '{print $1,$2,$3,$NF}' OFS='.'`
YW_GATEWAY=`echo "${2}.1" | awk -F '.' '{print $1,$2,$3,$NF}' OFS='.'`
echo "未手动配置管理网关或业务网关,设置默认网关"
else
echo "未手动配置管理网关或业务网关,且输入IP不符合要求,执行退出"
return 1
fi
fi
#
if [ "${GL_NETMASK}" == "" ] || [ "${YW_NETMASK}" == "" ]; then
GL_NETMASK="255.255.255.0"
YW_NETMASK="255.255.255.0"
echo "没有配置管理地址掩码或业务地址掩码,设置默认掩码"
fi
# 参数小于或等于三执行操作
# 若未设置网关根据输入地址设置默认网关
if [ $# -lt 3 ]; then
GL_IP=`echo ${GL_GATEWAY}${1} | awk -F '.' '{print $1,$2,$3,$NF}' OFS='.'` #取对应管理网关的段加输入的管理地址最后一位
YW_IP=`echo ${YW_GATEWAY}${2} | awk -F '.' '{print $1,$2,$3,$NF}' OFS='.'` #取对应业务网关的段加输入的业务地址最后一位
fi
# 参数等于三执行操作
if [ $# -eq 3 ] && [ "$3" == "desc" ]; then #bond网口切换
SWITCH=1
fi
return 0
}
################################################################################
# Function: get_network_port
# Description: 获取所有UP状态的网口名称并排序
# Parameter:
# input:
# N/A
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function get_network_port()
{
if [ $SWITCH -eq 0 ]; then
NET_PORTS=`ip addr | grep 'state UP' | grep -v ": $BOND" | awk -F ':' '{print $2}' | sed 's/^[ \t]*//g' | sort`
elif [ $SWITCH -eq 1 ]; then
NET_PORTS=`ip addr | grep 'state UP' | grep -v ": $BOND" | awk -F ':' '{print $2}' | sed 's/^[ \t]*//g' | sort -r`
fi
# NET_PORTS="ens129s0f0 ens129s0f1 ens130s0f0 ens130s0f1"
PORTS_ARR=(${NET_PORTS//' '/ }) # 转数组
if [ ${#PORTS_ARR[@]} -ne 4 ]; then
echo "当前UP状态网口数为${#PORTS_ARR[@]},请检查是否存在网口异常"
return 1
fi
return 0
}
################################################################################
# Function: set_network_port
# Description: 配置网口(默认取网卡名称小的做管理bond0,网卡名称大的做业务bond1)
# Parameter:
# input:
# 参数1:网口名称
# 参数2: 网口下标
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function set_network_port()
{
PORTNAME="ifcfg-$1"
echo "$WORKSPACE$PORTNAME"
echo "TYPE=Ethernet" > $WORKSPACE$PORTNAME
echo "NAME=$1" >> $WORKSPACE$PORTNAME
echo "DEVICE=$1" >> $WORKSPACE$PORTNAME
echo "BOOTPROTO=none" >> $WORKSPACE$PORTNAME
echo "ONBOOT=yes" >> $WORKSPACE$PORTNAME
echo "MASTER=$BOND$(($2/2))" >> $WORKSPACE$PORTNAME
echo "SLAVE=yes" >> $WORKSPACE$PORTNAME
echo "USERCTL=no" >> $WORKSPACE$PORTNAME
return 0
}
################################################################################
# Function: set_bond
# Description: 配置bond(bond名称默认为网口数量整除2,且网卡数大于2)
# Parameter:
# input:
# 网口下标
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function set_bond()
{
if [ $(($1%2)) -ne 0 ];then
BONDNAME="ifcfg-$BOND$(($1/2))"
echo "TYPE=Bond" > $WORKSPACE$BONDNAME
echo "DEVICE=$BOND$(($1/2))" >> $WORKSPACE$BONDNAME
echo "BONDING_MASTER=yes" >> $WORKSPACE$BONDNAME
echo "BOOTPROTO=none" >> $WORKSPACE$BONDNAME
echo "ONBOOT=yes" >> $WORKSPACE$BONDNAME
echo 'BONDING_OPTS="mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer3+4"' >> $WORKSPACE$BONDNAME
if [ $(($1/2)) -eq 0 ];then
echo "IPADDR=${GL_IP}" >> $WORKSPACE$BONDNAME
echo "NETMASK=${GL_NETMASK}" >> $WORKSPACE$BONDNAME
echo "# GATEWAY=${GL_GATEWAY}" >> $WORKSPACE$BONDNAME
elif [ $(($1/2)) -eq 1 ];then
echo "IPADDR=${YW_IP}" >> $WORKSPACE$BONDNAME
echo "NETMASK=${YW_NETMASK}" >> $WORKSPACE$BONDNAME
echo "GATEWAY=${YW_GATEWAY}" >> $WORKSPACE$BONDNAME
fi
fi
return 0
}
################################################################################
# Function: check_network
# Description: 检查网络是否正常
# Parameter:
# input:
# N/A
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function check_network()
{
if [ -Z `ip addr | grep "${BOND}0" | grep "state UP"` ];then
echo "${BOND}0状态异常,请使用 ip addr 检查"
return 1
fi
if [ -Z `ip addr | grep ${GL_IP}` ];then
echo "管理IP未生效,请使用 ip addr 检查"
return 1
fi
if [ -Z `ethtool "${BOND}0" | grep '2'` ];then
echo "${BOND}0带宽异常,请使用 ethtool ${BOND}0 检查"
return 1
fi
if [ -Z `ip addr | grep "${BOND}1" | grep "state UP"` ];then
echo "${BOND}1状态异常,请使用 ip addr 检查"
return 1
fi
if [ -Z `ip addr | grep ${YW_IP}` ];then
echo "业务IP未生效,请使用 ip addr 检查"
return 1
fi
if [ -Z `ethtool "${BOND}1" | grep '2'` ];then
echo "${BOND}1带宽异常,请使用 ethtool ${BOND}1 检查"
return 1
fi
ping -c 4 $GL_GATEWAY
if [ $? -ne 0 ];then
echo "管理网关不通,请使用 ping 检查"
return 1
fi
ping -c 4 $YW_GATEWAY
if [ $? -ne 0 ];then
echo "业务网关不通,请使用 ping 检查"
return 1
fi
return 0
}
################################################################################
# Function: restart_network
# Description: bond网卡重启
# Parameter:
# input:
# N/A
# output:
# N/A
# Return: 0 -- success; not 0 -- failure
# Others: N/A
################################################################################
function restart_network()
{
# 将生成文件拷贝到network目录并重启网卡
\cp -f "${WORKSPACE}ifcfg-*" ${NETWORK_DIR}
systemctl restart NetworkManager
ifdown "${BOND}0"
ifup "${BOND}0"
ifdown "${BOND}1"
ifup "${BOND}1"
return $?
}
main()
{
check_param_config $@
if [ $? -ne 0 ];then
exit -1
fi
get_network_port
if [ $? -ne 0 ];then
exit -1
fi
for ((i=0;i<${#PORTS_ARR[@]};i++))
do
set_network_port ${PORTS_ARR[i]} $i
set_bond $i
done
if [ $? -ne 0 ];then
exit -1
fi
restart_network
if [ $? -ne 0 ];then
exit -1
fi
check_network
# 确定网络检查正常后删除工作空间和备份空间,异常则先还原再删除
if [ $? -ne 0 ];then
\cp -f "$BAKSPACE/network-scripts/" $(dirname $NETWORK_DIR)
exit -1
fi
# 回收工作空间
rm -rf $WORKSPACE
rm -rf $BAKSPACE
rm -r /tmp/workspace
}
main "$@"
服务器网卡bond脚本
于 2024-06-18 16:10:39 首次发布