昨天快下班收到一个噩耗,SCVMM2012 SP1中的300多虚拟机的”云”属性没了……具体表现就是在各个已经存在的云中,看不到一台虚拟机,具体表现就是,查看虚拟机的时候,云这块是空的。

SCVMM中“云”属性的备份和恢复_第1张图片

出现这种问题到底有多坑爹呢?那就是最终的租户无法啊在SCAC以及SCVMM的控制台的云中看到任何虚拟机,而虚拟机实际上是存在的。

所以现在的做法是要想办法恢复这些属性。

第一个操作,你需要导入VMM的模块

Import-Module virtualmachinemanager

 

首先拉个表,看看当前的用户组吧

Get-SCUserRole -VMMServer sc-vmmsp1 |select name


SCVMM中“云”属性的备份和恢复_第2张图片

再看看有哪些云

Get-SCCloud -VMMServer sc-vmmsp1 |select name

SCVMM中“云”属性的备份和恢复_第3张图片

好了,基本得到这两个属性,比较运气好的是,虚拟机的云属性虽然没了,但是虚拟机的用户属性还是存在的,所以可以用PowerShell慢慢倒回去,原则就是这个虚拟机属于这个用户,那就放到这个用户的云中。

我们用两条命令解决

$Cloud = Get-SCCloud -VMMServer sc-vmmsp1 | where {$_.Name -like "这里写云的名字"}
 
get-vm| where {$_.UserRole -like "这里写用户组的名字"}|Set-SCVirtualMachine -cloud $cloud|select name

因为这是用管道来实现的,所以速度不会很快……当然怎么都不人工做这个事情好很多。

这里其实也用到了一些筛选的方法,比如用到了and方法,类似下面这样

#方法是这样的(1 -eq 1) -or (1 -eq 2)
 
#那么具体是怎么写的呢?看下面的一个范例
 
get-vm|?{$_.userrole -like "管理员"} |?{($_.vmhost -like "hahv1*") -or ($_.vmhost -like "hahv2*") -or ($_.vmhost -like "hahv3*") -or ($_.vmhost -like "hahv4*")}|select name,userrole,vmhost

 

根据不同的用户组和云,多运行几次脚本,慢慢的就解决了这个问题,但是还有下文啊,以后再出现这个问题咋办?所以我的想法是,备份云、用户组、虚拟机的关系,以后坏了好恢复。【虽然没有具体验证,不过只针对”服务”可能是有些问题的。】

通过get-vm,可以得到虚拟机的具体属性,我列出一些人为比较重要的属性

 

HostName : 这里是虚拟机所在的物理主机名

VMHost : 这里是虚拟机所在的物理主机名

SelfServiceUserRole : 这里是创建者的组名

CloudId : 8cc833e1-a5e4-45fb-bb0a-bb38aaa41f2a

Cloud : 云名

GrantedToList : {授权访问的用户组}

UserRoleID : 7746c9da-a011-4cdc-9cb2-7b835f42c918

UserRole : 用户组

Owner : 指定的创建者

StartAction : 是不是自动开机

StopAction : 停电之后是关机还是怎么地

CreationSource : 服务的信息

ComputerTier : 服务的信息

 

这里主要用到了两个命令,一个是Set-SCVirtualMachine 一个是Get-SCVirtualMachine 我们先看一下它支持的参数


-cloud 指定私有云的名称
-ComputerTier 指定计算机层对象
-name 指定虚拟机名称
-service 指定服务名称 #使用方法 Get-SCService ,然后管道传递
-vmhost 指定物理主机
-vmmserver 指定vmm服务器


使用”服务”作为参数的方法稍微特殊一点,如下图所示。

SCVMM中“云”属性的备份和恢复_第4张图片

设置这块可以设置的属性很多,我先给一个谷歌版的翻译,可以凑合看看

 

详细说明

在Set-SCVirtualMachine小命令改变由虚拟机管理器(VMM)管理的虚拟机的一个或多个属性。 您可以更改的属性包括以下内容:

