昨天快下班收到一个噩耗,SCVMM2012 SP1中的300多虚拟机的”云”属性没了……具体表现就是在各个已经存在的云中,看不到一台虚拟机,具体表现就是,查看虚拟机的时候,云这块是空的。
出现这种问题到底有多坑爹呢?那就是最终的租户无法啊在SCAC以及SCVMM的控制台的云中看到任何虚拟机,而虚拟机实际上是存在的。
所以现在的做法是要想办法恢复这些属性。
第一个操作,你需要导入VMM的模块
Import-Module virtualmachinemanager
首先拉个表,看看当前的用户组吧
1
|
Get-SCUserRole
-VMMServer sc-vmmsp1
|select
name
|
再看看有哪些云
1
|
Get-SCCloud
-VMMServer sc-vmmsp1
|select
name
|
好了,基本得到这两个属性,比较运气好的是,虚拟机的云属性虽然没了,但是虚拟机的用户属性还是存在的,所以可以用PowerShell慢慢倒回去,原则就是这个虚拟机属于这个用户,那就放到这个用户的云中。
我们用两条命令解决
1
2
3
|
$Cloud
=
Get-SCCloud
-VMMServer sc-vmmsp1 | where {
$_
.Name
-like
"这里写云的名字"
}
get-vm
| where {
$_
.UserRole
-like
"这里写用户组的名字"
}
|Set
-SCVirtualMachine -cloud
$cloud
|select
name
|
因为这是用管道来实现的,所以速度不会很快……当然怎么都不人工做这个事情好很多。
这里其实也用到了一些筛选的方法,比如用到了and方法,类似下面这样
1
2
3
4
5
|
#方法是这样的(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 我们先看一下它支持的参数
1
2
3
4
5
6
|
-cloud 指定私有云的名称
-ComputerTier
指定计算机层对象
-name
指定虚拟机名称
-service
指定服务名称
#使用方法 Get-SCService ,然后管道传递
-vmhost
指定物理主机
-vmmserver
指定vmm服务器
|
使用”服务”作为参数的方法稍微特殊一点,如下图所示。
设置这块可以设置的属性很多,我先给一个谷歌版的翻译,可以凑合看看
详细说明
在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的分别。
导出部分,这里导出的属性角度,但是导入部分只写了云,如果说意外情况发生,用户权限部分也丢了,那也是可以修改一下恢复的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
$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
}
|
本文转自 九叔 51CTO博客,原文链接:http://blog.51cto.com/jiushu/1683154,如需转载请自行联系原作者