#azure #azure-automation #azure-runbook #powershell-workflow
#azure #azure-автоматизация #azure-runbook #powershell-рабочий процесс
Вопрос:
Я написал следующий рабочий процесс runbook, но время от времени я вижу ошибку, когда он пытается запустить или остановить виртуальную машину:
Запуск-AzVM: ваши учетные данные Azure не были настроены или истекли, пожалуйста, запустите Connect-AzAccount, чтобы настроить ваши учетные данные Azure. В StartStopVmByTag:46 char:46 CategoryInfo : CloseError: (:) [Start-AzVM], ArgumentException FullyQualifiedErrorId : Microsoft.Azure.Команды.Вычислить.StartAzureVMCommand
Я попытался передать переменную $ azContext, но я все еще получаю эту проблему, как я могу продолжить расследование?
workflow StartStopVmByTag {
$connectionName = "AzRunAsConnection2042";
try {
# Get the connection "AzureRunAsConnection "
$servicePrincipalConnection = Get-AutomationConnection -Name $connectionName
Write-Output "Logging in to Azure..."
$null = Add-AzAccount `
-ServicePrincipal `
-TenantId $servicePrincipalConnection.TenantId `
-ApplicationId $servicePrincipalConnection.ApplicationId `
-CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint
}
catch {
if (!$servicePrincipalConnection) {
$ErrorMessage = "Connection $connectionName not found."
throw $ErrorMessage
}
else {
Write-Error -Message $_.Exception
throw $_.Exception
}
}
[DateTime]$now = [System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId((Get-Date), 'GMT Standard Time')
$startTag = 'Start Schedule'
Write-Output "*** $now - Runbook Started ***"
# Get Subscriptions
$Subscriptions = Get-AzSubscription
ForEach ($Subscription in $Subscriptions) {
$azContext = Set-AzContext -SubscriptionId $Subscription.Id
# Get all VM's with a Start or Stop Schedule
Write-Output "$($Subscription.Name): Getting VM's..."
[Array]$taggedVms = Get-AzResource -TagName $startTag -ResourceType 'Microsoft.Compute/virtualMachines'
$taggedVms = $taggedVms | Sort-Object -Property Name -Unique
# For each VM, check if start schedule is valid for now
Foreach -Parallel ($taggedVm in $taggedVms) {
Write-Output "$($Subscription.Name): Found Tagged VM: $($taggedVm.Name), $($startTag): $($taggedVm.Tags.$startTag -replace 's', '')"
$WORKFLOW:null = Start-AzVM -ResourceGroupName $taggedVm.ResourceGroupName -Name $taggedVm.Name -DefaultProfile $azContext -NoWait
}
}
}
Комментарии:
1. В какой строке произошла ошибка? Не могли бы вы сократить свой код, чтобы сделать его минимально воспроизводимым фрагментом кода?
2. Я минимизировал код. Я по-прежнему могу воспроизвести ошибку при запуске в качестве runbook в Azure Automation, но никогда не мог воспроизвести ее при запуске на моем локальном компьютере. Ошибка иногда возникает при запуске Start-AzVM
3. @JoyWang Dud у вас есть возможность взглянуть на минимальный воспроизводимый код, чтобы узнать, можете ли вы понять, что я делаю неправильно?
Ответ №1:
Я некоторое время боролся с этой проблемой, и я перепробовал десятки различных обходных путей, но ничего не сработало. Я, наконец, решил это с помощью этих принудительных настроек реестра.СЕТЕВЫЕ приложения для использования TLS 1.2. Мне кажется очень странным, что это решение работает, но, возможно, потому, что TLS 1.2, установленный как часть какой-либо родительской задачи, не передается заданию.
Вероятно, они не все обязательны, но в любом случае это, похоже, лучшая практика в наши дни.
set-itemproperty "HKLM:SOFTWAREMicrosoft.NETFrameworkv2.0.50727" -name SystemDefaultTlsVersions -value 1 -Type DWord
set-itemproperty "HKLM:SOFTWAREMicrosoft.NETFrameworkv4.0.30319" -name SchUseStrongCrypto -value 1 -Type DWord
set-itemproperty "HKLM:SOFTWAREWow6432NodeMicrosoft.NETFrameworkv2.0.50727" -name SystemDefaultTlsVersions -value 1 -Type DWord
set-itemproperty "HKLM:SOFTWAREWow6432NodeMicrosoft.NETFrameworkv4.0.30319" -name SchUseStrongCrypto -value 1 -Type DWord