3.2 利用VMware脚本简化虚拟化层的搬迁
我们需要在完成ESXI安装后执行如下虚拟化层的操作:
(1)为安装完成的ESXI开通ESXI Shell和远程SSH功能,确保可以批量管理ESXI。
(2)打开VMware底层的VMotion功能以保证虚拟机的灵活迁移。
(3)为ESXI建立vSwitch,并新建port group(也就是网络交换机的概念,这种技术也称之为VLAN),以保证注册的虚拟机节点能通过新建的虚拟网络与外部节点正常通信。
(4)批量挂载外挂存储,以确保虚拟机节点有可用的空间。
(5)注册虚拟机至vCenter。
(6)将源端vCenter的目录结构复制到目标端vCenter,并将虚拟机移动至指定的位置。
(7)在vCenter显示界面为每个虚拟机改名,并配置对应的port group。
(8)启动虚拟机。
3.2.1 通过脚本完成ESXI安装后的基础设置
(1)手工完成ESXI的安装后,请确认已经开启了ESXI Shell和SSH,如图3-3所示。
我们可利用以下命令来开启VMotion:
vim-cmd hostsvc/vmotion/vnic_set vmk0
VMotion功能可以实现虚拟机人工漂移或自动漂移。开启这个功能之后,注册在同一台ESXI的虚拟机在开启时就可以漂移至同一群集的所有物理机上,从而实现均衡运行。
图3-3 确认开启ESXI Shell和SSH
(2)网络配置(利用收集的虚拟化层的信息,根据规划完成ESXI的虚拟网络设置)。
由于公司网络规划采用了不同的区域,不同区域设备的上联端口并不统一,因此不适合使用DVS vSwitch,另外如果采用Host Profile绑定的方式,一旦宿主机配置有改动,就可能产生不合规提示。因此我决定根据规划,在不同的区域通过批量脚本的方式建立vSwitch和绑定port group
ESXI安装后默认生成vSwtich0作为管理用的交换机,我们需根据规划增加业务用的交换机,举例如下。
(1)添加名为vSwitch1的虚拟交换机,可使用如下命令:
esxcli network vswitch standard add -v vSwitch1
或者使用如下命令:
esxcfg-vswitch -a vSwitch1
VMware公司发布vSphere 4时引入了ESXCLI命令集,在vSphere5时大大强化了ESXCLI指令的功能,使其逐步替代类似于esxcfg的旧指令集。
执行命令后,运行结果如图3-4所示。
(2)查看上联口情况,可使用如下命令:
esxcli network nic list
或者使用如下命令:
esxcfg-nics –l
执行命令后,运行结果如图3-5所示。
(3)将对应的物理网卡绑定到vSwitch1(vmnic2/vmnic3,根据实际连线情况绑定到指定的物理网卡),可使用如下命令:
图3-4 确认ESXI网络配置增加了vSwitch1
图3-5 确认vmnic0和vmnic1为活动的上联端口
esxcli network vswitch standard uplink add -u vmnic2(vmnic3) -v vSwitch1
或者使用如下命令:
esxcfg-vswitch -L vmnic2(vmnic3) vSwitch1
执行命令后,运行结果如图3-6所示。
图3-6 确认vmnic2和vmnic3被绑定至vSwitch1,作为vSwitch1的上联端口
(4)激活已添加在vSwitch1内的物理网卡vmnic2/vmnic3(双活模式),可使用如下命令:
esxcli network vswitch standard policy failover set -a vmnic2,vmnic3 -v vSwitch1
执行命令后,运行结果如图3-7所示。
图3-7 确认vmnic2和vmnic3作为双活策略被激活
(5)添加名为vlan1到vlan20的port group到vSwitch1,可使用如下命令:
for i in `seq 1 20`;do esxcli network vswitch standard portgroup add -p vlan$i
-v vSwitch1;done
或者使用如下命令:
for i in `seq 1 20`;do esxcfg-vswitch -A vlan$i vSwitch1;done
执行命令后,运行结果如图3-8所示。
(6)将对应vlanid为1到20的vlan与对应的port group绑定,可使用如下命令:
for i in `seq 1 20`;do esxcli network vswitch standard portgroup set -p vlan$i
-v $i;done
在同一ESXI主机下不同vSwitch中的port group是不能使用同一名字命名的,因此以上ESXCLI的命令可直接针对指定的port group分配vlanid,而不必指明确切的vSwitch。
或者使用如下命令:
for i in `seq 1 20`;do esxcfg-vswitch -v $i -p vlan$i vSwitch1;done
为减少循环,提高效率可将以上语句合并如下:
for i in `seq 1 20`;do esxcfg-vswitch -A vlan$i vSwitch1;esxcfg-vswitch -v $i
-p vlan$i vSwitch1;done
执行命令后,运行结果如图3-9所示。
图3-8 确认建立了以vlan1到vlan20命名的port group
图3-9 确认绑定了vlan1到vlan20的ID到对应的port group
3.2.2 批量挂载数据盘
ESXI对于生成的每个VMFS DATASTORE都存在一个唯一的UUID,当对其进行LUN COPY操作时,原有的UUID也一并被复制到目标盘上。如果试图将目标盘挂载在与源盘同在一个的vCenter环境中时,系统会显示UUID已存在,从而导致挂载失败。只有通过重新签名更改目标盘的UUID,方可与源盘挂载在同一环境中。
因此我们事先在目标数据中心搭建了新的vCenter服务器。
下面来举例说明VMware主机批量挂载LUN COPY华为存储的具体步骤。
1.?批量挂载LUN COPY的数据盘
(1)确认外挂盘数量:
esxcli storage core device list | grep "HUAWEI" | awk -F"(" '{print $2}' | awk
-F ")" '{print $1}' | grep naa. | wc -l
50
以上命令表示搜索ESXI宿主机上属于华为存储盘的个数,返回值为50,表明有50块外挂盘被挂载到宿主机物理设备上。我们可与存储管理人员确认挂载的数量是否一致,如有不一致的情况,可重新扫盘确认。
(2)收集挂载设备的标识符:
esxcli storage vmfs snapshot list | grep "Volume Name" | awk -F":" '{print
$2}' >/tmp/devices
以上命令将确认的LUN COPY属性盘的WWN号输出至/tmp/devices文件。当完成LUN COPY盘WWN号的收集后,可将devices文件与存储管理人员提供的存储盘WWN号进行比对,以此确认提取信息是否正确。
(3)批量挂载LUN COPY盘:
for i in `cat /tmp/devices` ;do esxcli storage vmfs snapshot mount -l $i;done
以上命令循环读取输出至/tmp/devices文件的外挂LUN COPY盘的WWN号,并挂载这些LUN COPY盘至ESXI宿主机。
最终结果如图3-10所示。
图3-10 显示批量挂载的LUN COPY盘
存储挂载名称建议根据“存储品牌名_主机序列号_LUN号”命名。
以上操作只完成了对同一群集中某台主机的挂盘操作,我们只需要在同一群集的其他主机上通过执行扫描光纤链路的操作,即可让这些外挂盘被群集中的其他主机识别。具体步骤如下:配置→存储器→全部重新扫描。或者使用如下命令:
esxcli storage core adapter rescan
执行命令,运行结果如图3-11所示。
图3-11 显示同群集中其他主机批量挂载的LUN COPY盘
2.?批量挂载新分配的盘
下面将举例说明为VMware主机批量挂载LUN COPY华为存储新盘的具体步骤。
(1)确认新分配外挂盘的数量:
esxcli storage core device list | grep "HUAWEI" | awk -F"(" '{print $2}' | awk
-F ")" '{print $1}' | grep naa. | wc -l
50
以上命令表示搜索ESXI宿主机上属于华为存储盘的个数,返回值为50,表明有50块外挂盘被挂载到宿主机物理设备上。我们可与存储管理人员确认挂载的数量是否一致,如有不一致的情况,可重新扫盘确认。
(2)收集新分配外挂盘的标识符:
esxcli storage core device list | grep "HUAWEI" | awk -F"(" '{print $2}' | awk
-F ")" '{print $1}' | grep naa. >>/tmp/newdevice
naa.69017ac100aec92a7f8bfc7800000021
naa.69017ac100aec92a7f8bffa10000002a
naa.69017ac100aec92a7f8bfce200000022
……(省略中间的若干块盘)
naa.69017ac100aec92a7f8bf85100000013
naa.69017ac100aec92a7f8bf54e0000000a
naa.69017ac100aec92a7f8bf6b30000000e
以上命令只将新分配盘的WWN号输出至/tmp/newdevice文件。当完成新分配外挂盘WWN号的收集后,可将newdevices文件与存储管理人员提供的存储盘WWN号进行比对,以此确认提取信息是否正确。
(3)通过列编辑软件,将新挂盘名称列加入/tmp/newdevice文件。接着就可通过列编辑软件在WWN号所属的列前增加一列,用于标记新分配盘的名称,格式如下:
HUAWEI_ 214????26_ 214????28_LUN01,naa.69017ac100aec92a7f8bfc7800000021
HUAWEI_ 214????26_ 214????28_LUN02,naa.69017ac100aec92a7f8bffa10000002a
HUAWEI_ 214????26_ 214????28_LUN03,naa.69017ac100aec92a7f8bfce200000022
……(省略中间的若干块盘)
HUAWEI_ 214????26_ 214????28_LUN48,naa.69017ac100aec92a7f8bf85100000013
HUAWEI_ 214????26_ 214????28_LUN49,naa.69017ac100aec92a7f8bf54e0000000a
HUAWEI_ 214????26_ 214????28_LUN50,naa.69017ac100aec92a7f8bf6b30000000e
也可以远程连接至ESXI的CONSOLE界面,执行以下命令更新/tmp/newdevice文件的内容:
cat > /tmp/newdevice <<EOF
HUAWEI_ 214????26_ 214????28_LUN01,naa.69017ac100aec92a7f8bfc7800000021
HUAWEI_ 214????26_ 214????28_LUN02,naa.69017ac100aec92a7f8bffa10000002a
HUAWEI_ 214????26_ 214????28_LUN03,naa.69017ac100aec92a7f8bfce200000022
……(省略中间的若干块盘)
HUAWEI_ 214????26_ 214????28_LUN48,naa.69017ac100aec92a7f8bf85100000013
HUAWEI_ 214????26_ 214????28_LUN49,naa.69017ac100aec92a7f8bf54e0000000a
HUAWEI_ 214????26_ 214????28_LUN50,naa.69017ac100aec92a7f8bf6b30000000e
EOF
通过以上操作,我们定义了新分配盘的盘名和WWN号,作为后续新加盘命令的参数。
(4)批量为新增盘分区(以1TB和2TB的格式为例):
for i in `cat /tmp/newdevice | awk -F"," '{print $2}'`; do partedUtil setptbl
/vmfs/devices/disks/$i gpt "1 2048 2147483614
AA31E02A400F11DB9590000C2911D1B8 0"; done (按1TB盘的格式)
for i in `cat /tmp/newdevice | awk -F"," '{print $2}'`; do partedUtil setptbl
/vmfs/devices/disks/$i gpt "1 2048 4294961684
AA31E02A400F11DB9590000C2911D1B8 0"; done (按2TB盘的格式)
以上命令分别按1TB和2TB的参数,对新盘进行了分区。
(5)批量新建VMFS5文件系统并自动挂盘:
for i in `cat /tmp/newdevice` ;do name=`echo $i | awk -F"," '{print $1}'`
vid=`echo $i | awk -F"," '{print $2}'` ; vmkfstools -C vmfs5 -S $name -b 1m
/vmfs/devices/disks/$vid:1 ;done
以上命令对新盘进行了格式化操作,将其格式化为VMFS5的文件系统后,系统自动进行了挂盘操作。
如图3-12所示为正在挂盘操作的示例图。
图3-12 正在执行新盘的挂载
最终结果如图3-13所示:
图3-13 显示批量挂载的新分配盘
存储挂载的名称请以“存储品牌名_主机序列号_LUN号”命名。
以上操作只完成了对同一群集中某台主机的挂盘操作,我们只需要在同一群集的其他主机上通过执行扫描光纤链路的操作,即可让这些外挂盘被群集中的其他主机识别。具体步骤如下:配置→存储器→全部重新扫描。或者使用如下命令:
esxcli storage core adapter rescan
执行命令,运行结果如图3-14所示。
图3-14 显示同群集中其他主机批量挂载的新分配盘
3.2.3 批量注册虚拟机
3.2.2节中,我们已将50块LUN COPY的外挂盘挂给了一组刀片式服务器,接下来我们需要将所涉及的该批次的所有虚拟机注册进vCenter Server。
对群集中的第一台ESXI执行以下脚本,将所有虚拟机的配置文件.vmx导出到一个文件中。
find /vmfs/volumes/ -name *.vmx >/tmp/vmlist
为避免开机时因VM UUID重复而产生如图3-15所示的交互式问答的提示,我们可以执行如下命令,批量删除VMX中的uuid.bios和uuid.location,使虚拟机重新产生新的UUID:
for i in `cat /tmp/vmlist` ; do sed -i '/^uuid.bios/d' $i ; done
for i in `cat /tmp/vmlist` ; do sed -i '/^uuid.location/d' $i ; done
图3-15 因VM UUID重复而产生的提示
为避免虚拟机注册后遗留下如图3-16所示的“影子”网段信息,我们可执行以下命令,批量删除VMX中的ethernet0.networkName,使虚拟机去除老旧的网络信息:
for i in `cat /tmp/vmlist` ; do sed -i '/^ethernet0.networkName/d' $i ; done
图3-16 “影子”网段情况
以上是对VMX配置文件的信息修改,必须在将虚拟机注册进vCenter之前完成。如果先将虚拟机注册进vCenter,然后再执行以上操作,则不会有任何效果。
运行如下命令,注册虚拟机:
IFS=$(echo -en "\n\b")
for i in `cat /tmp/vmlist` ; do vim-cmd solo/registervm $i ; done
在注册的同时,我们会看见命令行窗口的数字正在逐渐增加,该数字表明为注册入vCenter Server的虚拟机分配的VMID,图3-17显示有1004个虚拟机完成了注册:
3.2.4 vCenter目录结构的调整
我们需要将源vCenter的目录结构原封不动地挪移到目标vCenter中,以确保新注册的虚拟机位置不变,因此我们需要导出源vCenter的目录结构,并导入至目标vCenter中。
(1)从源vCenter中导出目录结构:
New-VIProperty -Name 'BlueFolderPath' -ObjectType 'VirtualMachine' -Value {
param($vm)
function Get-ParentName{
param($object)
if($object.Folder){
$blue = Get-ParentName $object.Folder #获取路径
$name = $object.Folder.Name #获取vm_name
}
elseif($object.Parent -and $object.Parent.GetType().Name -like
"Folder*"){
$blue = Get-ParentName $object.Parent
$name = $object.Parent.Name
}
elseif($object.ParentFolder){
$blue = Get-ParentName $object.ParentFolder
$name = $object.ParentFolder.Name
}
if("vm","Datacenters" -notcontains $name){
$blue + "/" + $name
}
else{
$blue
}
}
(Get-ParentName $vm).Remove(0,1)
} -Force | Out-Null
$dcName = "zbvc00-vcenter"
Get-VM -Location (Get-Datacenter -Name $dcName) | Select Name,BlueFolderPath
| Export-Csv "C:\vm-folder.csv" -NoTypeInformation -UseCulture -encoding utf8
(2)将目录结构导入目标vCenter中(并将虚拟机移动至指定目录路径下):
$newDatacenter = "zbvc00-vcenter"
$startFolder = get-Folder -Name vm -Location (Get-Folder -Name vm -Location
(Get-Datacenter -Name $newDatacenter))
Import-Csv "C:\vm-folder.csv" -UseCulture | %{
$location = $startFolder
$_.BlueFolderPath.TrimStart('/').Split('/') | %{
$tgtFolder = Get-Folder -Name vm -Location $location -ErrorAction
SilentlyContinue
if(!$tgtFolder){
$location = New-Folder -Name $_ -Location $location
}
else{
$location = $tgtFolder
}
}
$vm = Get-VM -Name $_.Name -ErrorAction SilentlyContinue
if($vm){
Move-VM -VM $vm -Destination $location -Confirm:$false
}
}
以上脚本截取自VMware社区论坛,并根据实际情况修改而成。
3.2.5 批量更改虚拟机名称及port group
为了批量更改虚拟机名称及虚拟机所属的port group(VLAN),我们需要建立一个参数文件,参数文件的内容如图3-18所示。
图3-18 vCneter中为虚拟机改名和port group的文件格式
我们将参数文件保存为c:\zbportgroup.csv,由于主机名采用的是中文字符,因此保存参数文件时编码务必采用UTF-8字符集,以确保PowerCLI中可以正常识别。
接下来登录PowerCLI控制机,连接入指定的vCenter Server,如图3-19所示。
图3-19 使用Connect-VIServer登录PowerCLI管理界面
导入参数文件:
$vmlist=Import-CSV "c:\zbportgroup.csv"
为虚拟机重命名:
FOREACH ($vm in $vmlist)
{ Get-VM $($vm.oldname) | Set-vm -name $($vm.NEWNAME) -confirm:$false |
Out-File –Append changname.txt}
为虚拟机重新设置port group:
FOREACH ($vm in $vmlist)
{Get-vm $($vm.NEWNAME) | get-networkadapter | set-networkadapter -networkname
$($vm.portgroup) -confirm:$false | Out-File –Append changportgroup.txt }
为减少循环以提高效率,可将以上语句合并如下:
FOREACH ($vm in $vmlist)
{(Get-VM $($vm.oldname) | Set-vm -name $($vm.NEWNAME) -confirm:$false) -and
(Get-vm $($vm.NEWNAME) | get-networkadapter | set-networkadapter -networkname
$($vm.portgroup) -confirm:$false)}
正在执行批量更新port group的虚拟机,如图3-20所示。
图3-20 执行更改VM name和port group的操作
3.2.6 批量设置虚拟机版本和CPU、内存保留值
因搬迁的环境中虚拟机版本不统一,既有version 4的,又有version 7和8的虚拟机,为保证虚拟机的版本统一,故需将虚拟机版本调整为version 8,同时为保证群集中所有的虚拟机都能顺利开启,还需要将CPU和内存的预留资源调整为0,命令如下:
foreach ($vm in $vmlist)
{
set-vm $vm.oldname -version v8 -confirm:$false;
(Get-VM $vm.oldname | Get-VMResourceConfiguration | where {$_.CPULimitMhz -ne
'0'} | Set-VMResourceConfiguration -cpuReservationMhz 0);
(Get-VM $vm.oldname | Get-VMResourceConfiguration | where
{$_.MemReservationMB -ne '0'} | Set-VMResourceConfiguration -MemReservationMB
0)
}
批量启动虚拟机
FOREACH ($vm in $vmlist)
{start-vm -VM $vm }