使用XenServer PowerShell cmdlets开发高级脚本

日期: 2012-10-07 作者:Mike Nelson翻译:张冀川 来源:TechTarget中国 英文

没有XenServer Powershell cmdlets的Critix管理工具箱是不完整的。XenServer Powershell cmdlets允许管理员使用单个命令行接口管理Citrix XenDesktop、XenApp、部署服务器、Netscaler以及XenServer。   在虚拟环境中,基本的XenServer PowerShell cmdlets提供了一些关键的特性,允许管理员拷贝虚拟机,判定主资源池,配置许可、主机版本并为虚拟机分配服务器。但是虚拟环境只是个基础;管理员通常需要使用高级脚本以及程序进一步将任务序列化并自动化。

  开始使用XenServer PowerS……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

没有XenServer Powershell cmdlets的Critix管理工具箱是不完整的。XenServer Powershell cmdlets允许管理员使用单个命令行接口管理Citrix XenDesktop、XenApp、部署服务器、Netscaler以及XenServer。

  在虚拟环境中,基本的XenServer PowerShell cmdlets提供了一些关键的特性,允许管理员拷贝虚拟机,判定主资源池,配置许可、主机版本并为虚拟机分配服务器。但是虚拟环境只是个基础;管理员通常需要使用高级脚本以及程序进一步将任务序列化并自动化。

  开始使用XenServer PowerShell cmdlets

  为了在Window 7 x64服务器上安装XenServer PowerShell cmdlets,管理员需要下载XenServer PowerShell管理单元并提取cmdlets。为了在x64系统中配置管理单元,需要在命令提示符下运行如下命令,使用64位的.NET框架注册动态链接库。

  C:windowsmicrosoft.netframework64v2.0.50727installutil.exe "c:program files (x86)citrixxenserverpssnapinxenserverpssnapin.dll"

  运行完上述命令后,应该会收到一条消息,显示命令提交成功。

  如果你在使用快照,那么你还需要使用XenServer快照管理单元。确保将快照管理单元增加到PowerShell配置文件中并且不要忘了执行Connect-Xenserver 命令启动会话。否则在PowerShell下将会提示错误信息。

  使用MAC地址查找XenServer客户端

  为了通过MAC地址识别虚拟机,你必须使用如下命令获取虚拟接口(VIF)的对象属性:

  $vif = get-xenserver:VIF | ? { $_.MAC -match "ce:e2:b7:56:85:7f"};(Get-XenServer:VIF.VM -VIF $vif.uuid).name_label

  在Get-Xenserver cmdlet中应用VIF属性直接查询虚拟接口的MAC地址。以下命令说明了如何检索特定UUID(通用唯一标识符)的虚拟机信息。使用该信息替代VIF属性。只需要改变不同的属性值,就能够基于这些属性值检索、管理并关联不同的结果。

  Get-XenServer:VM -properties @{ uuid='$uuid' }

  令人称道的是Get-XenServer cmdlets提供了一系列可用的变量,包括角色,资源池,秘密,会话以及契约。运行get-help Get-XenServer命令可以查看所有可用的变量值并快速创建你自己的查询。

  除Get-XenServer 之外的其他cmdlet

  除了经常用到的Get-XenServer cmdlet之外,还有一些其他的cmdlets。你可以使用XenServer提供的功能,比如创建、添加、删除、回退、设置以及移除。

  为了查看可用的XenServer cmdlets及其属性,可以在PowerShell命令提示符下运行Get-Command *xen* 命令。

  我发现了一些能够展示XenServer cmdlets内部工作机制的高级脚本。这些高级脚本来源于Maikel Gadder的博客,它提供了一些非常好的如何使用变量并存储属性的例子。

  # Xenserver-UpdateScript

  # V 0.9.2

  # 20.07.2012

  # written by Maikel Gaedker (http://www.ingmarverheij.com/  # Version            : 1.0, 13 february 2012  #  # Requires           : plink (a command-line interface to the puTTY back ends)  #                          http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

  #   function StartProcess([String]$FileName, [String]$Arguments){      $process = New-Object "System.Diagnostics.Process"     $startinfo = New-Object "System.Diagnostics.ProcessStartInfo"     $startinfo.FileName = $FileName      $startinfo.Arguments = $arguments      $startinfo.UseShellExecute = $false

     $startinfo.RedirectStandardInput = $true

     $startinfo.RedirectStandardOutput = $true      $startinfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden

     $process.StartInfo = $startinfo

     $temp = $process.start()     return $process }    #Region PrerequisiteCheck     #Check number of arguments     If ($args.count -lt 5)     {       Write-Host "Usage"        Write-Host "powershell.exe .RDSConnect.ps1 (XenServerPoolMaster) (XenServerUsername) (XenServerPassword) (VMName) (Network ID) [CustomFieldName] [CustomFieldValue]"        Write-Host ""

       Write-Host "Example"

       Write-Host "powershell.exe .RDSConnect.ps1 172.16.1.1 root Passw0rd WS01 0 STUDENT 1"

       Write-Host ""        Write-Host "Press any key to continue ..."

       $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

       break
    }

  #EndRegion

  #Region Define variables and read

     #Executables

    $strExecutableMSTSC=((Get-Item "Env:WinDir").Value)+'system32mstsc.exe'     $strExecutablePLink=(Split-Path -parent $MyInvocation.MyCommand.Definition) + 'plink.exe'      #File paths     $strPathTemp=$Env:TEMP

    $strFileQueryNetworks ='QueryNetworks'

    #Script variables     $XenServerHost=$args[0]     $XenServerUsername=$args[1]     $XenServerPassword=$args[2]     $VirtualMachineName=$args[3]

   $VirtualMachineNetworkID=$args[4].toString()
 
  If ($args.count -ge 7) {

       $CustomFieldName=$args[5]               $CustomFieldValue=$args[6]    } else {           $CustomFieldName=""
 
         $CustomFieldValue=""     }     $strNICInterface=($VirtualMachineNetworkID)+'/ip: '      #Filter variables
 
  $strFilterVM='name-label="' + $VirtualMachineName+'"'

  IF ($CustomFieldName) {$strFilterVM+=' other-config:XenCenter.CustomFields.' + $CustomFieldName + '=' + $CustomFieldValue}
 
  #EndRegion    #Prevent rsa2 key fingerprint message  #====================================  #The server's host key is not cached in the registry. You have no guarantee that the server is the computer you #think it is.  #The server's rsa2 key fingerprint is: ssh-rsa 2048 7c:99:f3:31:38:ca:b7:b6:3b:21:53:55:ff:f3:76:1e  #If you trust this host, enter "y" to add the key to PuTTY's cache and carry on connecting.

  #If you want to carry on connecting just once, without adding the key to the cache, enter "n".

  #If you do not trust this host, press Return to abandon the connection.  #  #Run plink and confirm rsa2 key fingerprint with yes

  #---------------------------------------------------  $process = StartProcess $strExecutablePLink (' -l '+$XenServerUsername+' -pw '+$XenServerPassword+' '+$XenServerHost+' exit')

  $process.StandardInput.WriteLine('y')    #Retrieve IP of VM  #=================  #  #Create a script to query a XenServer and ask the networks of the VM  #-------------------------------------------------------------------  New-Item $strPathTemp -Name $strFileQueryNetworks -type file -Force  | Out-Null  Add-Content ($strPathTemp + '' + $strFileQueryNetworks) -Value ('xe vm-list '+$strFilterVM+' os-version:distro="windows" params=networks --minimal')

  #Run the script on the specified XenServer

  #-----------------------------------------  $process = StartProcess $strExecutablePLink (' -l '+$XenServerUsername+' -pw '+$XenServerPassword+' '+$XenServerHost+' -m '+($strPathTemp + '' + $strFileQueryNetworks))

  $VMNetworks = $process.StandardOutput.ReadLine()

  Remove-Item ($strPathTemp+''+$strFileQueryNetworks)

  #Determine if the networks of the virtual machine can be found

  #--------------------------------------------------------------  if(!$VMNetworks) {  Write-Host "The virtual machine '"$VirtualMachineName"' could not be found."  Write-Host ""     Write-Host "Press any key to continue ..."     $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

   break  } else {  

   #Determine the IP address of the NIC can be found     foreach ($strVMNetwork in $VMNetworks.Split(";")) {        if ($strVMNetwork.Contains($strNICInterface)) {           $strVMIPaddress=$strVMNetwork.Substring($strVMNetwork.IndexOf($strNICInterface) + $strNICInterface.Length)       }     }

   #Determine if the IP address of the network ID can be found     #--------------------------------------------------------------     if(!$strVMIPaddress) {        Write-Host "The IP address of network '"$VirtualMachineNetworkID"' could not be found."        Write-Host ""        Write-Host "Press any key to continue ..."        $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")        break

  }     else {         Write-Host "The virtual machine '"$VirtualMachineName"' is connected via IP "$strVMIPaddress    }
  
  } 
 
  #Start MSTSC to the VM
  
  #======================

  $processMSTSC=StartProcess $strExecutableMSTSC ('/v:'+$strVMIPaddress+' /f')

  最后,在Citrix博客中,Ajene' Hall Barrett贴出了一款功能非常强大的脚本,实现了虚拟桌面的自动化部署。这个脚本包括了变量引用,活动目录cmdlets,以及XenServer和PVS(部署服务器)cmdlets。所有的脚本编写良好,而且非常有参考价值。

  高级脚本进一步证明了你可以使用XenServer PowerShell cmdlets实现自动化管理。随着Citrix工具集的不断发展,所有的这些功能应该会进一步扩展并增强。

翻译

张冀川
张冀川

TechTarget中国特约专家,任职于某国企信息中心,负责数据中心硬件基础设施及信息系统运维管理工作,对虚拟化及云计算技术有浓厚兴趣,并在工作中积极应用

相关推荐