- 与云相关联的虚拟机。
- 名称,所有者和虚拟机的说明。
- BIOS启动顺序(如果部署Hyper-V主机上)。
- 资源的使用的虚拟机的主机上金额。 这些包括:
- 主机的CPU资源,一个虚拟机可以使用的最大数量。
- 由虚拟机使用的预期主机的CPU。
- 主机的CPU资源量在同一台主机上使用一个虚拟相对于其他虚拟机的机器。
- 主机内存量,一个虚拟机可以使用。
- 带宽量主机的网络上的虚拟机可以使用。
- 对无关的资源承载虚拟机的硬件设置。 这些包括:
- CPU的数量。
- 的CPU的类型。
- 磁盘输入/输出操作每秒(IOPS)的数量。
- 限制(对于较旧的操作系统,如Windows NT 4.0)CPU的功能。
- 成本中心,用标准来筛选虚拟机的标签,和自定义设置。
- 设置,使各种可选功能,包括:
- 启用或禁用库对象,以使其可用,或暂时不可用,给用户。
- 启用备份虚拟机的Hyper-V主机卷影复制服务上。
- 启用一键/值对虚拟机及其Hyper-V主机之间的数据交换。
- 从Hyper-V的控制台启用的虚拟机的关机。
- 启用虚拟机的Hyper-V主机之间的时间同步。
- 启用对NumLock键BIOS的价值为Hyper-V主机上的虚拟机。
- 设置标识虚拟机是否具有高可用性,也就是虚拟机部署在Hyper-V主机群集或思杰XenServer主机群集的节点上。
- 设置,确定是否虚拟化来宾服务安装部署Hyper-V主机上的虚拟机上。
- 秒数启动虚拟机之前延迟。
- 环境标识用于一个虚拟机操作系统。
- 启动和停止虚拟机的操作。
- 环境限制虚拟机的自助服务用户可以创建数。
- 设置用于开关,谁属于多个角色自助服务用户用来管理虚拟机的角色。
- 设置的ESX主机到VMware资源池分配上的虚拟机。

如果你想改变一个虚拟软驱,虚拟光驱,虚拟网络适配器,或与特定虚拟机相关联的虚拟SCSI适配器的属性,使用Set-SCVirtualFloppyDrive,设置SCVirtualDVDDrive,设置SCVirtualNetworkAdapter,或Set-SCVirtualScsiAdapter cmdlet的分别。

 

 

导出部分,这里导出的属性角度,但是导入部分只写了云,如果说意外情况发生,用户权限部分也丢了,那也是可以修改一下恢复的。

Import-Module virtualmachinemanager
 
$vmmserver = "sc-vmmsp1"
 
$date1 = date
 
$extime = (Get-Date -Format 'yyyyMMddHHmm')
 
$filename = "d:/vmmreport" + $extime + ".txt"
 
$filename2 = "d:/hvcloud" + $extime + ".csv"
 
echo "<#记录用户组"|out-file -Encoding utf8 -Force $filename
 
Get-SCUserRole -VMMServer sc-vmmsp1|select name|out-file -Append -Encoding utf8 -Force $filename
 
echo "#记录云"|out-file -Append -Encoding utf8 -Force $filename
 
Get-SCCloud -VMMServer sc-vmmsp1 |select name|out-file -Append -Encoding utf8 -Force $filename
 
echo "#>"|out-file -Append -Encoding utf8 -Force $filename
 
get-vm -name *|?{$_.HostName -notlike "hv-re-bj*" -and $_.cloud -ne $null}|select name,hostname,cloud,owner,operatingsystem,computernamestring,startaction,stopaction,hostgrouppath,description,cpucount |Export-Csv -Encoding utf8 -Force $filename2



导入部分,需要手动定义一下csv文件

$filenamecsv = "d:/hvcloud201508071645.csv"
 
$vmmserver = "sc-vmmsp1"
 
Import-Csv -Path $filenamecsv | foreach {
 
$cloud2 = $_.cloud
 
$cloud = Get-SCCloud -VMMServer $vmmserver |?{ $_.name -eq $cloud2}
 
$name =$_.name
 
$hostname =$_.hostname
 
$VM = Get-SCVirtualMachine -VMMServer $vmmserver -Name $name| where {$_.VMHost.Name -eq $hostname}
 
set-vm -vm $vm -cloud $cloud |select name,vmhost
 
}

微软云方案高端顶级群【236804566】分享成就牛B之路

 欢迎关注新浪微博 @肥九叔

  • 《微软System Center 2012 R2私有云部署实战》现已上市