shell脚本自动配置新装服务器相关配置

    每次新装服务器后,总要配置一大堆东西,重复过来,重复过去,我这个人就是不喜欢把时间浪费在相同的事情上面,所以果断写了一个脚本,自动修改主机名,网关,双网卡绑定(包括重置IP地址功能),重启网络,自动配置ntp时间同步服务,自动配置dns服务。由于修改主机名需要重启生效,所以在最后加了重启选项。当所有配置完毕,可以按7完成重启。

    将脚本拷贝到服务器任意路径,赋权chmod +x autocfg.sh,然后./autocfg.sh  执行脚本即可。这个脚本我已经在虚拟机上测试过了,可以达到正确效果,希望可以为以后生产环境的配置带来方便,当然可能会有潜在的bug,由于时间问题,没有考虑太多的捕获异常。只要根据提示操作,是可以正确执行的。

    不罗嗦,直奔主题,献上脚本:

  
  
  
  
  1. #!/bin/bash 
  2. #Initialize server
  3. #write by xiaojing.zhao 
  4. #2013.1.5 
  5.  
  6. menu() 
  7. clear 
  8. scriptname="autocfg.sh" 
  9. version=1.2.0 
  10. date=`date +%F.%T` 
  11.  
  12. cat <<MENULIST 
  13. ==================================================================================== 
  14.  
  15. ScriptName:$scriptname          Version:$version           Date&Time:$date 
  16.  
  17. ==================================================================================== 
  18. This shell script can automatically complete the following configuration: 
  19.  
  20.         1.modify hostname 
  21.         2.modify gateway 
  22.         3.configure bond0 for eth0 & eth1 
  23.         4.restart active network service 
  24.         5.configure ntp client 
  25.         6.configure dns service 
  26.         7.reboot host 
  27.          
  28. ==================================================================================== 
  29.  
  30. MENULIST 
  31.  
  32. echo -n "Please input your choice [1,2,3,4,5,6,7(anykey),b(back),q(quit),a(all)]:" 
  33. read choice 
  34.  
  35. hw_eth0=`ifconfig eth0 | grep -i hwaddr | awk '{print $5}'
  36. hw_eth1=`ifconfig eth1 | grep -i hwaddr | awk '{print $5}'
  37.  
  38.  
  39. #################################################################################### 
  40. get_ipaddr() 
  41.         ipaddra=`ifconfig -a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}'
  42.         #nw=`ifconfig -a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $2}' | awk -F : '{print $2}' | awk -F . '{print $1"."$2"."$3"."0}'
  43.         echo "IPADDR=${ipaddra#*:}" >/etc/sysconfig/network-scripts/ifcfg-tmpip 
  44.         for i in tmpip bond0 eth0 eth1 
  45.         do 
  46.                 ipaddrb=`grep ^IPADDR /etc/sysconfig/network-scripts/ifcfg-$i 2>/dev/null
  47.                 if [ ! "${ipaddrb#*=}" = "" ] 
  48.                 then 
  49.                         ipaddr=${ipaddrb#*=} 
  50.                         break 
  51.                         fi 
  52.                 done 
  53.         rm -f /etc/sysconfig/network-scripts/ifcfg-tmpip 2>/dev/null 
  54.         if [ "$ipaddr" = "" ] 
  55.         then 
  56.                 echo "This hosts has not a valid ip address" 
  57.                 while [ "$ipaddr" = "" ] 
  58.                 do 
  59.                         echo -n "Please input the address:" 
  60.                         read ipaddr 
  61.                 done 
  62.         else  
  63.                 echo -n "Please input the address[$ipaddr]:" 
  64.                 read ipaddr1 
  65.                 if [ ! "$ipaddr1" = "" ] 
  66.                 then 
  67.                         ipaddr=$ipaddr1 
  68.                 fi 
  69.         fi    
  70.         nw=`echo $ipaddr | awk -F . '{print $1"."$2"."$3"."0}'
  71.         gw=`echo $ipaddr | awk -F . '{print $1"."$2"."$3"."1}'
  72. #################################################################################### 
  73. get_brcast() 
  74.         brcasta=`ifconfig -a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $3}'
  75.         echo "BROADCAST=${brcasta#*:}" >>/etc/sysconfig/network-scripts/ifcfg-tmpip 
  76.         for i in tmpip bond0 eth0 eth1 
  77.         do 
  78.                 brcastb=`grep ^BROADCAST /etc/sysconfig/network-scripts/ifcfg-$i 2>/dev/null
  79.                 if [ ! "${brcastb#*=}" = "" ] 
  80.                 then 
  81.                         brcast=${brcastb#*=} 
  82.                         break 
  83.                         fi 
  84.                 done 
  85.         rm -f /etc/sysconfig/network-scripts/ifcfg-tmpip 2>/dev/null 
  86.         if [ "$brcast" = "" ] 
  87.         then 
  88.                 echo "This hosts has not a valid broadcast" 
  89.                 while [ "$brcast" = "" ] 
  90.                 do 
  91.                         echo -n "Please input the brdcast:" 
  92.                         read brcast 
  93.                 done 
  94.         else 
  95.                 echo -n "Please input the brdcast[$brcast]:" 
  96.                 read brcast1 
  97.                 if [ ! "$brcast1" = "" ] 
  98.                 then 
  99.                         brcast=$brcast1 
  100.                 fi 
  101.         fi 
  102. #################################################################################### 
  103. get_ntmask() 
  104.        ntmaska=`ifconfig -a | grep inet | grep -v inet6 | grep -v 127.0.0.1 | awk '{print $4}'
  105.         echo "NETMASK=${ntmaska#*:}" >>/etc/sysconfig/network-scripts/ifcfg-tmpip 
  106.         for i in tmpip bond0 eth0 eth1 
  107.         do 
  108.                 ntmaskb=`grep ^NETMASK /etc/sysconfig/network-scripts/ifcfg-$i 2>/dev/null
  109.                 if [ ! "${ntmaskb#*=}" = "" ] 
  110.                 then 
  111.                         ntmask=${ntmaskb#*=} 
  112.                         break 
  113.                         fi 
  114.                 done 
  115.         rm -f /etc/sysconfig/network-scripts/ifcfg-tmpip 2>/dev/null 
  116.         if [ "$ntmask" = "" ] 
  117.         then 
  118.                 echo "This hosts has not a valid ip netmask" 
  119.                 while [ "$ntmask" = "" ] 
  120.                 do 
  121.                         echo -n "Please input the netmask:" 
  122.                         read ntmask 
  123.                 done 
  124.         else  
  125.                 echo -n "Please input the netmask[$ntmask]:" 
  126.                 read ntmask1 
  127.                 if [ ! "$ntmask1" = "" ] 
  128.                 then 
  129.                         ntmask=$ntmask1 
  130.                 fi 
  131.         fi       
  132. #################################################################################### 
  133. gateway() 
  134. echo -n "Do you want to configure GATEWAY?[y|n]" 
  135. read myselect 
  136. if [[ "$myselect" = "y" || "$myselect" = "Y" ]] 
  137. then 
  138.         unset myselect 
  139.         clear 
  140.         orifile=/etc/sysconfig/network 
  141.         newfile=/root/network 
  142.         if ! grep GATEWAY $orifile >/dev/null  
  143.         then 
  144.                 while [ "$gw" = "" ] 
  145.                 do 
  146.                         echo -n "Please input GATEWAY:" 
  147.                         read gw 
  148.                 done 
  149.         else 
  150.                 echo -n "`grep GATEWAY $orifile`,Please input new GATEWAY:" 
  151.                 read gw 
  152.         fi 
  153.  
  154.         if [ ! "$gw" = "" ] 
  155.         then 
  156.                 #sed "/GATEWAY/d"  $orifile | sed "$ a\GATEWAY=$gw" >$newfile 
  157.                 #the bellow line is better,more fast 
  158.                 (sed "/GATEWAY/d"  $orifile;echo GATEWAY=$gw) >$newfile 
  159.                 cp $newfile $orifile 
  160.  
  161.         fi 
  162.  
  163.         echo -e "\nThe new $orifile file's content:\n" 
  164.         cat $orifile 
  165.         echo 
  166. fi 
  167. echo 
  168. #################################################################################### 
  169. hosts() 
  170. echo -n "Do you want to configure /etc/hosts file?[y|n]" 
  171. read myselect 
  172. if [[ "$myselect" = "y" || "$myselect" = "Y" ]] 
  173. then 
  174.         unset myselect 
  175.         clear 
  176.         get_ipaddr 
  177.                 cp /etc/hosts /root/hosts.`date +%F-%T` 
  178.                                 egrep -v '^([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([2-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])' /etc/hosts >/root/hosts.txt 
  179.                                 mv /root/hosts.txt /etc/hosts 
  180.                                 echo -n "Please input your hostname[eg:xxxx.aeonlife.com.cn]:" 
  181.                                 read line_hostname 
  182.                 hname=`echo $line_hostname | awk -F . '{print $1}'
  183.                 sed "/$ipaddr/d" /etc/hosts | sed "$ a\\$ipaddr        $line_hostname       $hname" >/root/hosts 
  184.                 cp /root/hosts /etc/hosts 
  185.                 sed -i "/HOSTNAME/c\HOSTNAME=$line_hostname" /etc/sysconfig/network 
  186.         echo -e "\nThe new /etc/hosts file's content:\n" 
  187.         cat /etc/hosts 
  188.         echo 
  189. fi 
  190. echo 
  191. #################################################################################### 
  192. bond() 
  193. echo -n "Do you want to configure modprobe.conf for bonding?[y|n]" 
  194. read myselect 
  195.  
  196. if [[ "$myselect" = "y" || "$myselect" = "Y" ]] 
  197. then 
  198.         unset myselect 
  199.         clear 
  200.         echo -e "========== begin to modify /etc/modprobe.conf ===========\n" 
  201.  
  202.         filename=/etc/modprobe.conf 
  203.         newfile=/root/modprobe.conf 
  204.         #cmdfile=/tmp/change_modprobe.conf.sh 
  205.  
  206.         grep bond0 /etc/modprobe.conf >/dev/null 
  207.         if [ $? = 1 ] 
  208.         then 
  209.                 echo -n "Please input the bonding mode,default is 1.[1|0]" 
  210.                 read bmode 
  211.                 if [ "$bmode" = "" ];then bmode=1;fi 
  212.                 cat $filename >$newfile 
  213.                 echo "alias bond0 bonding" >>$newfile 
  214.                 echo "options bond0 miimon=100 mode=1" >>$newfile 
  215.  
  216.                 mv $filename $filename.`date +%F-%T` 
  217.                 sed "s/mode=1/mode=$bmode/" $newfile >$filename 
  218.                 echo "$filename has been modified." 
  219.                 echo "The original file is bakup to $filename.`date +%F`..." 
  220.         else 
  221.                 echo "This hosts has been using bonding mode,nothing to changed." 
  222.                 echo "The $filename file's content:" 
  223.                 cat /etc/modprobe.conf 
  224.         fi 
  225.         echo 
  226.         echo 
  227.  
  228.         orieth0=/etc/sysconfig/network-scripts/ifcfg-eth0 
  229.         orieth1=/etc/sysconfig/network-scripts/ifcfg-eth1 
  230.         oribond=/etc/sysconfig/network-scripts/ifcfg-bond0 
  231.         neweth0=/root/ifcfg-eth0 
  232.         neweth1=/root/ifcfg-eth1 
  233.         newbond=/root/ifcfg-bond0 
  234.  
  235.         if [ -f $oribond ] 
  236.         then 
  237.                 cp $oribond $newbond.`date +%F-%T` 
  238.         fi 
  239.         if [[ ! ( ! "$ipaddr" = "" && ! "$brcast" = "" && ! "$netmask" = "" ) ]] 
  240.         then 
  241.                 get_ipaddr 
  242.                 get_brcast 
  243.                 get_ntmask 
  244.         fi 
  245.                 echo "DEVICE=bond0" >$oribond 
  246.                 echo "BOOTPROTO=none" >>$oribond 
  247.                 echo "ONBOOT=yes" >>$oribond 
  248.                 echo "IPV6INIT=no" >>$oribond 
  249.                 echo "TYPE=Ethernet" >>$oribond 
  250.                 echo "PEERDNS=yes" >>$oribond 
  251.                 echo "USERCTL=no" >>$oribond 
  252.                 echo "IPADDR=$ipaddr" >>$oribond 
  253.                 echo "BROADCAST=$brcast" >>$oribond 
  254.                 echo "NETMASK=$ntmask" >>$oribond 
  255.                 echo "GATEWAY=$gw" >>$oribond 
  256.                 echo "NETWORK=$nw" >>$oribond 
  257.  
  258.         if [ -f $orieth0 ] 
  259.         then 
  260.                 cp $orieth0 $neweth0.`date +%F-%T` 
  261.         fi 
  262.  
  263.         if [ -f $orieth1 ] 
  264.         then 
  265.                 cp $orieth1 $neweth1.`date +%F-%T` 
  266.         fi 
  267.  
  268.                 echo "DEVICE=eth0" >$orieth0 
  269.                 echo "BOOTPROTO=none" >>$orieth0 
  270.                 echo "MASTER=bond0" >>$orieth0 
  271.                 echo "SLAVE=yes" >>$orieth0 
  272.                 echo "ONBOOT=yes" >>$orieth0 
  273.                 echo "HWADDR=$hw_eth0" >>$orieth0 
  274.                 #sed -i '/HWADDR/c\HWADDR='$hw_eth0'' $orieth0 
  275.                 echo "IPV6INIT=no" >>$orieth0 
  276.                 echo "TYPE=Ethernet" >>$orieth0 
  277.                 echo "PEERDNS=yes" >>$orieth0 
  278.                 echo "USERCTL=no" >>$orieth0 
  279.  
  280.  
  281.                 echo "DEVICE=eth1" >$orieth1 
  282.                 echo "BOOTPROTO=none" >>$orieth1 
  283.                 echo "MASTER=bond0" >>$orieth1 
  284.                 echo "SLAVE=yes" >>$orieth1 
  285.                 echo "ONBOOT=yes" >>$orieth1 
  286.                 echo "HWADDR=$hw_eth1" >>$orieth1 
  287.                 #sed -i '/HWADDR/c\HWADDR='$hw_eth1'' $orieth1 
  288.                 echo "IPV6INIT=no" >>$orieth1 
  289.                 echo "TYPE=Ethernet" >>$orieth1 
  290.                 echo "PEERDNS=yes" >>$orieth1 
  291.                 echo "USERCTL=no" >>$orieth1 
  292.                  
  293.  
  294.  
  295.         echo -e "\ncat $oribond" 
  296.         cat $oribond 
  297.         echo -e "\ncat $orieth0" 
  298.         cat $orieth0 
  299.         echo -e "\ncat $orieth1" 
  300.         cat $orieth1 
  301.         echo 
  302. fi 
  303. echo 
  304. #################################################################################### 
  305. ntp() 
  306. echo -n "Do you want to configure ntp client?[y|n]" 
  307. read myselect 
  308. if [[ "$myselect" = "y" || "$myselect" = "Y" ]] 
  309. then 
  310.         unset myselect 
  311.         clear 
  312.         orifile=/var/spool/cron/root 
  313.         newfile=/root/root 
  314.         if [ -f $orifile ] 
  315.         then 
  316.                 sed "/ntpdate/d" $orifile > $newfile 
  317.         else 
  318.                 touch $orifile 
  319.         fi 
  320.         if grep ntpdate $orifile > /dev/null 
  321.         then 
  322.            for i in `sed -n '/ntpdate/p' $orifile | awk '{print $7}'
  323.            do 
  324.                 ((num++)) 
  325.                 echo -n "Please input the new ntp server ip-addr. server $num's ip [$i]:" 
  326.                 #read ntpip[$num] 
  327.                 read ntpip 
  328.                 if [ "$ntpip" = "" ] 
  329.                 then 
  330.                         ntpip=$i 
  331.                 fi 
  332.                 echo "$num * * * * /usr/sbin/ntpdate $ntpip" >> $newfile 
  333.            done 
  334.            unset num 
  335.         else 
  336.            echo "You can assign max two ntp server's ip!" 
  337.            echo 
  338.            for ((i=0;i<2;i++)) 
  339.            do 
  340.                 echo -n "Please input the new ntp server ip-addr:" 
  341.                 read ntpip 
  342.                 if [ ! "$ntpip" = "" ] 
  343.                 then 
  344.                         echo "$i * * * * /usr/sbin/ntpdate $ntpip" >> $newfile 
  345.                 fi 
  346.            done 
  347.         fi 
  348.         cp $newfile $orifile 
  349.         echo 
  350.         echo "The new root's crontab is" 
  351.         crontab -l 
  352.         /usr/sbin/ntpdate $ntpip 
  353.         echo 
  354.         echo  
  355. fi 
  356. echo 
  357. #################################################################################### 
  358. dns() 
  359. echo -n "Do you want to configure dns service?[y|n]" 
  360. read myselect 
  361. if [[ "$myselect" = "y" || "$myselect" = "Y" ]] 
  362. then 
  363.         unset myselect 
  364.         clear 
  365.                 echo -e "You can assign max two dns server's ip!\n" 
  366.                 for ((i=0;i<2;i++)) 
  367.                 do 
  368.                         echo -n "Please input the new dns server ip-addr:" 
  369.                         read dnsip 
  370.                         echo "nameserver "$dnsip >> /etc/resolv.conf  
  371.                 done 
  372. fi 
  373. echo 
  374. #################################################################################### 
  375. autostart() 
  376. echo -n "Do you want to active network now?[y|n]" 
  377. read myselect 
  378. if [[ "$myselect" = "y" || "$myselect" = "Y" ]] 
  379. then 
  380.         unset myselect 
  381.         clear 
  382.         service network restart >/dev/null 2>&1 
  383.         service network restart 
  384. fi 
  385. echo 
  386.  
  387. #################################################################################### 
  388. for ((j=1;;j++)) 
  389. do 
  390. menu 
  391. case "$choice" in 
  392.         "1"
  393.                 hosts 
  394.                 ;; 
  395.         "2"
  396.                 gateway 
  397.                 ;; 
  398.         "3"
  399.                 bond 
  400.                 ;; 
  401.         "4"
  402.                 autostart 
  403.                 ;;               
  404.         "5"
  405.                 ntp 
  406.                 ;; 
  407.         "6"
  408.                 dns 
  409.                 ;; 
  410.         "7")    reboot 
  411.                 ;; 
  412.         "8"
  413.                 ;; 
  414.         "a"
  415.                 gateway 
  416.                 hosts 
  417.                 bond 
  418.                 ntp 
  419.                 dns 
  420.                 autostart 
  421.                 exit 0 
  422.                 ;; 
  423.         "b"
  424.                 unset choice 
  425.                 ;; 
  426.         "q"
  427.                 exit 0 
  428.                 ;; 
  429. esac 
  430. if [ ! "$choice" = "" ] 
  431. then 
  432.         echo "Press any key to return!" 
  433.         read 
  434. fi 
  435. done 

由于篇幅问题,只选取部分例子的执行效果:

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

---------------------------------华丽的分割线--------------------------------------

最终完成后,可按7完成重启,因为修改主机名需要重启生效。

这是第二个版本,以后还会根据需要陆续往里加内容。希望这个脚本能给更多奋斗在运维岗位的朋友带来帮助。

你可能感兴趣的:(hostname,ntp,gateway,bond0,自动配置)