2019年10月

  200台服务器,已经安装完系统了,现在需要配置每台服务器的带外硬件管理地址。200台服务器分发到100个站点,每个站点的IP地址、掩码、网关都不一样,手工改的话,一台平均下来至少需要10分钟。此文基于服务器已经安装好操作系统的前提下,系统Centos7.6,本地yum已配置,因为这200台是用脚本批量安装的,都用脚本配置好了本地yum。

这里分享我的思路,用到的工具包括expect,ipmitool。用expect无人交互工具,把配置BMC地址的脚本批量上传到所有服务器,然后再批量登录每台主机,执行脚本,脚本会根据当前服务器的序列号,查找预定义的IP信息,自动配置IP地址。

1,统计所有主机序列号以及每个站点的bmc 地址信息,文件名称自定义bmcip,内容格式如下:

#主机序列号    地址 掩码 网关    每一项之间用空格隔开。
419203764 172.16.125.2 255.255.255.240 172.16.125.1
419203769 172.16.125.1 255.255.255.240 172.16.125.1
419203751 172.16.126.178 255.255.255.240 172.16.126.177
419203811 172.16.126.179 255.255.255.240 172.16.126.177
419203755 172.16.125.18 255.255.255.240 172.16.125.17

2,编写在每台主机上要执行的脚本,需要安装修改bmc地址用到的ipmitool。然后根据本机的序列号来筛选预定义的IP信息,再进行配置。ipmi.sh内容如下:

#!/bin/bash
#通过yum安装ipmitool
yum install -y ipmitool
#定义当前主机的序列号变量
SN=`dmidecode -t 1 |grep "Serial Number" |awk -F ": " '{print $2}'`
#根据当前主机的序列号在bmcip中筛选查找所对应的ip地址
ip=`cat /tmp/bmcip |grep $SN |awk -F " " '{print $2}'`
#根据当前主机的序列号在bmcip中筛选查找所对应的掩码
netmask=`cat /tmp/bmcip |grep $SN |awk -F " " '{print $3}'`
#根据当前主机的序列号在bmcip中筛选查找所对应的网关
gateway=`cat /tmp/bmcip |grep $SN |awk -F " " '{print $4}'`
#配置bmc为静态模式
ipmitool lan set 1 ipsrc static
#配置bmc地址
ipmitool lan set 1 ipaddr $ip
#配置bmc掩码
ipmitool lan set 1 netmask $netmask
#配置bmc网关
ipmitool lan set 1 defgw ipaddr $gateway

3,在管理机器上安装expect 和nmap工具,然后用nmap 扫描在线的主机,形成host_ip文件,记得排除管理机IP和交换机等IP

nmap -sP 192.168.70.1/24 > host_ip

host_ip内容格式如下:

192.168.70.11
192.168.70.12
192.168.70.13
192.168.70.14
192.168.70.15
192.168.70.16
192.168.70.17
192.168.70.18
192.168.70.19
192.168.70.22
192.168.70.23
192.168.70.24

4,编写批量上传文件的脚本和执行命令的脚本bmc.sh内容如下

#!/bin/bash
#在host_ip中循环列出所有的目标IP
for row in `cat host_ip | awk -F " " '{print $1}'`
  do
#定义IP变量
ip=`echo ${row} | awk -F " " '{print $1}'`
#上传ipmi.sh到所有目标主机
/usr/bin/expect <<-EOF
spawn scp /var/www/html/script/ipmi.sh $ip:/tmp/
expect {
        "yes/no" {send "yes\r";exp_continue}
        "password: " {send "admin@123\r";exp_continue}
    }
EOF
 done
for row in `cat host_ip | awk -F " " '{print $1}'`
  do
#定义IP变量
ip=`echo ${row} | awk -F " " '{print $1}'`
#上传bmcip到所有目标主机
/usr/bin/expect <<-EOF
spawn scp /var/www/html/script/bmcip $ip:/tmp/
expect {
        "yes/no" {send "yes\r";exp_continue}
        "password: " {send "admin@123\r";exp_continue}
        }
EOF
done
    for row in `cat host_ip | awk -F " " '{print $1}'`
  do
#定义IP变量
ip=`echo ${row} | awk -F " " '{print $1}'`
#在host_ip中的每个主机中依次执行下面的命令,无需人工干预,全部无交互
/usr/bin/expect <<-EOF
spawn ssh root@$ip
expect {
        "yes/no" {send "yes\r";exp_continue}
        "password: " {send "admin@123\r";exp_continue}
         }
set timeout -1
expect "*#"
send "chmod +x /tmp/ipmi.sh\r"
expect "*#"
send "/tmp/ipmi.sh\r"
expect "*#"
send "exit\r"
expect eof
EOF
done

在管理机上执行bmc.sh即可,bmc.shhost_ip须在同一目录下