众所周知,VMWare在虚拟化和云计算基础架构领域处于全球领先地位,所提供的经客户验证的解决方案可通过降低复杂性以及更灵活、敏捷地交付服务来提高IT效率。而旗下的VMWare
vSphere是一整套虚拟化应用产品,它包含VMWare ESX Server、VMWare Virtual
Center、VMotion,以及例如VMWare HA、VMWare DRS和VMWare统一备份服务等分布式服务。它提供了完整的虚拟化解决方案,但是我们仍然需要大量专业人员手动的进行维护和管理整个虚拟化环境。因此,VMWare官方也提供了多种不同语言版本的SDK以满足不同企业用户自动化管理整个虚拟化环境的需求。
关于本文:本文简单介绍了基于VMWare SDK的Perl语言版本API如何设计并实现虚拟化环境整个生命周期的自动化管理。
一. VMWare Perl SDK简介
VMWare Perl SDK提供了一组基于Perl脚本语言的操作vSphere对象的接口,管理员及开发人员可以使用Perl的相关方法轻松的操作vSphere对象。
VMWare Perl SDK包括以下主要概念:
1. 连接。所有vSphere对象的操作都建立在已取得vSphere连接的基础上。
2. 被管理对象。vSphere服务器端的每个对象在Perl SDK中都有对应的被管理对象。
3. 被管理对象的引用。Perl SDK中使用被管理对象的引用来唯一确定一个被管理对象。
4. 方法。每个被管理对象会提供0个或多个方法,用于操作该被管理对象。
5. 数据对象。每个被管理对象会对应一个或多个数据对象,用来描述他当前的状态或属性。
API提供一组静态方法来获取被管理对象:
Vim::get_view(mo_ref,view_type);
通过被管理对象的引用获得被管理对象
Vim::get_views(mo_ref_array,view_type);
通过一组被管理对象的引用获得被管理对象
Vim::find_entity_view(view_type,begin_entity,filter);
通过过滤器查找一个被管理对象
Vim::find_entity_views(view_type,begin_entity,filter);
通过过滤器查找一组被管理对象
被管理对象结构图:
二. 虚拟机和模版
在虚拟化环境中,无论底层用到了多少存储,计算核心,内存又或者是网络资源,这些对于最终用户来说,都是透明的,用户不需要知道他们的存在,而我们交付给用户的最直接的产品,就是虚拟机,每一台虚拟机都和真实的服务器一样,有CPU,有内存,有硬盘,IP地址已经预先设定完毕,交到用户手上之后,用户便可以立即开始使用,然而服务器的操作系统种类有很多,对于用户的不同需求,每次都从零开始安装和配置一台服务器,不仅十分浪费时间,同时也不能保证配置的一致性。
在这样的情况下,模版应运而生,其实模版就是一台特定的虚拟机,专业人员通过预先安装配置好大量不同操作系统的虚拟机,并将其转换为模版后,当用户请求到来时,系统会自动选择出合适的模版,通过克隆及少量自定义配置,便可交付给用户使用,不仅大量的缩短了的新建虚拟机的时间,还能保证配置的可靠性。
三、部署新的虚拟机
让我们通过一个简单的示例看看如何通过模版快速创建一台虚拟机吧
a) 连接VMWare vSphere Center SDK
my $vc_ip = ……; my $vc_user = ……; my $vc_pass = ……; my $vCenterURL = 'https://' . $vc_ip . '/sdk'; Util::connect( $vCenterURL, $vc_user, $vc_pass ); |
b) 找到指定的虚拟机的模版
my $vm_view = Vim::find_entity_view( view_type => 'VirtualMachine', filter => {'name' => ……}, properties => ['name'] );
# 查找类型为虚拟机 # 通过名字查找 # 此项非必须,但是建议填写,如果不填写将会得到完整的对象,
而实际上对象中的大量属性都用不到,只会大量增加查询的时间。 |
c) 指定虚拟机的构建位置
my $host_view = Vim::find_entity_view( view_type => 'HostSystem', filter => { 'name' => …… }, properties => [ 'name', 'parent', 'datastore' ] ); my $ds_views = Vim::get_views( mo_ref_array => $host_view->datastore, properties => ['name'] ); my $ds_view; foreach (@$ds_views) { if ( …… eq $_->name ) { $ds_view = $_; last; } } my $com_res_view = Vim::get_view( mo_ref => $host_view->parent, properties => [ 'name', 'resourcePool' ] ); my $relocate_spec = VirtualMachineRelocateSpec->new( datastore => $ds_view->{mo_ref}, host => $host_view->{mo_ref}, pool => $com_res_view->resourcePool );
# 查找类型为主机
# 通过名字查找
# 只需要名字,父类和存储三个属性
# 通过对象的引用拿到对象本身
# 主机的存储属性为该存储的对象的引用
# 只需要存储的名字即可
# 由于SDK的查询方法只支持有限的六种类型对象,所以这里只能手动编写逻辑获得名字匹配的存储对象
# 同理,得到主机的父类对象,主要是通过主机额父类得到主机所在的资源池对象,
这里可以将新生成的虚拟机部署在主机所在的同一个资源池内,也可以另外指定资源池
# 构建整个虚拟机构建位置信息对象 |
d) 指定虚拟机的性能配置
my $extra_disk_size = ……;
my $controller;
my $devices = $vm_view->config->hardware->device;
foreach my $device (@$devices) {
my $class = ref $device;
if ( $class->isa('VirtualLsiLogicController') || $class->isa('VirtualLsiLogicSASController')
|| $class->isa('ParaVirtualSCSIController') || $class->isa('VirtualSCSIController') ) {
$controller = $device;
}
}
my $controllerKey = $controller->key;
my $unitNumber = $#{$controller->device}+1;
# Generate filename
my $vm_name = $vm_view->name;
my $name = "$vm_name/${vm_name}_ext";
my $vm_path = $vm_view->config->files->vmPathName;
$vm_path =~ /^(\[.*\])/;
my $file_name = "$1/$name.vmdk";
# backing info
my $disk_backing_info = VirtualDiskFlatVer2BackingInfo->new(
diskMode => 'persistent',
fileName => $file_name
);
# Disk for Disk Spec
my $disk = VirtualDisk->new(
controllerKey => $controllerKey,
unitNumber => $unitNumber,
key => -1,
backing => $disk_backing_info,
capacityInKB => $extra_disk_size
);
# Get Device Spec
my $dev_spec = VirtualDeviceConfigSpec->new(
operation => VirtualDeviceConfigSpecOperation
->new('add'),
device => $disk,
fileOperation => VirtualDeviceConfigSpecFileOperation
->new('create')
);
my $config_spec = VirtualMachineConfigSpec->new(
name => ……,
numCPUs => ……,
memoryMB => ……,
deviceChange => [$dev_spec]
);
# 新增硬盘的大小
# 控制器
# 得到虚拟服务器当前的设备列表
# 以下类型均为硬盘控制器
# 控制器标识符
# 生成新的设备序列号
# 生成新的硬盘文件的名字
# 配置硬盘模式
# persistent标识该硬盘为持久化硬盘,将会在快照中受到保护
# independent_persistent如果将模式设置为独立模式,则该硬盘变化不会记录进快照
# 构建硬盘对象
# 构建修改硬盘的操作对象
# 此处为新增硬盘操作
# 创建新的硬盘文件,如有需要也可以使用已有的硬盘文件
# 构建完整的性能配置对象
# 可选,新的虚拟服务器名字
# 可选,新的CPU数量
# 可选,新的内存大小(单位MB)
# 可选,其他设备变更(这里只修改了硬盘)
|
e) 自定义虚拟机的参数配置(以Linux为例,Windows会略有不同)
# globalIPSettings
my $customization_global_settings = CustomizationGlobalIPSettings->new(
dnsServerList => $dns_server,
dnsSuffixList => [$domain_name]
);
my $cust_fixname = CustomizationFixedName->new( name => $host_name );
my $cust_linuxprep = CustomizationLinuxPrep->new(
domain => $domain_name,
hostName => $cust_fixname,
hwClockUTC => 'false',
timeZone => 'Asia/Shanghai'
);
my $customization_fixed_ip =
CustomizationFixedIp->new( ipAddress => $ip_addr );
my $cust_ip_settings = CustomizationIPSettings->new(
ip=> $customization_fixed_ip,
dnsDomain => $domain_name,
gateway => $gateway,
subnetMask => $subnetMask
);
my $cust_adapter_mapping = CustomizationAdapterMapping->new( adapter => $cust_ip_settings );
# customization spec
my $customization_spec = CustomizationSpec->new(
identity => $cust_linuxprep,
globalIPSettings => $customization_global_settings,
nicSettingMap => [$cust_adapter_mapping]
);
# 全局网络设置
# 封装主机名对象
# 构建Linux自定义设置对象
# 构建用户自定义IP地址对象
# 用户自定义网络属性的其他参数
# 构建适配器
# 构建完整的自定义对象
# 必选,自定义设置信息
# 必选,全局网络设置信息
# 可选,自定义网络设置
|
f) 克隆并部署虚拟机
$clone_spec = VirtualMachineCloneSpec->new(
powerOn => 1,
template => 0,
location => $relocate_spec,
customization => $customization_spec,
config => $config_spec,
);
my $task = $vm_view->CloneVM_Task(
folder => $vm_view->parent,
name => $vm_name,
spec => $clone_spec
);
my $task = $vm_view->ReconfigVM_Task(
spec => $config_spec
);
my $task = $vm_view->CustomizeVM_Task(
spec => $customization_spec
);
# 构建完成的克隆自定义对象
# 克隆完成后是否开机
# 克隆完成后新的虚拟机是否设置为模版
# 使用之前构建的位置信息
# 可选,使用之前构建的自定义参数配置
# 可选,使用之前构建的自定义性能配置
# 执行克隆操作
# 使用和模版相同的文件夹存放新虚拟机
# 设置新的虚拟机名字
# 使用之前构建完成的克隆自定义对象
# 除了在克隆的时候直接指定性能配置外也可以在任意时候重新配置虚拟机性能配置
# 除了在克隆的时候直接指定性能配置外也可以在任意时候重新调整自定义参数配置
|
g) 断开vc连接
三、虚拟机的电源管理
$vm_view->PowerOnVM_Task(); $vm_view->PowerOffVM_Task(); $vm_view->ShutdownGuest(); $vm_view->ResetVM_Task(); $vm_view->RebootGuest(); $vm_view->SuspendVM_Task(); $vm_view->StandbyGuest();
# 开机
# 关机,等同于拔电源
# 关机,从操作系统关机,需要安装VMTool
# 重启,等同于重启按钮
# 重启,由操作系统实现,需要安装VMTool
# 暂停虚拟机
# 待机,由操作系统实现,需要安装VMTool |
四、虚拟机的快照管理
$vm_view->CreateSnapshot_Task(
name => $ss_name,
description => $desc,
memory => $memory,
quiesce => $quiesce
);
$ss_view->RemoveSnapshot_Task(
removeChildren => 0
);
$vm_view->RemoveAllSnapshots_Task();
$ss_view->RenameSnapshot(
name => $ss_name,
description => $desc
);
$ss_view->RevertToSnapshot_Task();
$vm_view->RevertToCurrentSnapshot_Task();
# 创建快照
# 快照名字
# 可选,快照描述
# 决定快照是否包括运行时内存状态
# 如果为ture会先将虚拟机暂停再做快照
# 由快照对象触发删除操作
# 决定是否将所有子快照全部删除
# 由虚拟机对象触发操作,删除全部快照
# 由快照对象触发,重命名快照
# 快照名字
# 可选,快照描述
# 由快照对象触发,恢复到该快照状态
# 由虚拟机对象触发,恢复到当前快照
|
五、删除虚拟机
$vm_view->Destroy_Task();
# 销毁选定的虚拟服务器对象 |
六、任务进度管理
在整个虚拟化管理的生命周期中,绝大多数任务的运行时间都比较短,基本可以忽略不计,但仍有少数任务会花费比较多的时间,那么任务的进展状态的监控就很有必要了。
VMWare Perl SDK所提供的大部分方法都会返回一个Task对象,我们可以通过该Task对象了解整个任务的运转状态。这里仅列举了部分常用参数,更多参数请见官方文档。
$task->info->state->val
$task->info->progress
$task->info->result
$task->info->reason
$task->info->cancelled
$task->info->cancelable
# 任务的当前状态,有四种可能的值,分别是success,running,queued,error
# 以0到100的整数描述任务进度情况
# 当任务状态为success时,保存任务返回值
# 当任务状态为error时,保存错误原因
# 标识任务是否是主动取消
# 标识进行中任务是否可以取消
|
七、常见问题的解决方法
a) Customization of the guest operating system ‘rhel4_64Guest’
is not supported in this configuration.
不同的操作系统对自定义参数配置功能的支持程度也不一样,部分操作系统目前的确不支持自定义参数配置,不过也可能是因为VM
Tool版本过低导致的,对于确实不支持的操作系统,只能选择其他方法来修改参数了。
b) 找不到可用的存储磁盘
在一个大规模部署的虚拟化环境中通常会将虚拟机物理文件存储在专用的网络磁盘上,以便于不同的主机均能访问这些磁盘,但是每个主机同时也会有自己的本地磁盘,而这些磁盘是无法被其他主机访问的,所以在选用存储时,注意不要使用不同主机上的本地磁盘,建议最好不要将这些本地磁盘作为虚拟机的载体使用。
c) 自定义的IP地址没有成功配置到虚拟机中
造成这个问题的主要原因通常是网络环境中有其他机器已经使用了你准备配置的这个IP,导致IP地址冲突。
对于Windows Vista及后续版本的Windows操作系统,操作系统未激活也可能导致自定参数配置失败。
d) 没有可用的主机
请密切关注整个虚拟化环境的安全状况,任何网络或配置异常导致的主机失联都会导致Perl SDK API的运行错误。
e) 主机在尝试提供 vSphere HA 支持时报告错误
主机集群配置可能由于网络的不稳定,IP地址冲突等问题导致不可用,需要及时修复虚拟化环境中的这些问题,不然,无法在这些有问题的主机上通过API执行任何操作。
八、总结
本文通过简单的示例讲解了如何通过VMWare Perl SDK对虚拟机的整个生命周期进行管理,还讲解了如何操作电源相关功能及快照管理,最后简单解答了一些常见的错误解决方法,实际上VMWare
Perl SDK所提供的功能远不止如此,希望通过本文的简单介绍能够让您对VMWare Perl SDK有个大致的了解,并在有限的功能范围内能够帮助您快速的构建虚拟服务器自动化管理的相关应用,更多功能还请参考VMWare官方文档。了解并掌握这些技巧,可以帮助开发人员基于VMWare
Perl SDK的开发能够管理数据中心的基础设施,部署并构建自己的云平台。
|