最近遇到一些客户的对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实现接口
第三种方式参考 http://velemental.com/2012/01/31/powershell-and-adobe-amf3/
|