我在VSTS中的Azure Powershell任务中运行PowerShell脚本,该任务在DevTest实验室中启动多个Azure虚拟机,但首先启动域控制器,等待它启动,然后依次启动其他域控制器
我想并行启动所有其他人,我尝试使用Start-Job
执行此操作,但这会产生一个新的Powershell进程,该进程没有Azure登录的安全上下文,所以它失败了。我正在尝试这样的事情:
[cmdletbinding()]
param (
[ValidateSet("Start","Stop")][string]$Action,
$labName = "DevTestLab",
$labResourceGroup = "DevTestLabRG"
)
if ($Action -eq "Start") {
Write-Verbose "Starting the domain controller first"
Get-AzureRmResource | Where-Object {
$_.Name -match "dc" -and
$_.ResourceType -eq "Microsoft.Compute/virtualMachines" -and
$_.ResourceGroupName -match $labResourceGroup } | Start-AzureRmVM
Write-Verbose "Starting other machines in the lab as background jobs"
foreach ($AzureRMResource in Get-AzureRmResource |
Where-Object {
$_.Name -notmatch "dc" -and
$_.ResourceType -eq "Microsoft.Compute/virtualMachines" -and
$_.ResourceGroupName -match $labResourceGroup } )
{
Start-Job {
$myResource = $using:AzureRMResource
Start-AzureRMVM -Name $myResource.Name -ResourceGroupName $myResource.ResourceGroupName
}
}
# wait for all machines to start before exiting the session
Get-Job | Wait-Job
Get-Job | Remove-Job
}
我正在使用托管代理来运行脚本,因此我无法同时运行多个代理,而据我所知,VSTS并不支持并行任务。
关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
您也可以使用Azure CLI,而不是创建PowerShell脚本。 Azure CLI具有vm start
和vm stop
命令,该命令采用ID列表。您还可以使用CLI查询所需的所有ID。以下是一个简单的Bash片段,用于启动/停止id包含 Test 的所有vms。
# example usage
az vm start --ids $(
az vm list --query "[].id"
-o tsv | grep "Test"
)
az vm stop --ids $(
az vm list --query "[].id"
-o tsv | grep "Test"
)
答案 1 :(得分:0)
您也可以通过Azure CLI任务使用带有--no-wait
参数的az vm start命令进行尝试。