Azure 自动化帐户 PowerShell Runbook 重启自身

Azure Automation Account PowerShell Runbook Restarting Itself

提问人:Leshawn Rice 提问时间:10/31/2023 更新时间:11/11/2023 访问量:70

问:

我在 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-messageinitialize-common-varsmanage-secret-database

我问了ChatGPT,我在谷歌上搜索了高低,但找不到解决方案。有什么想法吗?

Azure PowerShell Azure-Automation

评论

1赞 Leshawn Rice 11/8/2023
我删除的代码只是实用函数。我能够解决这个问题。即使使用混合辅助角色,子 Runbook 的执行时间上限为 10 分钟,如果超时,则会导致父 Runbook 重启
0赞 stackprotector 11/8/2023
你介意自己回答自己的问题吗?它可能会在未来帮助其他用户!评论是暂时的,可能随时消失......
0赞 Leshawn Rice 11/10/2023
是的,一旦我的赏金到期,我会自我回答

答:

0赞 Robina Mirbahar 11/10/2023 #1

删除脚本末尾的 Start-Sleep 10Exit 0,因为它可能会导致重启,在 azure 自动化中,当脚本到达末尾时,脚本执行被视为完成。添加睡眠和退出可能会导致 Runbook 重启。

相反,您可以在脚本中使用 Start-SleepWait-Event 来确保延迟或等待特定条件。

0赞 Leshawn Rice 11/11/2023 #2

我能够解决这个问题。问题在于,即使使用混合辅助角色,如果 Runbook 生成子 Runbook,则该子级只有 10 分钟的执行时间。如果子 Runbook 未能在 10 分钟内完成,则父 Runbook 将重新启动(不会终止子 Runbook 的进程)