我开发了一个 PowerShell 脚本,用于处理所有 AWS EC2 实例上的健康检查相关内容。该脚本的一部分是打开 EC2 实例的电源并等待 EC2 实例上线。我有多个 AWS 账户和 10000 个 EC2 实例,需要对其运行。 AWS 账户集成了 SSO。
主脚本具有启动作业脚本块,在该块内我有 foreach-object -parallel 块来启动具有特定标签和名称值的实例。我必须将 AWS 配置文件和区域传递给 foreach-object -parallel 才能启动 ec2instances。但低于错误
“ForEach-Object:无法检索 using 变量 '$using:profilename' 的值,因为尚未在本地会话中设置它。”
foreach ($account in $awsaccounts){
$AWSprofilename = $account.clientname
$AWSClientRegion = $account.region
$params = @($AWSprofilename, $AWSClientRegion)
$job = Start-Job -Name $AWSprofilename -ScriptBlock {
param($profilename, $awsregion)
$hostnamefilter ="*ABC*","*XYZ*"
$HostnameFilterblock = [scriptblock]::Create( '$_.Hostname -like "' + ($hostnamefilter -join '" -or $_.Hostname -like "') + '"')
$stoppedinstancesreport = (Get-EC2Instance -ProfileName $profilename -Region $awsregion -Filter @{name = 'tag:Filter'; values = 'filtervalue'}).Instances | Where-Object {($_.State.Name -eq "Stopped")} | Select-Object InstanceID, @{N="Hostname";E={($_ | Select-object -ExpandProperty tags | Where-Object -Property Key -eq Name).Value}}, @{N= "State";E={$_.State.Name}}
$FilteredStoppedServers = $stoppedinstancesreport | Where-Object $HostnameFilterblock
$FilteredStoppedServers | ForEach-Object -Parallel {
Start-EC2Instance -ProfileName $using:profilename -Region $using:awsregion -InstanceId $_.InstanceId -Confirm:$false
while (((Get-EC2InstanceStatus -InstanceId $_.InstanceId -ProfileName $profilename -Region $awsregion.Status.Status.Value) -ne "OK")
{
Write-Host "wating for $($_.Hostname) to come online completely"
Start-Sleep -Seconds 5
}
}
} -ArgumentList $params
}
我尝试使用 "$using:AWSprofilename " 和 "$using:AWSClientRegion " 传递变量,但仍然遇到相同的错误。
在开始作业之外设置变量对我有用。
$profilename = 'joe'
start-job {
foreach-object -parallel { $using:profilename }
} | receive-job -wait -auto
joe