提问人:Leshawn Rice 提问时间:10/31/2023 更新时间:11/11/2023 访问量:70
Azure 自动化帐户 PowerShell Runbook 重启自身
Azure Automation Account PowerShell Runbook Restarting Itself
问:
我在 Azure 中有一个自动化帐户,其中包含一些 PowerShell Runbook。Runbook 也在 Azure 中的 Windows 混合辅助角色 VM 上运行。我所有的 Runbook,除了一次运行没有问题。问题 Runbook 运行良好,但随后会自行重启,并且会一遍又一遍地执行此操作。
Runbook 中的相关代码为:
Initialize-Variables
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = { $true }
$session_token = Get-Token
.\log-message.ps1 -RunbookVariables $script:CommonVars -Message "Polling ${script:secret_source} for certificates"
$devices = Get-Devices -session_token $session_token
$certificates = @();
$certificate_types = @("local", "remote", "ca", "pki", "ocsp-server");
foreach ($device in $devices) {
$device_id = $device.vdom[0].devid;
$device_certs = @();
foreach ($cert_type in $certificate_types) {
$type_certs = Get-DeviceCerts -session_token $session_token -device_id $device_id -cert_type $cert_type
if ($null -eq $type_certs) { Continue }
try {
$device_certs += $type_certs.Where({ $null -ne $_._certinfo })
}
catch {
$device_certs += @($type_certs).Where({ $null -ne $_._certinfo })
}
}
.\log-message.ps1 -RunbookVariables $script:CommonVars -Message "Checking '${device_id}' for certificates"
foreach ($cert in $device_certs) {
$parsed_cert = Set-Certificate -cert $cert -device_id $device_id;
# Confirm the cert is not a duplicate
if (!(Find-Duplicate -certificates $certificates -cert $parsed_cert)) {
$certificates += @($parsed_cert)
}
}
}
Remove-Token -session_token $session_token
.\log-message.ps1 -RunbookVariables $script:CommonVars -Message "${script:secret_source} Certificates polled"
.\log-message.ps1 -RunbookVariables $script:CommonVars -Message "Checking delta table for diffs"
$script:CommonVars["secrets"] = $certificates
.\manage-secret-database.ps1 -RunbookVariables $script:CommonVars
.\log-message.ps1 -RunbookVariables $script:CommonVars -Message "FINISHED POLLING CERTIFICATES FOR FORTIGATE"
# Nullify sensitive vars, letting the garbage collector know they're ready to be collected
$script:db_client_secret = $null
$script:db_password = $null
$script:fortimanager_password = $null
# Nullify secret array, letting the garbage collector know it's ready to be collected
# The secret array doesn't contain any sensitive info per-se, but since it's metadata on secrets/certs, it's best to clear it anyway
$script:secrets = $null
$script:certificates = $null
.\log-message.ps1 -RunbookVariables $script:CommonVars -Message "Starting Garbage Collection"
# Force Garbage collection
[GC]::Collect()
# FIXME: unless we explicitly write output at the end of this specific script, it will call itself infinitely
Start-Sleep 10
Write-Output "Attempting to Exit"
Exit 0
该脚本调用其他一些 Runbook、 和 。但其他 Runbook 在不重启的情况下调用这些相同的 Runbook。
我认为问题是脚本需要输出一些东西,所以我添加了逻辑来写入一些输出,然后显式退出,但输出被写入,然后运行手册就重新启动了。log-message
initialize-common-vars
manage-secret-database
我问了ChatGPT,我在谷歌上搜索了高低,但找不到解决方案。有什么想法吗?
答:
0赞
Robina Mirbahar
11/10/2023
#1
删除脚本末尾的 Start-Sleep 10 和 Exit 0,因为它可能会导致重启,在 azure 自动化中,当脚本到达末尾时,脚本执行被视为完成。添加睡眠和退出可能会导致 Runbook 重启。
相反,您可以在脚本中使用 Start-Sleep 和 Wait-Event 来确保延迟或等待特定条件。
0赞
Leshawn Rice
11/11/2023
#2
我能够解决这个问题。问题在于,即使使用混合辅助角色,如果 Runbook 生成子 Runbook,则该子级只有 10 分钟的执行时间。如果子 Runbook 未能在 10 分钟内完成,则父 Runbook 将重新启动(不会终止子 Runbook 的进程)
评论