虚拟机指的是在自己当前使用的操作系统(2000,XP)基础上安装并利用专门的虚拟机软件(常用的有VMWARE和Microsoft的VPC)虚拟出若干台计算机,这些虚拟的多台计算机每台有各自的CPU、内存、硬盘、光驱、软驱、网卡、声卡、键盘、鼠标、串口、并口、USB口等“硬件”设备,当然这些硬件都是虚拟的,实质上它们还是用你计算机中相应的硬件。这些虚拟的计算机可以独立运行,安装各自的操作系统,应用软件、杀毒软件等等,就好像平时用你的计算机一样使用它们。也可以让它们连成一个网络。
随着很多企业部署越来越多的虚拟化平台,如何区分物理服务器和虚拟服务器也变得越来越难。有些管理员在每台虚拟机的主机名后加上“_vm”以示区别。然而,很多企业不喜欢这种方法,因为任何名字的变化都会影响到用户和应用程序访问虚拟机数据信息的方式。在服务器转变为虚拟机之后,改变服务器的名字可能也会影响到服务器本地安装的应用程序和服务。
如果管理员对一台遵循从物理平台到虚拟平台(P2V)迁移的服务器重新命名,他们通常使用DNS中的CNAME记录,以此来保证名字解析的透明性。但是,这种方法增加了对服务器资源管理的额外复杂度。另外一种标识服务器对象(无论是虚拟环境还是物理环境)的方法是使用每一台计算机对象Active Directory中Description属性。已经有一些企业使用Description属性来标识一台计算机的位置、部门或者角色。考虑到这一点,使用Description属性可能要求用户能够简洁地标识出是物理平台还是虚拟平台。例如,可以使用如下的命名规范:
- Ps – Physical server
- Vesx – VMware ESX VM
- Vms – Microsoft Virtual Server VM
- Vxen – Xen VM
- Vvi – Virtual Iron VM
- Vvz – SWsoft Virtuozzo virtual private server
- Vscon – Solaris Container
在所有Description属性中,我比较喜欢使用“P”作为物理平台的前缀,“V”作为虚拟平台的前缀。这样做的话可以使用户使用脚本语句对所有的虚拟机做查询操作,例如,仅通过脚本查询每一台计算对象的Description属性的第一个字母。
图1和图2给出了通过计算机对象的Description属性标识虚拟机的两种方法:
图1:使用Description属性标识一台Xen虚拟机
图2:使用Description属性标识一台物理服务器,以及其位置、部门和角色
有了这些合适的命名规范,通过使用Active Directory Users and Computers和给这些对象排序(使用Description属性),就可以很快地在任何一个Active Directory容器中定位到虚拟机对象。点击Active Directory Users and Computers中的Description列就可以做到这些,双击的话就可以按照降序排序。
如图3是一个通过Description排序计算机对象的例子:
图3:在Active Directory Users and Computers中排序虚拟机计算机对象
在大型企业中,很多管理员发现Active Directory查询属性非常有用。例如,为了定位所用域中的成员计算机(这些计算机都是ESX虚拟机),以下几个步骤就非常必要:
1.在Active Directory Users and Computers窗口,右键点击“Domain Object”,选择“Find”
2.在“Find”对话框,点击“Find Drop-down”菜单,选择“Computers”
3.接下来,点击“Advanced”属性页。在“Advanced”属性页下,点击“Field”按钮,在复合的drop-down菜单中选择“Description”
4.在“Condition Drop-down”菜单中,选择“Starts With”
5.在“Value”属性中输入“Vesx”,注意如果需要搜索所有虚拟机,只需输入“V”
6.接下来,点击“Add”按钮
7.现在可以点击“Start”开始查询(如图4),就可以显示出那些Description属性以“Vesx开头”的计算机对象
图4:ESX虚拟机Active Directory查询
当然,使用Active Directory Users and Computers GUI只能完成这些工作。在大型环境中,用户可能希望使用脚本语言来填充每一台计算机对象的Description属性。下面的SetDescription.vbs脚本就可以从一个文本文件中读取一个计算机列表,也可以修改这些已有的Description属性,确保其有一个物理或者虚拟的标识符作为前缀。
- 'SetDescription.vbs
- 'Adds virtual or physical descriptor to
- 'computer description attribute.
- 'set variables
- 'strPrefix -- physical or virtual identifier prefix
- ' Prefix values:
- ' Ps – Physical server
- ' Vesx – VMware ESX VM
- ' Vms – Microsoft Virtual Server VM
- ' Vxen – Xen VM
- ' Vvi – Virtual Iron VM
- ' Vvz – SWsoft Virtuozzo virtual private server
- ' Vscon – Solaris Container
- strPrefix = "Vesx"
- 'strDomainTarget -- this is the AD container
- ' where the target computer accounts are located
- strDomainTarget = "cn=computers,dc=virtual,dc=net"
- 'strSourceFile -- file that contains computer
- ' account list
- strSourceFile = "c:\computers.txt"
- ' Constants
- Const ForReading = 1
- 'Open Source File
- Set objFSO = CreateObject("Scripting.FileSystemObject")
- set objSourceFile = objFSO.OpenTextFile(strSourceFile,_
- ForReading, True)
- 'Connect to Directory Service
- 'Modify computer description for each computer in
- ' source file list
- Do Until objSourceFile.AtEndOfStream
- strcomputer = objSourceFile.Readline
- strADSpath = "LDAP://cn=" & strcomputer & _
- "," & strDomainTarget
- Set objComputer = GetObject(strADSpath)
- strOldDes = objcomputer.description
- If strOldDes = "" then
- strNewDes = strPrefix
- Else
- strNewDes = strPrefix & " - " & strOldDes
- End If
- objcomputer.Put "Description", strNewDes
- objcomputer.SetInfo
- Loop
注意:在上述脚本中,需要修改如下的三个变量:
- ●strPrefix
- ●strDomainTarget
- ●strSourceFile
strPrefix标识虚拟机的前缀,用来给每台计算机Description属性赋值。例如,对于ESX虚拟机,就可以把strPrefix赋值为“Vesx”;对于物理服务器,可以给strPrefix赋值为“Ps”。strDomainTarget必须用来给容器设置不同的名字,在这些容器中包含有目标计算机。例如,如果计算机对象在TechTarget.com域的Computers容器中,这个strDomainTarget变量就应该设置为“cn=computers,dc=techtarget,dc=com”;如果计算机对象在TechTarget.com域的Development OU中,这个strDomainTarget变量的值就应该设置为“ou=development,dc=techtarget,dc=com”。需要注意的是脚本一次只能在一个Active Directory容器中运行,因此,如果需要修改多个容器中计算机对象的话,用户就需要在每一个Active Directory目标容器中运行一次脚本程序。
strSourceFile用来标识文本文件,在这些文本文件中是一个需要修改的计算机名列表。文件中的每一行都需要列出一个计算机主机名字。如下的链接中是一个样例:computers.txt。
在每一台计算对象的Description属性设定之后,用户就可以使用在本文中前面部分提到的Active Directory Users and Computers查询技术来定位虚拟机对象。另外,用户也可以使用一个脚本程序
查询Active Directory或者输出一个计算机列表,这个列表包含有一个描述前缀符号,如“Vesx”或者“V”。在本系列文章的第二篇文章中,我们将讨论如何使用脚本进行Active Directory计算机对象Description查询;在第三部分中,我在Active Directory范式的基础上做了进一步扩展,其中包括用一个自定义属性来标识计算机是物理平台还是虚拟平台。
#p#
在这系列第一部分中,我介绍了如何使用计算机对象Description属性标识出虚拟平台和物理平台的方法。同时我也阐述了如何使用vbscript为大量计算机修改Description属性。
在本文中,我将介绍查询Active Directory的方法,来查询匹配预定义Description属性前缀的计算机对象。例如,如果用户希望查找所有虚拟机,可能就需要找出所有Description属性以“V”开始的计算机。如果要查找所有基于Xen的虚拟机,就需要查询所有Description属性以“Vxen”开始的计算机。
在上一篇文章中我解释了如何使用Active Directory Users and Computers执行计算机对象查找,但是有时用户要么是为了和其它管理工具保持完整性,要么是为了长时期保存,也可能希望输出存储在一个文本文件中。考虑到这些的话,可以使用脚本程序QueryDescription.vbs(在我的个人主页上可以下载到文本格式)。执行这个脚本程序,可以返回一个计算机列表,这些计算机的Description属性都是以预定义字符串开始的。
为了在读者的工作环境中使用这个脚本程序,需要编辑三个变量:
- ●strPrefix
- ●strDomainTarget
- ●strLogFile
strPrefix标识Description属性前缀,以包括查询使用。例如,把strPrefix设置为“V”将会返回所有虚拟机列表。如果把strPrefix设置为“Ps”,将会返回所有物理服务器列表。
strDomainTarget用来标明用户希望查询域的不同名字,这个变量的设置需要和用户的域名相匹配。因此如果用户管理的是searchservervirtualization.com域的话,strDomainTarget就需要设置为“dc=searchservervirtualization, dc=com”。需要注意的是用户也可以通过新增一个不同的名字限制一个OU的连接范围,例如,为了连接TechTarget.net域中的“Web”OU,strDomainTarget就应该设置为“ou=web,dc=techtarget, dc=net”。
最后一个可能需要修改的变量是strLogFile。strLogFile标识脚本程序输出的日志文件所存储的位置。默认保存到C盘根目录下,下面是一个日志文件的样例:
- The following computers have the vesx Description Prefix:
- Computer Name
- =============
- FS1
- FS2
- Hernandez
- Maine
- web1
- web2
- web3
相信读者也看到了,在Active Directory中跟踪虚拟机对象没有看起来那么难。使用脚本程序修改Description属性来标识计算机是特定的虚拟机类型或者是物理系统,使用该方法可以允许用户更迅速地合理部署一个系统,并且可以更轻松地跟踪整个企业内部系统中的所有虚拟机。在全部现有的物理计算机和虚拟机对象在它们的Description属性中都设置合适的前缀之后,用户应该确保所有新加入域的虚拟机也拥有正确的Description属性前缀(如Vesx、Vvi、Vms等)。企业内部的部署和更改控制流程也需要随之进行更新,以保证这些操作正常进行。
在本系列文章的最后一部分,我将探讨自定义Active Directory的一些方法。通过这些自定义Active Directory,可以使用自定义虚拟机属性。如果使用已有Description属性(其它属主的Description属性),下一篇文章中给出的解决方案或许正是读者所需要的。 在本系列文章的的前两篇中,我描述了一种通过计算机对象Active Directory中Description属性来标识一个工作环境是物理环境还是虚拟环境的方法。在本文中,我将对Active Directory Integrity做进一步介绍,探讨自定义Active Directory模式,用来支持新的虚拟化属性。
#p#
在本文中,我给出了创建两个自定义Active Directory属性(isVirtual属性和vmType属性)的基本步骤。isVirtual属性是一个布尔变量,用来标识一台计算机是物理计算机还是虚拟计算机。如果isVirtual设置为“True”,就说明该计算机对象是虚拟机。如果用户希望以更细的粒度标识虚拟机,就需要增加vmType属性。vmType是一个字符串变量,可以用来标识一台虚拟机的虚拟平台,在此需要使用第一篇文章中所描述的命名规范。
需要注意的是本文所述的过程要求Active Directory模式修改,修改后是不可撤消的。如果存在问题,那么你需要评估本系列前两篇文章中所描述的解决方案。对于扩展Active Directory模式的技术背景,用户需要看是TechNet的一篇文章《Extending the schema》,在这篇文章中,有几个微软文档的链接。微软的这几篇文档解释模式修改的程序及其微小差异。一定要记住本文列出的几个步骤在应用到产品领域之前,一定要先在某个测试环境中进行评估。
在开始之前,如果还没有对象标识符((OID:Object Identifier))的话,需要为企业申请一个。如果企业没有OID,就需要在MSDN的Active Directory Naming Registration网站申请一个。另外,在这篇之外也不失一般性,最好的方案是在通用名字和LDAP显示名字中使用企业指定的模式前缀。例如,我的模式前缀是cwolf。因此不是使用通用名字“isVirtual”,最好的方法是使用“cwolf-isVirtual”,关于模式命名更多的信息,参看Microsoft Windows Server 2003应用程序规范。请注意,如果读者希望在一个实验室环境中测试这些流程,可以使用我在本文中给出的OID变量。
为了创建新isVirtual属性和vmType属性,需要注册Active Directory模式MMC嵌入式管理单元。为了注册这个管理单元,需要登录域控制器,运行命令regsvr32 schmmgmt.dll。注意:只有用户是模式管理组成员才可以能够对Active Directory模式做出改动。
接下来就需要运行mmc目录打开一个空MMC shell,在shell上新增Active Directory模式管理单元。如果创建一个自定义的虚拟机属性,以下几个步骤是很有必要的:
1. 在“Active Directory Schema MMC”中,右键点击“Attributes Container”,选择“Create Attribute”
2. 查看“Schema Object Creation warning”对话框;点击“Continue”,一定要注意属性增加将会导致Active Directory模式的永久性改变
3. 在如图1所示的对话框中,输入如下变量:
- Common Name: isVirtual
- LDAP Display Name: isVirtual
- Unique X500 Object ID: Prefix value associated with organization's OID, followed by a unique attribute identifier. For example, 1.2.840.113556.1.8000.2522.2.1.
- Description: Identifies a computer as virtual
- Syntax: Boolean
4. 在“Create New Attribute”对话框中输入要求的变量之后,点击“OK”就可以创建Description属性
5. 接下来,需要创建vmType属性;右键点击“Attributes Container”,选择“Create Attribute”
6. 查看“Schema Object Creation warning”对话框;点击“Continue”
7. 在“Create New Attribute”对话框中(如图2),输入如下变量:
- Common Name: vmType
- LDAP Display Name: vmType
- Unique X500 Object ID: Prefix value associated with organization's OID, followed by a unique attribute identifier. For example, 1.2.840.113556.1.8000.2522.2.2.
- Description: Identifies the VM's virtualization platform
- Syntax: Case-insensitive string
8. 刷新模式之后就可以看见新增的属性;右键点击“Active Directory Schema object”,选择“Reload the Schema”
9. 接下来,点击“Attributes Container”,定位isVirtual属性;看到isVirtual属性之后,右键点击选择“Properties”
10. 在“isVirtual Properties”对话框中,检查“Index this Attribute in the Active Directory”复选框,点击“OK”;注意,在此也需要选上 Attribute is Active框。
11. 如果新增“vmType Attribute”重复第9步和第10步
12. 需要注意的是所创建的属性必须和计算机类相关联;所以需要扩展类容器并且定位“Computer”类;右键点击“Computer”,选择“Properties”
13. 在“Computer Properties”对话框中,选择“Attributes”属性页,点击“Add”按钮
14. 在“Select Schema Object”对话框中,向下拉选择“isVirtual attribute”,然后选择“OK”
15. 在“Computer Properties”对话框的“Attributes”复选框内,再次点击“Add”按钮
16. 现在可以选择“vmType Attributes”,点击“OK”
17. 在在“Computer Properties”对话框的可选属性中就可以看到isVirtual和vmType;点击“OK”保存更改
图1:创建isVirtual属性
图2:创建vmType属性
注意这些步骤将会改变模式,对Active Directory模式的任何改变将会影响到整个集群,所以需要确保在尝试该流程之前,对于这些变化有适当的符号结束指令。
在属性增加到模式之后,就需要配置属性,使用setvirtual.vbs vbscript脚本程序设置计算机isVirtual属性:
- strComputerDN = "CN=reyes,CN=Computers,DC=virtual,DC=net"
- Set objComputer = GetObject("LDAP://" & strComputerDN)
- objComputer.Put "isVirtual" , true
- objComputer.SetInfo
另外还需要编辑strComputerDN变量的名字确保和要编辑的计算机的不同名字保持一致,可以使用如下queryvirtual.vbs 脚本查询一台计算机的isVirtual属性:
- strComputerDN = "CN=reyes,CN=Computers,DC=virtual,DC=net"
- Set objComputer = GetObject("LDAP://" & strComputerDN)
- isVirtual = objComputer.get("isVirtual")
- wscript.echo(strComputerDN & " isVirtual = " & isVirtual)
如果需要为很多计算机设置isVirtual和vmType属性,我的个人主页上的setvirtualattributes.vbs 脚本程序可以完成这项工作。
但是需要修改脚本程序中的以下几个变量:
- blnIsVirtual
- strVMtype
- strDomainTarget
- strSourceFile
在使用脚本标识计算机对象为虚拟机的情况下,blnIsVirtual需要被设置为“True”。
strVMtype标识虚拟机类型代码,用来自定义每台计算的vmType属性。例如,设置ESX虚拟机的strVMtype为“Vesx”。
strDomainTarget必须用来给容器设置不同的名字,在这些容器中包含有目标计算机。例如,如果计算机对象在TechTarget.com域的Computers容器中,这个strDomainTarget变量就应该设置为“cn=computers,dc=techtarget,dc=com”;如果计算机对象在TechTarget.com域的Development OU中,这个strDomainTarget变量的值就应该设置为“ou=development,dc=techtarget,dc=com”。需要注意的是脚本一次只能在一个Active Directory容器中运行,因此,如果需要修改多个容器中计算机对象的话,用户就需要在每一个Active Directory目标容器中运行一次脚本程序。
strSourceFile用来标识文本文件,在这些文本文件中是一个需要修改的计算机名列表。文件中的每一行都需要列出一个计算机主机名字。如下的链接中是一个样例:computers.txt。
最后,为了定位一个特定域内的所有虚拟机,需要运行QueryVirtualAttributes.vbs脚本,该脚本程序可以在我的个人主页上下载到文本格式。为了在读者的工作环境中运行该脚本,需要修改三个变量:
- strVMtype
- strDomainTarget
- strLogFile
strVMtype标识用户可能查询的虚拟机平台类型。例如,设置strVMtype为“Vxen”将会输出一个所有基于Xen的虚拟机列表;使用“V”作为vmType变量将会输出isVirtual属性都是“True”的计算机列表,同时还有vmType属性的值。
strDomainTarget用来标明用户希望查询域的不同名字,这个变量的设置需要和用户的域名相匹配。因此如果用户管理的是searchservervirtualization.com域的话,strDomainTarget就需要设置为“dc=searchservervirtualization, dc=com”。需要注意的是用户也可以通过新增一个不同的名字限制一个OU的连接范围,例如,为了连接TechTarget.net域中的“Web”OU,strDomainTarget就应该设置为“ou=web,dc=techtarget, dc=net”。
最后一个可能需要修改的变量是strLogFile。strLogFile标识脚本程序输出的日志文件所存储的位置。默认保存到C盘根目录下,下面是一个日志文件的样例:
- The following computers have the Vesx vmType attribute
- Name VM Type
- ==== =======
- Reyes Vesx
- Maine Vesx
- Wagner Vesx
- WS86 Vesx
从本系列文章的第一部分和第二部分中提到的技术可以看到,每次一台新计算机对象创建时,为isVirtual和vmType自定义AD属性值是非常重要的。
整合虚拟化管理和Active Directory可以给用户对于审计和管理整个企业内部所有虚拟机更大控制权。
本文详细的介绍了如何用Active Directory标识和跟踪虚拟机,熟练使用Active Directory中的Description属性,那么你将会受益匪浅。
【编辑推荐】
- 活动目录——Active Directory
- 虚拟机概论——IBM虚拟机模型
- Active Directory 权限管理服务应用
- 如何打开 Active Directory 用户和计算机
- 手把手教你在CentOS 5.6下安装Xen虚拟机