最近遇到一些客户的对view的自动化及监控的需求,但vmware 对view 的官方集成指南仅仅是提供了powershell的cmdlet,而且能实现的作用太少,效率太低下。
很是纠结,vsphere那边的vcenter的 sdk较为成熟,而且提供的接口足够满足客户的需求。
摸索了一番,总结下大概以下办法来实现vmware view的接口工作
一、 官方的powershell , 可参考《vmware view 集成指南》 ,相当简单,在VCS上实现直接运行powershell cmdlet就可以。 但有很多功能无法实现,例如:
1. 在view manager是可以实现从一个池中删除其中一个桌面,并可以选择是否从vcenter中删 除。但view powershell无法实现
2. 无法实现查看这台桌面目前所使用的快照是哪个?
例如:我的父虚拟机如果有两个快照
/octc1_datacenter_1/vm/parentvm_esxi01/snapshot01
/octc1_datacenter_1/vm/parentvm_esxi01/snapshot01/snapshot02
无法查看出这个桌面具体是使用的是哪个快照?
3. view策略可以针对到具体的池,而powerCLI无法实现。
二、通过view LDAP 进行操作 ,因为vmware VCS的核心实现其实是microsoft的LDS,LDS已经实现了分布式应用程序的配置存储,所以vmware view VCS的数据存储是使用AD LDS来做的,在VCS打开ADSI编辑器,打开dc=vdi,dc=vmware,dc=int路径
以下为powershell操作LDAP范例,请具体按自己实际情况调整。
function connect-ldap {
param($ldap)
$tmpObj = New-Object System.DirectoryServices.DirectoryEntry($ldap)
$tmpObj.psbase.Username=$username;
$tmpObj.psbase.Password=$password;
$tmpObj
}
function view-remove-desktop {
param($name)
$desktop = view-get-desktop $name
$desktopCN = $desktop.cn
$paeMemberDNOf = $desktop."pae-MemberDNOf" | extract_cn
if($paeMemberDNOf) {
$poolObj = view-get-pool -field cn -value $paeMemberDNOf
$newPae = ($poolObj."pae-MemberDN" | where {$_ -notmatch $desktopCN}) | %{ if($_) { $_.tostring() } }
if($newPae) { $poolObj."pae-MemberDN" = $newPae } else { $poolObj."pae-MemberDN" = @() }
try { $poolObj.commitchanges() } catch { throw $error[0] }
write "Removed $name from $($poolObj.cn)"
} else { write "Desktop not a member of any pools" }
}
三、可通过https请求模拟webclient对viewmanager的操作 ,先使用wireshark分析浏览器访问view manager的报文,使用AMF3协议进行post传参,抓取报文看response信息。(引用EMC clintonskitson的方法, 可以用java BlazeDS 调AMF3去操作 vmware view manager实现接口