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

    xiaoxiao2023-12-31  161

    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 "

    转载请注明原文地址: https://yun.8miu.com/read-116716.html
    最新回复(0)