3

我正在 Azure 自动化中编写一组 PowerShell 运行手册。其中一些在本地运行(ala Hybrid Runbook Worker),一些直接在 Azure 中运行。

如果它们在 Azure 中意外启动,我想立即出错并退出任何混合脚本(因为它是使用门户时的默认选择)。

我以为我通过获取结果进行检查,Get-AutomationConnection -Name AzureRunAsConnection但响应大约需要 4 秒,但它在通过 Hybrid Worker 运行时也会返回值。有谁知道更好/更快的方法?

谢谢!

更新:粗略但似乎有效的单线是:

Try {$AmIInAzure = Get-AzureRmEnvironment AzureCloud -ErrorAction Stop;Throw "This runbook must be run on-premises via Hybrid Runbook Worker.  Exiting."} Catch {}

变量 $AmIInAzure 仅用于隐藏 Get-AzureRMEnvironment 的输出,而 Try..Catch 用于隐藏任何错误。如果此代码在 Azure 中运行,它将抛出指定的文本,并且 Runbook 将出错(根据需要)。如果它在混合工作器上运行,它不会做任何事情(允许运行手册的其余部分运行)。

我很好奇是否有人可能有更好的方法。

更新 2: oneliner 似乎不起作用,因为 throw、exit 或 break 都不会导致 Runbook 退出。还在寻找工作方法...

4

2 回答 2

0

我有完全相同的问题,但没有让它工作。最后得到了另一个解决方案,我只是在运行手册的顶部运行它,或者如果您有输入参数,则直接在我的参数列表之后运行。

$checkHybridWorker = hostname

if ($checkHybridWorker -ne "myhybridworkerhostname"){

        Write-Warning "Job must be started from Hybrid worker, exiting."
        Exit 1

}

不漂亮,但效果很好。

于 2019-06-20T08:56:27.960 回答
0

您可以使用 $PSPrivateMetadata 进行测试

  begin {
        if ($null -eq $PSPrivateMetadata) {
            throw "This command can only be run within the context of an Azure Automation Runbook Worker"
        }
    }
于 2019-05-06T16:08:33.900 回答