服务器网卡bond脚本

#!/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 "$@"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值