http://www.361way.com/powercli-deploy-vmware/4877.html
为方便阅读中文和代码,使用了一键翻译,复制粘贴大法,并且调整了一点可读性
在现网主机中,经常会有大量虚拟主机创建的需求,负责虚拟化的同事刚好最近有100台主机上线创建的需要求,发现其需要根据模板一台一台的去克隆,感觉很不智能,刚好最近又了解过RHEV的虚拟化,在RHEV中有池的概念,也可以批量创建。这里也找下VMware批量创建的方法。网上找到的工具是powercli,需要安装在vcenter client主机上。文章的内容如下(懒得译这来了):
非常规环境的大小范围非常大;从小型企业或具有几个VM的测试实验室中的一台物理服务器,到具有数百或数千个物理服务器和看似无限VM的大型企业。无论您的环境大小如何,作为一名优秀的系统管理员,您都必须以一致的方式配置环境并尽可能合理地进行自动化,这一点很重要。
如果您使用VMware ESX / ESXi虚拟机管理程序和vCenter作为管理软件,那么您已经可以使用许多自动化工具来帮助您使基础架构尽可能平稳地运行。其中包括VMware vSphere PowerCLI
,VMware vSphere CLI
和适用于Perl的 VMware vSphere SDK
。在本文中,我将重点介绍VMware vSphere PowerCLI
(作为Microsoft Windows PowerShell
命令行工具和脚本语言的管理单元提供的自动化工具),以及任何系统管理员可以启动其虚拟基础结构自动化的10种方法。 。
入门
正如我刚才提到的,vSphere PowerCLI
是作为Microsoft Windows PowerShell
的管理单元提供的,因此要使用它,您需要:
.NET Framework 2.0 SP1
Windows PowerShell 1.0或2.0
注意
如果您具有Windows PowerShell 2.0,则建议您安装.NET Framework 3.5 SP1,因为这样您就可以访问内置的PowerShell ISE和cmdlet(例如Out-GridView)。
当然,您应该始终参考VMware网站以获取最新的系统要求。在撰写本文时,PowerCLI
当前处于版本4.0 Update 1中,并且在以下32位和64位平台上受支持:
PowerCLI本身将连接并管理:
还有一个单独的PowerShell管理单元可用于VMware Update Manager
,该工具是VMware vCenter
的随附工具,用于集中管理ESX / ESXi主机和来宾虚拟机的修补程序。尽管必须注意这些cmdlet需要VMware vSphere PowerCLI 4.0 Update 1
,但此管理单元具有与主要PowerCLI工具类似的系统要求,并且仅适用于VMware Update Manager 4.0 U1
。因此,如果您的vCenter是基本4.0版本或更早的版本,则将无法使用它们,并且需要升级。
可以从VMware PowerCLI站点找到并下载上述两组cmdlet ,该站点是使用PowerCLI入门所需的一切的绝佳参考站点。如果您真的遇到问题,论坛上有专家等着您回答任何问题。请记住,当您开始使用时,您的大多数问题很可能已经在这些论坛中得到了回答,而简单的搜索就会找到这些问题的答案。
一旦安装了所有系统要求,即可通过安装程序在桌面上放置的快捷方式轻松访问PowerCLI cmdlet。另外,如果您已经熟悉Windows PowerShell,则可能只想将VMware管理单元添加到自己的会话中。如果不确定如何执行此操作,则可以使用Add-PSSnapin cmdlet
使这些cmdlet可用于当前会话,如下所示:
Standard PowerCLI cmdlets PowerCLI cmdlets
Add-PSSnapin VMware.VimAutomation.Core
VMware Update Manager cmdlets
Add-PSSnapin VMware.VumAutomation
对于常规使用,将它们添加到默认的PowerShell配置文件是有意义的,可以通过在PowerShell中输入以下命令来打开它们:
notepad $profile
这将打开一个包含自定义配置的文本文件,该文件将在每次打开PowerShell会话时运行。如果您收到一个错误信息,即配置文件不存在(即尚未创建),则可以通过以下方式简单地创建一个配置文件:
New-Item -Path $profile -ItemType file -Force -Item -Path $profile -ItemType file -Force
打开个人资料后,只需向其添加以下行:
Add-PSSnapin VMware.VimAutomation.Core, VMware.VumAutomation -PSSnapin VMware.VimAutomation.Core, VMware.VumAutomation
开始使用PowerCLI的最后一步是建立与VMware vCenter
的连接或与ESX / ESXi
主机的直接连接。这在概念上类似于打开vSphere Client并连接到VMware vCenter
或直接连接到ESX / ESXi主机。使用Connect-VIServer cmdlet
建立与VMware vCenter
的连接:
Connect-VIServer vCenterServerName -VIServer vCenterServerName
…或主机(如果直接配置主机):
Connect-VIServer HostServerName - VIServer HostServerName
系统将使用您当前登录的凭据来建立与目标的连接。如有必要,可以使用–Username和–Password参数指定备用凭据。如果当前凭据不足,则可能会通过标准Windows对话框提示您输入更合适的凭据。
现在,您已经配置并连接了VMware自动化工具,是时候看看如何使用它们来尽可能多地使VM维护自动化。如您所见,我已将此启动过程分为几个步骤,以使其易于遵循。这些步骤是单独的独立操作,尽管可以编写脚本以进行强大的组合。总而言之,所有10个步骤将为您提供一些更复杂的自动化的坚实基础。在开始之前,我建议
下载Alan Renouf出色的快速参考指南(PDF),以防万一您想查找我将要讨论的任何cmdlet的详细信息。
1)查看和配置虚拟机
虚拟基础架构放在一起的原因主要是(并且毫不奇怪)要运行虚拟机,因此从Get-VM cmdlet 入手是一个很好的起点,它可以生成VMware vCenter
中当前找到的所有VM的简单清单。使用Get-VM cmdlet
和标准的PowerShell Select-Object cmdlet
,您可以检索感兴趣的特定属性,并使用Export-CSV将数据导出为常用的CSV文件格式,以进行进一步的操作和分发。
Get-VM | Select-Object Name,NumCPU,MemoryMB,PowerState,Host |-VM | Select-Object Name,NumCPU,MemoryMB,PowerState,Host |
Export-CSV VMs.csv -NoTypeInformation
其样本结果如下所示:
可以充分利用此cmdlet
的另一个示例是,当尝试将VMotion
虚拟机从一台ESX主机迁移到另一台ESX主机时,它可以减轻常见的绊脚石(如果您不定期使用VMware,则“到VMotion虚拟机…”表示“使用VMware VMotion
将虚拟机实时迁移到另一个物理主机…”)。出于多种原因,可能不允许虚拟机使用VMotion
。最常见的原因之一是因为它连接了本地CD-Rom驱动器。以下命令集将遍历所有虚拟机,根据其CD-Rom驱动器的连接状态是否为真对它们进行过滤,并返回有问题的虚拟机的名称:
Get-VM | Where-Object {$_ | Get-CDDrive |
Where-Object { $_.ConnectionState.Connected -eq "true" } } |
Select-Object Name
PowerShell
的一大优点是直观的可能性,可以逐步建立一组命令来执行越来越复杂的操作。这意味着可以在一个步骤中查看和正确配置VM。在这种情况下,除了获取连接CD-Rom
的虚拟机的列表之外,扩展上述命令以自动断开这些CD-Rom
的操作非常简单,而不是手动执行该任务。只需使用Set-CDDrive cmdlet
更改已找到的任何已连接CD-ROM
的连接状态:
Get-VM | Where-Object {$_ | Get-CDDrive |
Where-Object { $_.ConnectionState.Connected -eq "true" } } |
Get-CDDrive | Set-CDDrive -Connected $false -Confirm:$false
这只是一个示例,但是现在您知道了如何快速收集所需的数据,因此可以轻松地针对特定设置并快速进行适当的配置。您可以从PowerCLI
网站上找到有关哪些cmdlet
可用来调整VM设置的更多信息,如前所述。
2)基本能力信息
PowerCLI cmdlet
可用于快速概述Virtual Center
中存在的主机和VM的数量。每月记录这些数字可能很有用,以便可以随时间跟踪环境的增长。如何查找群集中每个主机的平均VM数量?同样,它是一个有用的数据,可以定期进行记录,以观察达到的合并率并计划未来的容量需求,并提供一个PowerCLI
可以帮助您找到的数据。
在下面的代码中,我们检索ESX / ESXi
主机和VM并观察它们的数量;请注意,使用$ DefaultVIServer变量,该变量在每次连接到vCenter时都会更新。
对于每个群集中的平均VM数量,我们找到ESX / ESXi
主机和VM的总数,并执行一些基本数学运算得出一个数字。请注意使用一些基本的.NET [math] ::
舍入代码和按要求格式化输出所需的小数位数(1):
# Total number of hosts
$TotalVMHosts = (Get-VMHost).Count
Write-Host "There are $TotalVMHosts Hosts in $DefaultVIServer"
# Total number of guests
$TotalVMs = (Get-VM).Count
Write-Host "There are $TotalVMs Virtual Machines in $DefaultVIServer"
# Average VMs Per Cluster
$Clusters = Get-Cluster
foreach ($Cluster in $Clusters){
$VMHosts = Get-Cluster $Cluster | Get-VMHost
$VMs = Get-Cluster $Cluster | Get-VM
$AverageVMsPerCluster = [math]::round(($VMs.count / $VMHosts.count), 1)
Write-Host "$Cluster has $AverageVMsPerCluster guests per VMware host"
}
3)重新扫描新存储
对于VMware管理员来说,最繁重的任务之一是在配置了额外的SAN Lun
之后,使用vSphere Client GUI
重新扫描群集中的所有主机以寻找新存储。这将需要单独选择集群中的每台主机,扫描它以寻找新的存储,然后继续移动到下一个主机,直到所有主机都完成为止,这个过程很快就变得令人沮丧。
幸运的是,在vSphere 4.0
中,VMware
在右键单击群集时添加了一个新选项- 重新扫描数据存储。一旦启动,此任务将遍历群集中的每个主机并扫描新存储。
但是,如果您在环境中运行的是4.0之前的VMware
版本,或者您想重新扫描多个群集中的主机,则Get-VMHostStorage cmdlet
具有两个有用的参数: –RescanAllHba
和– RescanVmfs
。与Get-Cluster
和Get-VMHosts cmdlet
结合使用,Get-VMHostStorage
可以迅速变得非常强大。例如,以下命令将重新扫描群集1中所有主机上的新存储:
Get-Cluster 'Cluster 1' | Get-VMHost |
Get-VMHostStorage -RescanAllHba -RescanVmfs
4)将VMotion虚拟机连接到其他主机
作为虚拟基础架构管理员,您将不时需要通过修补或硬件更换来对主机服务器进行维护。正如我已经提到的,VMware
在ESX
和vCenter中提供了一些出色的VMotion
技术,该技术使虚拟机可以从一台物理主机转移到另一台物理主机,而不会导致虚拟机停机。要将所有VM从一台主机移动到另一台主机,请使用以下简单的一个内胆:
Get-VMHost esx01 | Get-VM | Move-VM -Destination (Get-VMHost esx02)
当然,目标主机上可能没有足够的资源来移动所有VM,因此可能希望在多个主机之间更均匀地分配它们。下面的简短脚本将所有可爱的技术打包为一个优雅的步骤,将VMotion
将所有虚拟机从群集中的一台主机移动到同一群集中的其他随机主机。
$sourcehostname = (Get-VMHost 'esx01’).name
$clusterhosts = Get-Cluster 'Cluster 1' | Get-VMHost |
Where-Object {$_.name -notlike "$sourcehostname"}
$vms = Get-VMHost $sourcehostname | Get-VM
foreach ($vm in $vms){
$targethost = $clusterhosts | Get-Random
Move-VM -VM $vm -Destination $targethost
}
首先,源主机的名称将存储在变量$ sourcehostname
中。然后,我们检索集群1中的所有主机,从该列表中删除源主机,并将结果存储在$ clusterhosts
中。接下来,我们检索源主机上的所有虚拟机,将它们存储在$ vms中,最后循环浏览每个虚拟机,生成一个随机目标主机,然后将VM移至该目标主机。
5)将VMotion虚拟机存储到新的SAN
与VMotion
技术将虚拟机从一台物理主机迁移到另一台物理主机的方式类似,也可以在虚拟机保持在线状态的同时在数据存储之间移动虚拟机的磁盘,该技术称为Storage VMotion
。如果将主机配置为可以查看新旧SAN上的存储,并且有足够的带宽来传输必要的数据,那么即使在不同的SAN之间也可以做到这一点。
假设您已经映射了一个CSV文件,该文件将每个虚拟机的磁盘存储到以下数据存储中:
我们可以使用Import-CSV cmdlet
将数据带入PowerShell
会话,然后将其馈入Get-VM
和Move-VM cmdlet
以将这些虚拟机存储到新的SAN上。
$vms = Import-CSV C:\Scripts\SVMotion.csv
foreach ($vm in $vms){
Get-VM $vm.name | Move-VM -Datastore $vm.targethostname
}
请注意,Import-CSV cmdlet
将采用CSV文件中的列标题并将其作为属性标签启用访问;即对于第2行,$ vm.name
是Server01
,而$ vm.targetdatastore
是Datastore1_NEW
。
进行此类SAN迁移时,您可能希望在正常办公时间之外进行工作,以利用SAN上的低使用期,从而更快地移动数据。因此,为什么不创建Windows Scheduled Task
来启动上述脚本并将其安排在所需的时间呢?如果您想变得真正聪明,则可以使用Send-MailMessage PowerShell cmdlet
在每次Storage VMotion
完成时使它通过电子邮件发送给您。
6)从模板部署虚拟机
部署新的虚拟机是一项简单的任务,特别是如果您已经创建了基本模板并使用来宾自定义功能对新的Windows虚拟机进行系统准备,则尤其如此。但是,如果您要从GUI部署多个虚拟机,那么即使此过程也会很快变得乏味。
让我们举个例子,您以CSV文件的形式提供了对五个新虚拟机的请求:
再次使用Import-CSV
读取输入数据,可以轻松部署虚拟机。然后,我们循环浏览虚拟机,并为每个部署获取要使用的模板,主机,数据存储和自定义,然后最终执行New-VM cmdlet
并向其提供用于创建每个VM的各种参数:
$vms = Import-CSV C:\Scripts\NewVMs.csv
foreach ($vm in $vms){
$Template = Get-Template $vm.template
$VMHost = Get-VMHost $vm.host
$Datastore = Get-Datastore $vm.datastore
$OSCustomization = Get-OSCustomizationSpec $vm.customization
New-VM -Name $vm.name -OSCustomizationSpec $OSCustomization
-Template $Template -VMHost $VMHost -Datastore $Datastore -RunAsync
}
7)配置vSwitch和端口组
在群集中的所有ESX / ESXi
主机之间保持网络配置的一致性和准确性至关重要。对于像VMotion这样的技术来说尤其如此,该技术需要在源主机和目标主机上进行相同配置的联网,以使虚拟机能够在它们之间进行传输。在企业环境中,通过不同vSwitch上的多个端口组提供多个VLAN是非常普遍的。因此,在将新的ESX / ESXi
主机部署到群集中时,可能需要大量的手动网络配置,这很容易导致犯错,并且管理员非常无聊。
为了解决这个问题,VMware在vSphere 4.0
中引入了一些新技术,称为Host Profiles
。但是,这仅适用于已购买Enterprise Plus
许可的客户。著名的PowerCLI社区专家Alan Renouf
通过他的博客提供了一个解决此问题的简单替代方案(而不是在此处复制脚本,我建议您在这里完成后再看一下他的博客。我将在此处提供链接)本文的结尾)。这个简短的脚本将提示管理员输入源主机和目标主机,从源主机复制网络配置并将其应用于目标。简单但非常有效,并且节省大量时间;无需使用主机配置文件。
8)配置NTP时间服务器
在ESX / ESXi
主机之间保持一致配置的另一项是用于保留时间的NTP服务器。无论是在新主机上进行设置还是在所有主机上进行更改,使用PowerCLI都可以轻松实现。要将NTP服务器添加到先前未配置的新主机esx01中,请使用:
Get-VMHost esx01 | Add-VMHostNtpServer -NtpServer ntpservername
或者首先清除现有的NTP服务器,然后设置新的NTP服务器:
Get-VMHost esx01 | Remove-VMHostNtpServer `
-NtpServer (Get-VMHost esx01 | Get-VMHostNtpServer)
Get-VMHost esx01 | Add-VMHostNtpServer -NtpServer ntpservername
9)通过VMware Update Manager修补
如本文开头所述,还有一组其他命令可以与VMware Update Manage
r结合使用,以帮助自动修补ESX / ESXi
主机或VM。在计划补丁程序部署时,可能有必要向管理层提供有关要安装的补丁程序列表的信息。尽管VMware Update Manager
具有可用于大多数任务的GUI,但很难从GUI中提取此信息并将其提取为可分发的格式。
下面的代码将找到主机的合规性状态(针对基准进行扫描),然后将该主机所需的修补程序列表导出到CSV文件中:
$ComplianceStatus = Get-Compliance -Entity 'esx01' -Detailed
$ComplianceStatus.NotCompliantPatches |
Select-Object Name,IDByVendor,Description,`
@{n='Product';e={$_.product |
Select-Object -expandproperty Version}},ReleaseDate |
Export-Csv patches.csv -NoTypeInformation
或如何使任何新安装的ESX / ESXi
主机立即以当前标准补丁程序基准保持最新状态?简单。
检索所需的基准:
$Baseline = Get-Baseline "Current ESX Baseline"
将基准附加到所需的ESX / ESXi
主机:
$Baseline | Attach-Baseline -Entity esx01
扫描主机以确定所需的修补程序:
$Baseline | Remediate-Inventory -Entity esx01 -Confirm:$false
这些命令都可以添加到简短脚本中,以在构建过程结束时运行,以确保所有新部署的主机处于所需的补丁程序级别。
10)安排vCheck报告脚本每天运行
先前提到的PowerCLI
社区专家Alan Renouf编写了一个惊人的,非常慷慨的,完全免费的PowerShell报告脚本,该脚本可以在vCenter环境中运行,并报告许多常见问题和最佳实践。该报告称为vCheck
,可从Alan的Virtu-Al.net
网站上获得。这是主动采取主动措施并在问题变得严重之前发现基础结构问题的好方法。
将发现的常见问题包括超过指定天数的快照,未安装VMware Tools
的虚拟机以及可用存储空间少于指定数量的数据存储。强烈建议您安排此报告在您的vCenter上运行,并每天通过电子邮件将结果发送给您-您很可能会发现您根本不知道的问题!
摘要
无论规模大小,VMware环境都可以从自动化中受益匪浅。本文向您介绍了其中的一些可能性,以及如何使用它们使您的系统以更一致的方式更好地运行。这样做的好处有两点:发现所有虚拟环境的状态变得容易得多,并且有更多的时间花在从未涉足的项目上。
您不仅会变得积极主动,而且还将有更多时间对此感到满意。PowerCLI使用起来很直观,并且非常简单,可以非常快速地获得真实的结果–如果您还没有这样做,我敦促您尝试一下!
资源资源
VMware工具:
在上面的第六步中实现了对主机通过CVS的表格进行批量创建,不过离我想要的还差一些,想的是自动创建后按表格中设置的主机名和IP再配置好相应的主机名和IP。不过实现主机名和IP的自动配置后面再想办法吧,网上也看到了另外一篇部分内容如下:
New-vm -vmhost esx04.vmpros.local -Name FS-SVR01 -Template WIN2008R2_Template -Datastore datastore2 -OSCustomizationspec WIN2008R2_Template
New-vm -vmhost esx04.vmpros.local -Name FS-SVR02 -Template WIN2008R2_Template -Datastore datastore2 -OSCustomizationspec WIN2008R2_Template
New-vm -vmhost esx04.vmpros.local -Name FS-SVR03 -Template WIN2008R2_Template -Datastore datastore2 -OSCustomizationspec WIN2008R2_Template
New-vm -vmhost esx04.vmpros.local -Name FS-SVR04 -Template WIN2008R2_Template -Datastore datastore2 -OSCustomizationspec WIN2008R2_Template
New-vm -vmhost esx04.vmpros.local -Name FS-SVR05 -Template WIN2008R2_Template -Datastore datastore2 -OSCustomizationspec WIN2008R2_Template
脚本:(另存为:FileserverDeploy.ps1
)
-vmhost =目标主机;
-Name =新VM的名称;
-Template:要从其中的模板部署新的VM;
-数据存储:目标数据存储以放置新的虚拟机;
-OSCustomizationspec =要部署新VM的Wich“准备”模板;
具体运行结果如下: