使用筛选器的作业并行编写脚本

本文关键字:并行 脚本 作业 筛选 | 更新日期: 2023-09-27 18:35:44

我已经编写了一个脚本,该脚本在Hyper-V中构建了数百个虚拟机,但此时它基于每行具有虚拟机的CSV文件为每个主机创建一台计算机。

CSV input looks kinda like this:
HOSTNAME,VMName,CPU,MEM,VHDPATH
Host1,test1,2,4,D:'server2008.vhd
Host1,test2,2,4,D:'server2k3.vhd
Host2,test3,2,4,D:'server2k3.vhd
Host2,test4,2,4,D:'server2k3.vhd
Host3,test5,2,4,D:'server2k3.vhd
Host3,test6,2,4,D:'server2k3.vhd
我想

做的是,如果同一主机上有多个 VM(如上面),我只想一次只在那里构建一个 VM,但同时,我想在其他主机上构建 VM。这个想法是,每个主机将创建 1 个 VM,并且将在不同的主机上并行进行多个创建。VM 完成后,它会向下移动该主机的列表并生成下一个主机。理论上,应该同时创建 3 个 VM,每个主机 1 个。

我试过设置工作,但不能正确,请指教!提前谢谢你

更新

我将如何获取输入文件,创建一个基于主机分成数组的计算机列表。那么,按主机、每个阵列执行此作业?

使用筛选器的作业并行编写脚本

如果您使用的是 PowerShell V3,请使用工作流。

workflow Provision-VM {
    param([psobject[]]$HostInfo)
    foreach -parallel ($host in $HostInfo) {
        foreach ($vmInfo in $host.VM) {
            Invoke-Command -cn $host.Name -File path-to-script.ps1 -Arg $vmInfo
        }
    }
}

我会将每个主机的 VM 信息合并到每个主机的单个自定义对象中,并将其传递到工作流中。 一般来说,我不会在工作流中执行细粒度脚本,尤其是在调用工作流之前可以制定出细粒度脚本时。

HostInfo 对象如下所示:

$hostInfo += [pscustomobject]@{Name='Host1';VM=@([pscustomobject]@{Name='test1';CPU=2;MEM=4;VHDPATH='c:'...'},[pscustomobject]@{... next VM ...})}