3.3 利用批处理与Shell脚本简化逻辑节点的搬迁
3.3.1 逻辑节点切换脚本的思路
众所周知,对于服务器的搬迁,不只会涉及物理层面的设备搬迁。在物理设备搬迁到新机房后,往往还需要对虚拟机中的多种参数进行相关调整。
如果管理的服务器台数比较少的话,则可以采用手工设置的方式逐一更改参数。但是,如果手中管理的Windows和Linux虚拟机有数千台的话,那么这些繁琐的参数调整一定会让你头疼不已。其中需要调整的参数如下:
IP
GATEWAY
DNS
WSUS
NTP
HOSTS
也许大家要问,像DNS、WSUS、NTP这类服务器地址是有固定IP的,设置起来应该相对容易,但像IP地址和GATEWAY怎么办呢?下面就来讲述下如何编写这个脚本。
服务器条件如下:
搬迁环境涉及两类资源,一类为容灾环境节点、一类为研发测试环境节点。
每台服务器都利用的是内网网段IP,通过NAT转换到公网。
每台服务器都只有一个本地连接的网口。
所有网段的网关地址的最后一位为254(基于C类网段进行分配)。
由于新注册到目标数据中心的所有节点,在开启后仍然保持了源端LUN COPY节点的所有参数。而且并非所有节点都安装了适合虚拟机版本的VMware-Tools组件,因此无法统一通过PowerCLI的invoke-vmscript命令直接对虚拟机发送指令进行操作。结合工作中的实际需求,我考虑在虚拟机未断开复制之前对源端主机预先上传切换用的脚本,搬迁至目标端之后,人工执行切换脚本并选取对应的环境,系统再根据人工反馈的环境值,自动更改对应的参数来完成虚拟机内所有参数的切换工作。
每台服务器都有一个搬迁前的在用IP地址,另外根据规划已知要在搬迁后为每台服务器分配一个新的IP地址。因此可根据项目规划的要求制作一张新旧IP切换对照表,俗称字典文件,该对照表包含如下内容:
第一列为原有的旧IP,第二列为搬迁后的新IP,第三列为搬迁后需要调整的新主机名(如无需调整主机名,则第三列可忽略。Linux的字典文件用TAB作为分隔符,Windows的字典文件用空格作为分隔符),该文件将最终随同切换用脚本文件在搬迁之前一并上传至逻辑节点的指定目录中待用。
以下表3-2仅为参考示例。
表3-2 新旧IP切换对照表
现有IP 新IP 新主机名
100.198.100.71 192.168.100.71 ser1
100.198.100.72 192.168.100.72 ser2
100.198.100.73 192.168.100.73 ser3
100.198.100.74 192.168.100.74 ser4
100.198.100.75 192.168.100.75 ser5
100.198.111.76 192.168.111.76 ser6
100.198.111.77 192.168.111.77 ser7
100.198.111.78 192.168.111.78 ser8
100.198.111.79 192.168.111.79 ser9
100.198.111.80 192.168.111.80 ser10
获取目前主机上的IP地址情况,然后与以上字典文件中的现有IP列的IP地址进行比对,如获取到对应的现有IP,则再提取与现有IP同一行中对应的新IP和新主机名。并将新IP的值自动赋予Windows的网卡,将新的主机名赋予操作系统(如果有需要更改主机名的情况),这样就完成了IP的自动替换和主机名更改的工作。
3.3.2 利用批处理脚本简化Windows逻辑节点的搬迁
下面是基于Windows批处理的脚本,主要实现功能为判断操作系统(Win2003/Win2008)和应用环境(研发和容灾),执行不同的批处理指令,将字典文件中的旧IP切换为对应的新IP:
@echo ++++++++++++++++++++++++++++++++++++++++++++++++
@echo +欢迎使用Win2003/Win2008切换脚本,请根据切换环境输入指定的参数!+
@echo ++++++++++++++++++++++++++++++++++++++++++++++++
@choice /C:123 /N /M "1:研发测试环境 2:容灾环境 3:退出"
if errorlevel 3 goto end
if errorlevel 2 goto zb
if errorlevel 1 goto kfcs
# 以上语句显示欢迎页面,同时还显示应用环境菜单,根据操作的选取,可跳转到不同的环境
:kfcs #(设置开发测试环境的所有参数)
set adapter= #(初始化网卡变量)
set oldip= #(初始化旧IP变量)
set newip= #(初始化新IP变量)
set gateway= #(初始化新网关变量)
set dns1= #(初始化主DNS变量)
set dns2= #(初始化辅DNS变量)
set mask=255.255.255.0 #(设置子网掩码变量为255.255.255.0)
set wsusserver= #(初始化WSUS服务器变量)
set ntpserver= #(初始化NTP服务器变量)
set wsusserver=http://192.168.127.198 #(为WSUS服务器赋予指定IP)
set ntpserver="192.168.127.103" #(为NTP服务器赋予指定IP)
goto ver
:zb #(设置灾备环境的所有参数)
set adapter= #(初始化网卡变量)
set oldip= #(初始化旧IP变量)
set newip= #(初始化新IP变量)
set gateway= #(初始化新网关变量)
set dns1=192.168.127.1 #(为DNS1服务器赋予指定IP)
set dns2=192.168.127.200 #(为DNS2服务器赋予指定IP)
set mask=255.255.255.0 #(设置子网掩码变量为255.255.255.0)
set wsusserver= #(初始化WSUS服务器变量)
set ntpserver= #(初始化NTP服务器变量)
set wsusserver=http://192.168.16.54 #(为WSUS服务器赋予指定IP)
set ntpserver="192.168.16.54" #(为NTP服务器赋予指定IP)
goto ver
:ver #(判断Windows版本是2003还是2008)
ver | find /i "6.1." > NUL
if %errorlevel% equ 0 (goto win2008)
ver | find /i "5.2." > NUL
if %errorlevel% equ 0 (goto win2003)
:win2008 # (如果是Win2008,则执行如下语句)
ipconfig | findstr /i "以太网适配器">c:\tmp\ipchange\adapter.txt
for /f "tokens=2*" %%i in (c:\tmp\ipchange\adapter.txt) do
@echo %%i %%j>c:\tmp\ipchange\adapter.txt
for /f "tokens=1 delims=:" %%i in (c:\tmp\ipchange\adapter.txt) do (
set adapter=%%i
echo %%i>c:\tmp\ipchange\adapter.txt
)
# 以上语句保存以太网适配器名称
ipconfig | findstr /i "IPv4">c:\tmp\ipchange\oldip.txt
for /f "tokens=2 delims=:" %%i in (c:\tmp\ipchange\oldip.txt) do
@echo %%i>c:\tmp\ipchange\oldip.txt
for /f "tokens=*" %%i in (c:\tmp\ipchange\oldip.txt) do
@echo %%i>c:\tmp\ipchange\oldip.txt
for /f %%i in (c:\tmp\ipchange\oldip.txt) do set oldip=%%i
# 以上语句保存旧IP
rem 获取DNS并保存
ipconfig /all | findstr /C:"DNS Servers" /C:"DNS 服务器
">c:\tmp\ipchange\olddns.txt
for /f "tokens=2 delims=:" %%i in (c:\tmp\ipchange\olddns.txt) do @echo %%i
| findstr "^[0-9]*.[0-9]*.[0-9]*.[0-9]">c:\tmp\ipchange\olddns.txt
for /f "tokens=*" %%i in (c:\tmp\ipchange\olddns.txt) do
@echo %%i>c:\tmp\ipchange\olddns.txt
# 以上语句保存旧DNS服务器,以备更换后有旧DNS的回溯
findstr /i "%oldip%"
c:\tmp\ipchange\ipcheck.txt>c:\tmp\ipchange\oldtonewip.txt
for /f "tokens=2" %%i in (c:\tmp\ipchange\oldtonewip.txt) do
@echo %%i>c:\tmp\ipchange\newip.txt
for /f %%i in (c:\tmp\ipchange\newip.txt) do set newip=%%i
# 以上语句查找字典文件ipcheck.txt中是否存在旧IP的条目,如果存在则提取与旧IP对应
的新IP值,并赋给newip变量
for /f "tokens=1-3 delims=." %%i in (c:\tmp\ipchange\newip.txt) do
echo %%i.%%j.%%k.254>c:\tmp\ipchange\gatewayip.txt
for /f %%i in (c:\tmp\ipchange\gatewayip.txt) do set gatewayip=%%i
# 以上语句提取newip变量中 以.为分隔符的前三位,最后一位设置为254,作为
GATEWAY的新值,并赋给gatewayip变量
rem 备份hosts文件,并根据字典文件的定义,替换hosts内关联节点对应的IP
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (C:\WINDOWS\system32\drivers\etc\hosts) do (set
var=%%i
set "var=!var:%oldip%=%newip%!"
echo !var! >> C:\WINDOWS\system32\drivers\etc\hosts.new
)
ren C:\WINDOWS\system32\drivers\etc\hosts hosts.old
copy C:\WINDOWS\system32\drivers\etc\hosts.old C:\tmp\ipchange
ren C:\WINDOWS\system32\drivers\etc\hosts.new hosts
endlocal
# 以上语句备份c:\windows\system32\drivers\etc\hosts文件,并根据字典文件的定义替换
hosts文件内关联节点对应的IP与主机名的映射关系
rem 自动设置新IP和网关 #(rem为脚本中的注释语句)
rem 自动设置新DNS #(rem为脚本中的注释语句)
netsh interface ipv4 set address "%adapter%" static %newip% %mask%
gateway=%gatewayip% 1
netsh interface ipv4 del dnsservers name="%adapter%" all
netsh interface ipv4 set dnsservers name="%adapter%" source=static %dns1%
register=primary validate=no
# netsh interface ipv4 add dnsservers "%adapter%" %dns2% index=2 validate=no
# 以上语句将先前几个步骤获取到的adapter、newip、gateway、dns1、dns2的变量,作为设置
的参数直接为Windows系统设置新IP、新网关和新DNS
goto envir # (跳转到envir,调整其他附加环境)
:win2003 # (如果是Win2003,则执行如下语句)
ipconfig | findstr /i "Ethernet adapter">c:\tmp\ipchange\adapter.txt
for /f "tokens=3* delims= " %%i in (c:\tmp\ipchange\adapter.txt) do
@echo %%i %%j>c:\tmp\ipchange\adapter.txt
for /f "tokens=1 delims=:" %%i in (c:\tmp\ipchange\adapter.txt) do (
set adapter=%%i
echo %%i>c:\tmp\ipchange\adapter.txt
)
# 以上语句保存以太网适配器的名称
ipconfig | findstr /i "IP Address">c:\tmp\ipchange\oldip.txt
for /f "tokens=2 delims=:" %%i in (c:\tmp\ipchange\oldip.txt) do
@echo %%i>c:\tmp\ipchange\oldip.txt
for /f "tokens=*" %%i in (c:\tmp\ipchange\oldip.txt) do
@echo %%i>c:\tmp\ipchange\oldip.txt
for /f %%i in (c:\tmp\ipchange\oldip.txt) do set oldip=%%i
# 以上语句保存旧IP
rem 获取DNS并保存
ipconfig /all | findstr /C:"DNS Servers" /C:"DNS 服务器
">c:\tmp\ipchange\olddns.txt
for /f "tokens=2 delims=:" %%i in (c:\tmp\ipchange\olddns.txt) do @echo %%i
| findstr "^[0-9]*.[0-9]*.[0-9]*.[0-9]">c:\tmp\ipchange\olddns.txt
for /f "tokens=*" %%i in (c:\tmp\ipchange\olddns.txt) do
@echo %%i>c:\tmp\ipchange\olddns.txt
# 以上语句保存旧DNS服务器,以备更换后有旧DNS的回溯
findstr /i "%oldip%\>"
c:\tmp\ipchange\ipcheck.txt>c:\tmp\ipchange\oldtonewip.txt
for /f "tokens=2" %%i in (c:\tmp\ipchange\oldtonewip.txt) do
@echo %%i>c:\tmp\ipchange\newip.txt
for /f %%i in (c:\tmp\ipchange\newip.txt) do set newip=%%i
# 以上语句查找字典文件ipcheck.txt中是否存在旧IP的条目,如果存在则提取与旧IP对应
的新IP值,并赋给newip变量
for /f "tokens=1-3 delims=." %%i in (c:\tmp\ipchange\newip.txt) do
echo %%i.%%j.%%k.254>c:\tmp\ipchange\gatewayip.txt
for /f %%i in (c:\tmp\ipchange\gatewayip.txt) do set gatewayip=%%i
# 以上语句提取newip变量中 以.为分隔符的前三位,最后一位设置为254,作为
GATEWAY的新值,并赋给gatewayip变量
rem 备份并替换hosts文件
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (C:\WINDOWS\system32\drivers\etc\hosts) do (set
var=%%i
set "var=!var:%oldip%=%newip%!"
echo !var! >> C:\WINDOWS\system32\drivers\etc\hosts.new
)
ren C:\WINDOWS\system32\drivers\etc\hosts hosts.old
copy C:\WINDOWS\system32\drivers\etc\hosts.old C:\tmp\ipchange
ren C:\WINDOWS\system32\drivers\etc\hosts.new hosts
endlocal
# 以上语句备份c:\windows\system32\drivers\etc\hosts文件,并根据字典文件的定义替换
hosts文件内关联节点对应的IP与主机名的映射关系
rem 自动设置新IP和网关
rem 自动设置新DNS
netsh interface ip set address name="%adapter%" source=static %newip% %mask%
gateway=%gatewayip% auto
netsh interface ip del dns name="%adapter%" all
netsh interface ip set dns name="%adapter%" source=static %dns1%
register=primary
#netsh interface ip add dns "%adapter%" %dns2% index=2
# 以上语句将先前几个步骤获取到的adapter、newip、gateway、dns1、dns2的变量,作为设置
的参数直接为Windows系统设置新IP、新网关和新DNS
goto envir # (跳转到envir,调整其他附加环境)
:envir #(执行调整其他附加环境的语句)
rem ==========================================================================
rem 2.设置Patrol参数
echo Windows Registry Editor Version 5.00>c:\tmp\ipchange\patrolagent.reg
echo.>>c:\tmp\ipchange\patrolagent.reg
echo
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PatrolAgent\Paramete
rs]>>c:\tmp\ipchange\patrolagent.reg
echo "Port"=dword:00000c6d>>c:\tmp\ipchange\patrolagent.reg
echo "ID"="%newip%">>c:\tmp\ipchange\patrolagent.reg
regedit /s c:\tmp\ipchange\patrolagent.reg
# 以上语句将新IP写入PatrolAgent的注册表参数,确保Patrol监控软件正常工作
rem=======================================================================
rem 3.设置WSUS服务器参数
echo Windows Registry Editor Version 5.00>c:\tmp\ipchange\wsus.reg
echo.>>c:\tmp\ipchange\wsus.reg
echo
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\windows\WindowsUpdate]>>c:
\tmp\ipchange\wsus.reg
echo "WUServer"=%wsusserver%>>c:\tmp\ipchange\wsus.reg
echo "WUStatusServer"=%wsusserver%>>c:\tmp\ipchange\wsus.reg
echo.>>c:\tmp\ipchange\wsus.reg
echo
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\windows\WindowsUpdate\AU]>
>c:\tmp\ipchange\wsus.reg
echo "NoAutoUpdate"=dword:00000000>>c:\tmp\ipchange\wsus.reg
echo "AUOptions"=dword:00000003>>c:\tmp\ipchange\wsus.reg
echo "ScheduledInstallDay"=dword:00000000>>c:\tmp\ipchange\wsus.reg
echo "ScheduledInstallTime"=dword:00000017>>c:\tmp\ipchange\wsus.reg
echo "UseWUServer"=dword:00000001>>c:\tmp\ipchange\wsus.reg
regedit /s c:\tmp\ipchange\wsus.reg
# 以上语句将WSUS的IP及配置参数写入注册表,确保Windows客户端能从WSUS正确获取
更新补丁
rem=======================================================================
rem 4.设置NTP服务器参数
echo Windows Registry Editor Version 5.00>c:\tmp\ipchange\ntp.reg
echo.>>c:\tmp\ipchange\ntp.reg
echo
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Ser
vers]>>c:\tmp\ipchange\ntp.reg
echo @="0">>c:\tmp\ipchange\ntp.reg
echo "0"=%ntpserver%>>c:\tmp\ipchange\ntp.reg
echo
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProvider
s\NtpClient]>>c:\tmp\ipchange\ntp.reg
echo "Enabled"=dword:00000001>>c:\tmp\ipchange\ntp.reg
echo "SpecialPollInterval"=dword:2a300>>c:\tmp\ipchange\ntp.reg
regedit /s c:\tmp\ipchange\ntp.reg
w32tm /config /manualpeerlist:%ntpserver% /syncfromflags:manual
/reliable:yes
w32tm /config /update
net stop w32time
net start w32time
w32tm /resync
sc config w32time start= auto
# 以上语句将NTP的IP及配置参数写入注册表,确保Windows客户端定期与NTP服务器同步
rem=======================================================================
rem 5.设置UAC禁用
reg add
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Sys
tem" /v "LocalAccountTokenFilterPolicy" /t REG_DWORD /d "1" /f
# 以上语句设置Windows的UAC功能
rem=======================================================================
rem 6.设置Administrator(管理员)及Patrol(监控平台用户)的密码
#net user administrator ???????? ????????请用实际密码代替
#net user patrol ******** ********请用实际密码代替
# 以上语句用于初始化重置Administrator和Patrol用户密码
rem=======================================================================
rem 7.关闭计算机
#shutdown /t 3 /s (shutdown前标注了#,所以此句只标注不执行)
:end
3.3.3 利用Shell脚本简化Linux逻辑节点的搬迁
下面是基于Linux Shell的脚本,主要实现功能为判断应用环境(研发和容灾),执行不同的Shell指令,将字典文件中的旧IP切换为对应的新IP:
#!/bin/bash
cd /tmp/ipchange
#dos2unix ipchange.sh
#dos2unix ipcheck.txt
echo ++++++++++++++++++++++++++++++++++++++++++++++++++++
echo + Welcome use redhat linux change patameter script +
echo ++++++++++++++++++++++++++++++++++++++++++++++++++++
read -p "Disaster Recovery Environment(R)|Develop Testing
Environment(T)|Exit(E):" evar
# 以上语句显示欢迎页面,同时还显示应用环境菜单,根据操作的选取,可跳转到不同的环境
zb_ntp1=192.168.16.105 #(为NTP1服务器赋予指定IP)
zb_ntp2=192.168.20.73 #(为NTP2服务器赋予指定IP)
zb_dns1=192.168.16.105 #(为主DNS服务器赋予指定IP)
zb_dns2=192.168.16.106 #(为辅DNS服务器赋予指定IP)
zb_yum= #(初始化YUM服务器变量)
# 以上语句设置灾备环境的所有参数
kfcs_ntp1=192.168.127.103 #(为NTP1服务器赋予指定IP)
kfcs_ntp2= #(初始化NTP2服务器变量)
kfcs_dns1=192.168.127.105 #(为主DNS服务器赋予指定IP)
kfcs_dns2=192.168.127.106 #(为辅DNS服务器赋予指定IP)
kfcs_yum= #(初始化YUM服务器变量)
# 以上语句设置开发环境的所有参数
dr(){ #(设置灾备环境的主程序)
################################
# Disaster Recovery Environment #
################################
# 保存旧IP信息
grep -i ipaddr /etc/sysconfig/network-scripts/ifcfg-eth0>/tmp/oldip.txt
awk -F= '{print $2}' /tmp/oldip.txt>/tmp/ipchange/oldip.txt
rm -f /tmp/oldip.txt
oldip=`awk '{print $0}' /tmp/ipchange/oldip.txt`
echo oldip=$oldip
echo
# 保存旧网关信息
grep -i gateway
/etc/sysconfig/network-scripts/ifcfg-eth0>/tmp/oldgatewayip.txt
awk -F= '{print $2}' /tmp/oldgatewayip.txt>/tmp/ipchange/oldgatewayip.txt
rm -f /tmp/oldgatewayip.txt
oldgatewayip=`awk '{print $0}' /tmp/ipchange/oldgatewayip.txt`
echo oldgatewayip=$oldgatewayip
echo
# 从字典文件中截取新旧IP比对值,提取新IP
grep "$oldip\>" /tmp/ipchange/ipcheck.txt>/tmp/oldtonewip.txt
awk '{print $2}' /tmp/oldtonewip.txt>/tmp/ipchange/newip.txt
mv /tmp/oldtonewip.txt /tmp/ipchange/oldtonewip.txt
newip=`awk '{print $1}' /tmp/ipchange/newip.txt`
echo newip=$newip
echo
# 在字典文件中进行比对,如果找不到IP对应关系则退出
count=`grep "$oldip\>" /tmp/ipchange/ipcheck.txt |wc –l`
if [ $count -eq 0 ];then
echo "no ip matched in ipcheck.txt, will exit in 5 seconds!!!"
sleep 5
exit 100
fi
grep "$oldip\>" /tmp/ipchange/ipcheck.txt>/tmp/oldtonewip.txt
awk '{print $2}' /tmp/oldtonewip.txt>/tmp/ipchange/newip.txt
mv /tmp/oldtonewip.txt /tmp/ipchange/oldtonewip.txt
newip=`awk '{print $1}' /tmp/ipchange/newip.txt`
echo newip=$newip
echo
# 定义新网关
awk -F. '{print $1"."$2"."$3"."254}'
/tmp/ipchange/newip.txt>/tmp/ipchange/newgatewayip.txt
newgatewayip=`awk '{print $1}' /tmp/ipchange/newgatewayip.txt`
echo newgatewayip=$newgatewayip
echo
#保存网卡的旧配置,并设置新定义的配置信息
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 /tmp/ipchange/ifcfg-eth0.old
sed -e "s/$oldip/$newip/g" ifcfg-eth0>ifcfg-eth0.tmp1
sed -e "s/$oldgatewayip/$newgatewayip/g" ifcfg-eth0.tmp1>ifcfg-eth0.tmp2
sed -e "/NETMASK/d" ifcfg-eth0.tmp2>ifcfg-eth0.tmp1
sed -e "/IPADDR/a\\NETMASK=255.255.255.0" ifcfg-eth0.tmp1>ifcfg-eth0.tmp2
rm -f ifcfg-eth0
cp ifcfg-eth0.tmp2 /tmp/ipchange/ifcfg-eth0.new
cp ifcfg-eth0.tmp2 ifcfg-eth0
rm -f ifcfg-eth0.tmp1
rm -f ifcfg-eth0.tmp2
cat /etc/sysconfig/network-scripts/ifcfg-eth0
#################################################################
# 备份hosts文件
cp -f /etc/hosts /tmp/ipchange/oldhosts.txt
# 根据字典定义的文件,替换hosts内关联节点对应的IP
for ip in $(cat /etc/hosts |egrep ^[0-9] |awk '{print $1}'|grep -v 127.0.0.1)
do
iprule=$(grep $ip /tmp/ipchange/ipcheck.txt |head -n 1)
if [ "$iprule" != "" ]
then
shipsec=$(echo $iprule |awk '{print $1}' |awk -F'.' '{print $1"."$2"."$3}')
cdipsec=$(echo $iprule |awk '{print $2}' |awk -F'.' '{print $1"."$2"."$3}')
echo "shipsec:$shipsec"
echo "cdipsec:$cdipsec"
sed -i "s/^$shipsec/$cdipsec/g" /etc/hosts
else
echo "WARNING: ip $ip not matched in ipcheck.txt"
fi
done
#################################################################
# 设置NTP信息(通过crontab定时更新)
crontab -l>/tmp/crontab.old
if [ -f /var/spool/cron/root ]
then
sed -i '/ntpdate/d' /var/spool/cron/root
fi
echo "*/5 * * * * /sbin/ntpdate $zb_ntp1">>/var/spool/cron/root
echo "*/5 * * * * /sbin/ntpdate $zb_ntp2">>/var/spool/cron/root
echo "tinker panic 0">/etc/ntp.conf
echo "restrict 127.0.0.1">>/etc/ntp.conf
echo "restrict default kod nomodify notrap">>/etc/ntp.conf
echo "server $zb_ntp1">>/etc/ntp.conf
echo "server $zb_ntp2">>/etc/ntp.conf
echo "keys /etc/ntp/keys">>/etc/ntp.conf
echo "driftfile /var/lib/ntp/drift">>/etc/ntp.conf
echo "$zb_ntp1">/etc/ntp/ntpservers
echo "$zb_ntp2">>/etc/ntp/ntpservers
echo "clock.redhat.com">>/etc/ntp/ntpservers
echo "clock2.redhat.com">>/etc/ntp/ntpservers
echo "$zb_ntp1">/etc/ntp/step-tickers
echo "$zb_ntp2">>/etc/ntp/step-tickers
echo "clock.redhat.com">>/etc/ntp/step-tickers
echo "clock2.redhat.com">>/etc/ntp/step-tickers
ntp=`cat /etc/ntp/ntpservers | head -1`
crontab –l
##################################################################
# 设置DNS信息
cp /etc/resolv.conf /tmp/ipchange/resolv.conf.old
echo domain cpic.com.cn>/etc/resolv.conf
echo nameserver $zb_dns1>>/etc/resolv.conf
echo nameserver $zb_dns2>>/etc/resolv.conf
dns=`sed -e '/nameserver/g' /etc/resolv.conf | awk -F " " '{print $2}'
/etc/resolv.conf | head -2 | tail -1`
###################################################################
# 设置监控平台参数
mv /home/patrol/startagent.sh /tmp/startagent.sh.old
echo su - patrol -c \"/home/patrol/Patrol3/PatrolAgent -id
$newip\">/home/patrol/startagent.sh
chown patrol:patrol /home/patrol/startagent.sh
chmod 774 /home/patrol/startagent.sh
####################################################################
# 重置关键用户密码
#echo ???????? | passwd root --stdin ????????请用实际密码代替
#echo ******** | passwd patrol --stdin ********请用实际密码代替
###################################################################
#shutdown computer
#shutdown -h now (shutdown前标注了#,所以此句只标注不执行)
service network restart
service ntpd stop
chkconfig ntpd off
echo "New IP is $newip"
echo "New primary DNS is $dns"
echo "New primary NTP is $ntp"
echo "Change is successful!"
}
# 以上语句在设置完所有配置信息后,需要重启网络服务,以确保新IP能够正常工作。
dt(){ #(设置开发环境的主程序)
####################################################
# 保存旧IP信息
grep -i ipaddr /etc/sysconfig/network-scripts/ifcfg-eth0>/tmp/oldip.txt
awk -F= '{print $2}' /tmp/oldip.txt>/tmp/ipchange/oldip.txt
rm -f /tmp/oldip.txt
oldip=`awk '{print $0}' /tmp/ipchange/oldip.txt`
echo oldip=$oldip
echo
# 保存旧网关信息
grep -i gateway
/etc/sysconfig/network-scripts/ifcfg-eth0>/tmp/oldgatewayip.txt
awk -F= '{print $2}' /tmp/oldgatewayip.txt>/tmp/ipchange/oldgatewayip.txt
rm -f /tmp/oldgatewayip.txt
oldgatewayip=`awk '{print $0}' /tmp/ipchange/oldgatewayip.txt`
echo oldgatewayip=$oldgatewayip
echo
# 从字典中文件中截取新旧IP比对值,提取新IP
grep "$oldip\>" /tmp/ipchange/ipcheck.txt>/tmp/oldtonewip.txt
awk '{print $2}' /tmp/oldtonewip.txt>/tmp/ipchange/newip.txt
mv /tmp/oldtonewip.txt /tmp/ipchange/oldtonewip.txt
newip=`awk '{print $1}' /tmp/ipchange/newip.txt`
echo newip=$newip
echo
# 在字典文件中比对,如果找不到IP对应关系则退出
count=`grep "$oldip\>" /tmp/ipchange/ipcheck.txt |wc –l`
if [ $count -eq 0 ];then
echo "no ip matched in ipcheck.txt, will exit in 5 seconds!!!"
sleep 5
exit 100
fi
grep "$oldip\>" /tmp/ipchange/ipcheck.txt>/tmp/oldtonewip.txt
awk '{print $2}' /tmp/oldtonewip.txt>/tmp/ipchange/newip.txt
mv /tmp/oldtonewip.txt /tmp/ipchange/oldtonewip.txt
newip=`awk '{print $1}' /tmp/ipchange/newip.txt`
echo newip=$newip
echo
# 定义新网关
awk -F. '{print $1"."$2"."$3"."254}'
/tmp/ipchange/newip.txt>/tmp/ipchange/newgatewayip.txt
newgatewayip=`awk '{print $1}' /tmp/ipchange/newgatewayip.txt`
echo newgatewayip=$newgatewayip
echo
#保存网卡的旧配置,并设置新定义的配置信息
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth0 /tmp/ipchange/ifcfg-eth0.old
sed -e "s/$oldip/$newip/g" ifcfg-eth0>ifcfg-eth0.tmp1
sed -e "s/$oldgatewayip/$newgatewayip/g" ifcfg-eth0.tmp1>ifcfg-eth0.tmp2
sed -e "/NETMASK/d" ifcfg-eth0.tmp2>ifcfg-eth0.tmp1
sed -e "/IPADDR/a\\NETMASK=255.255.255.0" ifcfg-eth0.tmp1>ifcfg-eth0.tmp2
rm -f ifcfg-eth0
cp ifcfg-eth0.tmp2 /tmp/ipchange/ifcfg-eth0.new
cp ifcfg-eth0.tmp2 ifcfg-eth0
rm -f ifcfg-eth0.tmp1
rm -f ifcfg-eth0.tmp2
cat /etc/sysconfig/network-scripts/ifcfg-eth0
#################################################################
# 备份hosts文件
cp -f /etc/hosts /tmp/ipchange/oldhosts.txt
for ip in $(cat /etc/hosts |egrep ^[0-9] |awk '{print $1}'|grep -v 127.0.0.1)
do
iprule=$(grep $ip /tmp/ipchange/ipcheck.txt |head -n 1)
if [ "$iprule" != "" ]
then
shipsec=$(echo $iprule |awk '{print $1}' |awk -F'.' '{print $1"."$2"."$3}')
cdipsec=$(echo $iprule |awk '{print $2}' |awk -F'.' '{print $1"."$2"."$3}')
echo "shipsec:$shipsec"
echo "cdipsec:$cdipsec"
sed -i "s/^$shipsec/$cdipsec/g" /etc/hosts
else
echo "WARNING: ip $ip not matched in ipcheck.txt"
fi
done
#################################################################
# 设置NTP信息(通过crontab定时更新)
crontab -l>/tmp/crontab.old
if [ -f /var/spool/cron/root ]
then
sed -i '/ntpdate/d' /var/spool/cron/root
fi
echo "*/5 * * * * /sbin/ntpdate $kfcs_ntp1">>/var/spool/cron/root
#echo "*/5 * * * * /sbin/ntpdate $kfcs_ntp2">>/var/spool/cron/root
echo "tinker panic 0">/etc/ntp.conf
echo "restrict 127.0.0.1">>/etc/ntp.conf
echo "restrict default kod nomodify notrap">>/etc/ntp.conf
echo "server $kfcs_ntp1">>/etc/ntp.conf
echo "server $kfcs_ntp2">>/etc/ntp.conf
echo "keys /etc/ntp/keys">>/etc/ntp.conf
echo "driftfile /var/lib/ntp/drift">>/etc/ntp.conf
echo "$kfcs_ntp1">/etc/ntp/ntpservers
echo "$kfcs_ntp2">>/etc/ntp/ntpservers
echo "clock.redhat.com">>/etc/ntp/ntpservers
echo "clock2.redhat.com">>/etc/ntp/ntpservers
echo "$kfcs_ntp1">/etc/ntp/step-tickers
echo "$kfcs_ntp2">>/etc/ntp/step-tickers
echo "clock.redhat.com">>/etc/ntp/step-tickers
echo "clock2.redhat.com">>/etc/ntp/step-tickers
ntp=`cat /etc/ntp/ntpservers | head -1`
crontab -l
##################################################################
# 设置DNS信息
cp /etc/resolv.conf /tmp/ipchange/resolv.conf.old
> /etc/resolv.conf
dns=`sed -e '/nameserver/g' /etc/resolv.conf | awk -F " " '{print $2}' /etc/
resolv.conf | head -2 | tail -1`
###################################################################
# 设置监控平台参数
mv /home/patrol/startagent.sh /tmp/startagent.sh.old
echo su - patrol -c \"/home/patrol/Patrol3/PatrolAgent -id
$newip\">/home/patrol/startagent.sh
chown patrol:patrol /home/patrol/startagent.sh
chmod 774 /home/patrol/startagent.sh
####################################################################
# 重置关键用户密码
#echo ???????? | passwd root --stdin ????????请用实际密码代替
#echo ******** | passwd patrol --stdin ********请用实际密码代替
###################################################################
#shutdown computer
#shutdown -h now (shutdown前标注了#,所以此句只标注不执行)
service network restart
service ntpd stop
chkconfig ntpd off
echo "New IP is $newip"
echo "New primary DNS is $dns"
echo "New primary NTP is $ntp"
echo "Change is successful!"
}
# 以上语句在设置完所有配置信息后,需要重启网络服务,以确保新IP能够正常工作。
ex() {
echo "Nothing is changed!"
exit 0
}
# 以上语句为设置CASE语句场景的ex函数,选取E|e时,不执行任何操作,直接退出。
case "$evar" in
R|r)
dr
;;
T|t)
dt
;;
E|e)
ex
;;
*)
# echo $"Usage: $0 {R|T|E}"
# exit 1
Esac
# 以上语句为CASE语句场景,可根据不同的选择执行灾备环境、开发环境的参数调整指令,
或者不执行任何操作,直接退出。
以下为Linux示例的截图:
原始状态,打开虚拟机后初始IP的后两位为192.101,如图3-21所示。
图3-21 旧IP显示截图
执行ipchange脚本时,要求用户根据提示选取执行环境,我们输入R(灾备环境),如
图3-22所示。
图3-22 选取执行环境截图
执行ipchange脚本后,我们可以看到切换成功的提示,如图3-23所示。
图3-23 显示IP替换完成
执行ipchange脚本后,可以看到最后两位已经替换为100.101了,如图3-24所示。
图3-24 新IP显示截图
3.3.4 通过SFTP和WMIC指令将脚本文件上传至所有虚拟机
3.3.2和3.3.3节我们完成了切换脚本的编制,我们要在源存储与目标存储保持复制关系的期间,将切换脚本及字典文件上传至所有逻辑节点的指定目录,以确保复制关系断开后目标虚拟机中存在切换用的脚本。
1.?基于Linux的上传
所有Linux默认都通过SSH方式访问,因此我们可以利用SFTP功能模块将切换脚本和字典文件上传至所有Linux节点的指定位置。
(1)先搭建一台上传用的Linux脚本机,安装LFTP包,将涉及Linux节点的IP保存为/tmp/ip.txt。
(2)同时编制以下脚本:
#! /bin/bash
for i in `cat /tmp/ip.txt`
do
lftp –u 用户名@密码 sftp://$i <<EOF >>/tmp/sftp.log
mkdir /tmp/ipchange
cd /tmp/ipchange
lcd /tmp
mput ipchange.sh ipcheck.txt
EOF
done
2.?基于Windows的上传
环境中所有Windows节点均启用了WMI管理模块,WMIC提供了从命令行接口和批命令脚本执行系统管理的支持。因此我们可以利用WMIC将切换脚本和字典文件上传至所有Windows节点的指定位置。
我们同样首先搭建一台上传用的Windows脚本机,将涉及Windows节点的IP保存为d:\windows-script\ip.txt,同时编制以下脚本:
@echo off
del d:\windows-script\ip.log
for /f "skip=1 eol=# tokens=1,2,3 delims= " %%i in (d:\windows-script\ip.txt)
do (@echo %%i >> d:\windows-script\ip.log
net use s: \\%%i\c$ /user:%%j %%k >> d:\windows-script\ip.log
mkdir s:\ipchange
xcopy d:\windows-script\ipchange.cmd s:\ipchange /s /y >>
d:\windows-script\ip.log
xcopy d:\windows-script\ipcheck.txt s:\ipchange /s /y >>
d:\windows-script\ip.log
net use s: /delete >> ip.log
)
3.3.5 搬迁期间的注意事项
由于是通过存储底层复制技术进行的逻辑迁移,因此在目标端完成注册,并调整虚拟机名称后,在vCenter管理界面看到的是改名为目标IP的虚拟机名称。但存储底层的数据文件仍然是以原始IP命名的。
为防止给以后的运维留下后患,需要对虚拟机进行一次存储VMotion的操作,这样存储内的虚拟机文件名在存储迁移的同时就能自动调整为新IP的文件名了。
浏览存储底层所看到的文件情况,如图3-25所示。
图3-25 数据存储内部虚拟机的文件结构
以上的脚本是利用Shell脚本简化Linux逻辑节点的搬迁,在实际运行中还有不完善的地方。由于未包含操作系统判别语句,目前仅在RHEL5和RHEL6系列上测试通过,因此大家可以根据实际情况添加判断语句以适应RHEL较新的7版本或其他Linux版本。另外也可完善逻辑语句使得脚本更加严谨可靠。
字典文件ipcheck.txt中的IP对应关系,需要确保IP地址的唯一,相同的新旧IP对应关系只能有一行。同时也要防止同一个旧IP对应多个新IP的情况。