#!/bin/sh
host=`hostname`
declare -A dict
dict=(["server1"]=["1.1.1.1","1.1.1.5"])
dict+=(["server2"]=["2.1.1.1","2.1.1.5"])
mac=`ifconfig -a | grep ether | awk '{print $2}' | sort | uniq -c | grep "1 " | awk '{print $2}'`
mac_len=`ifconfig -a | grep ether | awk '{print $2}' | sort | uniq -c | grep "1 " | awk '{print $2}' | wc -l`
touch /etc/udev/rules.d/70-persistent-net.rules
if [ "${mac_len}" == "2" ];then
a=0
p='eth4'
b=""
for line in ${mac};do
b="${b}SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$line\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=$p\n"
temp=${dict[$host]}
IP=${temp[$a]}
cfg="DEVICE=${p}\nTYPE=\"Ethernet\"\nIPADDR=${IP}\nHWADDR=$line\nBOOTPROTO=static\nNETMASK=255.255.255.252\nONBOOT=yes\nETHTOOL_OPTS=\"speed 10000 duplex full autoneg on\""
echo -e $cfg > /etc/sysconfig/network-scripts/ifcfg-$p
let a=a+1
p='eth5'
done
echo -e $b > /etc/udev/rules.d/70-persistent-net.rules
sed -i 's/GRUB_CMDLINE_LINUX="crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 console=tty0 console=ttyS0,115200 scsi_mod.scan=sync intel_idle.max_cstate=0 pci=pcie_bus_perf ipv6.disable=1 rd.driver.pre=ahci"/GRUB_CMDLINE_LINUX="crashkernel=auto vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 console=tty0 console=ttyS0,115200 scsi_mod.scan=sync intel_idle.max_cstate=0 pci=pcie_bus_perf ipv6.disable=1 rd.driver.pre=ahci net.ifnames=0 biosdevname=0"/g' /etc/sysconfig/grub
fi
echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo 0 > /proc/sys/net/ipv4/conf/eth4/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/eth5/rp_filter
sysctl -p
sysctl -a | grep \\\.rp_filter
特别说明:
1.$IP还有点问题没解决----[尴尬]
2.对写代码的同学来说:赋值等号=前后不能加空格简直逼死强迫症
3.对$p这种变量如果后面马上跟着一串字符,需要{}以区分普通字符
4.for循环的写法不是靠{}或者缩进完成,而是靠;do done结构完成。
5.echo一定是创建一个新文件(会覆盖),而sed一定是在老文件中做修改(如果文件不存在或为空,不会向其中添加内容)
6.双引号的文本中可以使用\n这种转义字符,单引号的不行。
7.双引号转义时,和正则表达式转义不一样,.*?这些都不用转义。因为本来也就没有特殊意义
8.CLI执行命令使用``将需要执行的命令括起来
~~~Update 20190821
dict内嵌list的方案没有搞明白,使用了一个变通方法,使用split来划分字符串
dict=(["server1"]="10.1.1.1_10.1.1.10")
dict+=(["server2"]="10.2.2.24_10.2.2.28")
OLD_IFS="$IFS"
IFS="_"
arr=($temp)
IFS="$OLD_IFS"
echo $arr
IP=${arr[$a]}
具体手工配置方法详见以下log: