天天看點

運維前線:一線運維專家的運維方法、技巧與實踐3.3 利用批處理與Shell腳本簡化邏輯節點的搬遷

<b>3.3 利用批處理與shell腳本簡化邏輯節點的搬遷</b>

<b></b>

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切換腳本,請根據切換環境輸入指定的參數!+

@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 dns1=192.168.127.1                     #(為dns1伺服器賦予指定ip)

set dns2=192.168.127.200                   #(為dns2伺服器賦予指定ip)

set wsusserver=http://192.168.16.54        #(為wsus伺服器賦予指定ip)

set ntpserver="192.168.16.54"              #(為ntp伺服器賦予指定ip)

:ver #(判斷windows版本是2003還是2008)

ver | find /i "6.1." &gt; nul

if %errorlevel% equ 0 (goto win2008)

ver | find /i "5.2."  &gt; nul

if %errorlevel% equ 0 (goto win2003)

:win2008                                   # (如果是win2008,則執行如下語句)

ipconfig | findstr /i "以太網擴充卡"&gt;c:\tmp\ipchange\adapter.txt

for /f "tokens=2*" %%i in (c:\tmp\ipchange\adapter.txt) do

@echo %%i %%j&gt;c:\tmp\ipchange\adapter.txt

for /f "tokens=1 delims=:" %%i in (c:\tmp\ipchange\adapter.txt) do (

set adapter=%%i

echo %%i&gt;c:\tmp\ipchange\adapter.txt

)

# 以上語句儲存以太網擴充卡名稱

ipconfig | findstr /i "ipv4"&gt;c:\tmp\ipchange\oldip.txt

for /f "tokens=2 delims=:" %%i in (c:\tmp\ipchange\oldip.txt) do

@echo %%i&gt;c:\tmp\ipchange\oldip.txt

for /f "tokens=*" %%i in (c:\tmp\ipchange\oldip.txt) do

for /f %%i in (c:\tmp\ipchange\oldip.txt) do set oldip=%%i

# 以上語句儲存舊ip

rem 擷取dns并儲存

ipconfig /all | findstr /c:"dns servers" /c:"dns 伺服器

"&gt;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]"&gt;c:\tmp\ipchange\olddns.txt

for /f "tokens=*" %%i in (c:\tmp\ipchange\olddns.txt) do

@echo %%i&gt;c:\tmp\ipchange\olddns.txt

# 以上語句儲存舊dns伺服器,以備更換後有舊dns的回溯

findstr /i "%oldip%"

c:\tmp\ipchange\ipcheck.txt&gt;c:\tmp\ipchange\oldtonewip.txt

for /f "tokens=2" %%i in (c:\tmp\ipchange\oldtonewip.txt) do

@echo %%i&gt;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&gt;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! &gt;&gt; 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"&gt;c:\tmp\ipchange\adapter.txt

for /f "tokens=3* delims= " %%i in (c:\tmp\ipchange\adapter.txt) do

# 以上語句儲存以太網擴充卡的名稱

ipconfig | findstr /i "ip address"&gt;c:\tmp\ipchange\oldip.txt

findstr /i "%oldip%\&gt;"

rem 備份并替換hosts檔案

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

goto envir # (跳轉到envir,調整其他附加環境)

:envir #(執行調整其他附加環境的語句)

rem ==========================================================================

rem 2.設定patrol參數

echo windows registry editor version 5.00&gt;c:\tmp\ipchange\patrolagent.reg

echo.&gt;&gt;c:\tmp\ipchange\patrolagent.reg

echo

[hkey_local_machine\system\currentcontrolset\services\patrolagent\paramete

rs]&gt;&gt;c:\tmp\ipchange\patrolagent.reg

echo "port"=dword:00000c6d&gt;&gt;c:\tmp\ipchange\patrolagent.reg

echo "id"="%newip%"&gt;&gt;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&gt;c:\tmp\ipchange\wsus.reg

echo.&gt;&gt;c:\tmp\ipchange\wsus.reg

[hkey_local_machine\software\policies\microsoft\windows\windowsupdate]&gt;&gt;c:

\tmp\ipchange\wsus.reg

echo "wuserver"=%wsusserver%&gt;&gt;c:\tmp\ipchange\wsus.reg

echo "wustatusserver"=%wsusserver%&gt;&gt;c:\tmp\ipchange\wsus.reg

[hkey_local_machine\software\policies\microsoft\windows\windowsupdate\au]&gt;

&gt;c:\tmp\ipchange\wsus.reg

echo "noautoupdate"=dword:00000000&gt;&gt;c:\tmp\ipchange\wsus.reg

echo "auoptions"=dword:00000003&gt;&gt;c:\tmp\ipchange\wsus.reg

echo "scheduledinstallday"=dword:00000000&gt;&gt;c:\tmp\ipchange\wsus.reg

echo "scheduledinstalltime"=dword:00000017&gt;&gt;c:\tmp\ipchange\wsus.reg

echo "usewuserver"=dword:00000001&gt;&gt;c:\tmp\ipchange\wsus.reg

regedit /s c:\tmp\ipchange\wsus.reg

# 以上語句将wsus的ip及配置參數寫入系統資料庫,確定windows用戶端能從wsus正确擷取

更新更新檔

rem 4.設定ntp伺服器參數

echo windows registry editor version 5.00&gt;c:\tmp\ipchange\ntp.reg

echo.&gt;&gt;c:\tmp\ipchange\ntp.reg

[hkey_local_machine\software\microsoft\windows\currentversion\datetime\ser

vers]&gt;&gt;c:\tmp\ipchange\ntp.reg

echo @="0"&gt;&gt;c:\tmp\ipchange\ntp.reg

echo "0"=%ntpserver%&gt;&gt;c:\tmp\ipchange\ntp.reg

[hkey_local_machine\system\currentcontrolset\services\w32time\timeprovider

s\ntpclient]&gt;&gt;c:\tmp\ipchange\ntp.reg

echo "enabled"=dword:00000001&gt;&gt;c:\tmp\ipchange\ntp.reg

echo "specialpollinterval"=dword:2a300&gt;&gt;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 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 6.設定administrator(管理者)及patrol(監控平台使用者)的密碼

#net user administrator ????????       ????????請用實際密碼代替

#net user patrol ********              ********請用實際密碼代替

# 以上語句用于初始化重置administrator和patrol使用者密碼

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 +

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&gt;/tmp/oldip.txt

awk -f= '{print $2}' /tmp/oldip.txt&gt;/tmp/ipchange/oldip.txt

rm -f /tmp/oldip.txt

oldip=`awk '{print $0}' /tmp/ipchange/oldip.txt`

echo oldip=$oldip

# 儲存舊網關資訊

grep -i gateway

/etc/sysconfig/network-scripts/ifcfg-eth0&gt;/tmp/oldgatewayip.txt

awk -f= '{print $2}' /tmp/oldgatewayip.txt&gt;/tmp/ipchange/oldgatewayip.txt

rm -f /tmp/oldgatewayip.txt

oldgatewayip=`awk '{print $0}' /tmp/ipchange/oldgatewayip.txt`

echo oldgatewayip=$oldgatewayip

# 從字典檔案中截取新舊ip比對值,提取新ip

grep "$oldip\&gt;" /tmp/ipchange/ipcheck.txt&gt;/tmp/oldtonewip.txt

awk '{print $2}' /tmp/oldtonewip.txt&gt;/tmp/ipchange/newip.txt

mv /tmp/oldtonewip.txt /tmp/ipchange/oldtonewip.txt

newip=`awk '{print $1}' /tmp/ipchange/newip.txt`

echo newip=$newip

# 在字典檔案中進行比對,如果找不到ip對應關系則退出

count=`grep "$oldip\&gt;" /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

# 定義新網關

awk -f. '{print $1"."$2"."$3"."254}'

/tmp/ipchange/newip.txt&gt;/tmp/ipchange/newgatewayip.txt

newgatewayip=`awk '{print $1}' /tmp/ipchange/newgatewayip.txt`

echo newgatewayip=$newgatewayip

#儲存網卡的舊配置,并設定新定義的配置資訊

cd /etc/sysconfig/network-scripts/

cp ifcfg-eth0 /tmp/ipchange/ifcfg-eth0.old

sed -e "s/$oldip/$newip/g" ifcfg-eth0&gt;ifcfg-eth0.tmp1

sed -e "s/$oldgatewayip/$newgatewayip/g" ifcfg-eth0.tmp1&gt;ifcfg-eth0.tmp2

sed -e "/netmask/d" ifcfg-eth0.tmp2&gt;ifcfg-eth0.tmp1

sed -e "/ipaddr/a\\netmask=255.255.255.0" ifcfg-eth0.tmp1&gt;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"

done

# 設定ntp資訊(通過crontab定時更新)

crontab -l&gt;/tmp/crontab.old

if [ -f /var/spool/cron/root ]

sed -i '/ntpdate/d' /var/spool/cron/root

echo "*/5 * * * * /sbin/ntpdate $zb_ntp1"&gt;&gt;/var/spool/cron/root

echo "*/5 * * * * /sbin/ntpdate $zb_ntp2"&gt;&gt;/var/spool/cron/root

echo "tinker panic 0"&gt;/etc/ntp.conf

echo "restrict 127.0.0.1"&gt;&gt;/etc/ntp.conf

echo "restrict default kod nomodify notrap"&gt;&gt;/etc/ntp.conf

echo "server $zb_ntp1"&gt;&gt;/etc/ntp.conf

echo "server $zb_ntp2"&gt;&gt;/etc/ntp.conf

echo "keys /etc/ntp/keys"&gt;&gt;/etc/ntp.conf

echo "driftfile /var/lib/ntp/drift"&gt;&gt;/etc/ntp.conf

echo "$zb_ntp1"&gt;/etc/ntp/ntpservers

echo "$zb_ntp2"&gt;&gt;/etc/ntp/ntpservers

echo "clock.redhat.com"&gt;&gt;/etc/ntp/ntpservers

echo "clock2.redhat.com"&gt;&gt;/etc/ntp/ntpservers

echo "$zb_ntp1"&gt;/etc/ntp/step-tickers

echo "$zb_ntp2"&gt;&gt;/etc/ntp/step-tickers

echo "clock.redhat.com"&gt;&gt;/etc/ntp/step-tickers

echo "clock2.redhat.com"&gt;&gt;/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&gt;/etc/resolv.conf

echo nameserver $zb_dns1&gt;&gt;/etc/resolv.conf

echo nameserver $zb_dns2&gt;&gt;/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\"&gt;/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比對值,提取新ip

# 在字典檔案中比對,如果找不到ip對應關系則退出

echo "*/5 * * * * /sbin/ntpdate $kfcs_ntp1"&gt;&gt;/var/spool/cron/root

#echo "*/5 * * * * /sbin/ntpdate $kfcs_ntp2"&gt;&gt;/var/spool/cron/root

echo "server $kfcs_ntp1"&gt;&gt;/etc/ntp.conf

echo "server $kfcs_ntp2"&gt;&gt;/etc/ntp.conf

echo "$kfcs_ntp1"&gt;/etc/ntp/ntpservers

echo "$kfcs_ntp2"&gt;&gt;/etc/ntp/ntpservers

echo "$kfcs_ntp1"&gt;/etc/ntp/step-tickers

echo "$kfcs_ntp2"&gt;&gt;/etc/ntp/step-tickers

crontab -l

&gt; /etc/resolv.conf

dns=`sed -e '/nameserver/g' /etc/resolv.conf | awk -f " " '{print $2}' /etc/

resolv.conf | head -2 | tail -1`

#echo ???????? | passwd root --stdin      ????????請用實際密碼代替

#echo ******** | passwd patrol --stdin    ********請用實際密碼代替

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`

lftp –u 使用者名@密碼 sftp://$i &lt;&lt;eof &gt;&gt;/tmp/sftp.log

mkdir /tmp/ipchange

lcd /tmp

mput ipchange.sh ipcheck.txt

eof

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 &gt;&gt; d:\windows-script\ip.log

net use s: \\%%i\c$ /user:%%j %%k &gt;&gt; d:\windows-script\ip.log

mkdir s:\ipchange

xcopy d:\windows-script\ipchange.cmd s:\ipchange /s /y &gt;&gt;

d:\windows-script\ip.log

xcopy d:\windows-script\ipcheck.txt s:\ipchange /s /y &gt;&gt;

net use s: /delete &gt;&gt; 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的情況。