运维前线:一线运维专家的运维方法、技巧与实践3.3 利用批处理与Shell脚本简化逻辑节点的搬迁

简介:

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的情况。

相关文章
|
3天前
|
消息中间件 运维 Kubernetes
构建高效自动化运维体系:Ansible与Kubernetes的融合实践
【5月更文挑战第9天】随着云计算和微服务架构的普及,自动化运维成为确保系统可靠性和效率的关键。本文将深入探讨如何通过Ansible和Kubernetes的集成,构建一个强大的自动化运维体系。我们将分析Ansible的配置管理功能以及Kubernetes容器编排的优势,并展示如何将二者结合,以实现持续部署、快速扩展和高效管理现代云原生应用。文章还将涵盖实际案例,帮助读者理解在真实环境下如何利用这些工具优化运维流程。
|
3天前
|
Shell Linux
【Linux】进程实践项目(更新中) — 自主shell编写
前几篇文章,我们学习进程的相关知识:进程概念,进程替换,进程控制。熟悉了进程到底是个什么事情,接下来我们来做一个实践,来运用我们所学的相关知识。这个项目就是手搓一个shell模块,模拟实现Xshell中的命令行输入。
10 1
|
4天前
|
监控 关系型数据库 Shell
Shell脚本入门:从基础到实践,轻松掌握Shell编程
Shell脚本入门:从基础到实践,轻松掌握Shell编程
|
4天前
|
运维 Kubernetes 监控
构建高效自动化运维体系:基于Ansible的策略与实践
【5月更文挑战第8天】 在当今IT基础设施管理领域,自动化不再是一个选择,而是必要的步骤。随着复杂性的增加和变更的频繁性,自动化工具如Ansible提供了一种高效、可靠的解决方案来简化配置管理和多节点部署。本文将探讨如何利用Ansible构建一个高效的自动化运维体系,涵盖其核心原理、策略设计以及在实际环境中的应用。我们将分析Ansible与其他自动化工具的不同之处,并提供一些最佳实践,以帮助运维专家提升他们的工作效率和系统稳定性。
|
6天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器化技术融合实践
【5月更文挑战第6天】随着企业IT架构的复杂化以及快速迭代的市场需求,传统的运维模式已难以满足高效率和高质量的交付标准。本文将探讨如何通过结合DevOps理念和容器化技术来构建一个高效的自动化运维体系,旨在实现持续集成、持续部署和自动化管理,提升系统的可靠性、可维护性和敏捷性。
|
7天前
|
存储 机器学习/深度学习 运维
提升数据中心能效:现代运维策略与实践
【5月更文挑战第6天】 在数字化时代,数据中心作为信息处理的核心设施,其能源消耗和环境影响成为业界关注的焦点。本文将探讨如何通过现代运维策略和技术手段提升数据中心的能效,同时保证系统的可靠性和服务的连续性。文章将详细分析数据中心能耗的主要来源,介绍先进的能效优化措施,并通过案例分析展示这些措施的实际效果,为数据中心管理者提供实用的能效改进建议。
|
12天前
|
敏捷开发 运维 测试技术
构建高效自动化运维体系:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】在数字化转型的浪潮中,企业对软件交付速度和质量的要求日益提高。自动化运维作为提升效率、确保稳定性的关键手段,其重要性不言而喻。本文将探讨如何利用容器技术构建一个高效的自动化运维体系,实现从代码提交到产品上线的持续集成(CI)与持续部署(CD)。通过分析现代容器技术与传统虚拟化的差异,阐述容器化带来的轻量化、快速部署及易于管理的优势,并结合实例讲解如何在实际环境中搭建起一套完善的CI/CD流程。
|
12天前
|
运维 Kubernetes 持续交付
构建高效自动化运维系统:基于容器技术的持续集成与持续部署实践
【4月更文挑战第30天】 在快速发展的云计算时代,传统的运维模式已无法满足敏捷开发和快速迭代的需求。本文将介绍如何利用容器技术搭建一套高效自动化运维系统,实现软件的持续集成(CI)与持续部署(CD)。文章首先探讨了现代运维面临的挑战,接着详细阐述了容器技术的核心组件和工作原理,最后通过实际案例展示了如何整合这些组件来构建一个可靠、可扩展的自动化运维平台。
|
12天前
|
机器学习/深度学习 运维 监控
构建高效自动化运维体系:从理论到实践
【4月更文挑战第30天】 在信息技术日益发展的今天,自动化运维已经成为提高系统稳定性、优化资源配置和降低人力成本的关键。本文旨在探讨如何构建一个高效的自动化运维体系,涵盖从初步规划到具体实施的全过程。文章首先分析了自动化运维的必要性,接着提出一套完整的构建方案,并详细阐述了关键技术与工具的选择和应用。通过案例分析,验证了所提方案的有效性,并对自动化运维的未来趋势进行了展望。
|
12天前
|
运维 监控 安全
构建高效自动化运维系统:策略与实践
【4月更文挑战第30天】 在现代IT基础设施管理中,自动化运维不再是可选项而是必需品。随着复杂性的增加和变更的频繁性,自动化可以提高效率、减少错误并释放人员专注于更有价值的任务。本文将探讨构建一个高效的自动化运维系统的关键环节,包括工具选择、流程设计以及监控和优化策略。通过案例分析和最佳实践分享,读者可以获得实施自动化运维的实用指导和启发。