每隔一段时间,我们就会发现 Azure 自动化 Runbook 失败并出现以下错误:
Get-AutomationPSCredential : The term 'Get-AutomationPSCredential' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is
correct and try again.
At line:1 char:9
+ $cred = Get-AutomationPSCredential -Name SqlJobRunner
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-AutomationPSCredential:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
我们的不同运行手册似乎随机出现此错误。
Get-AutomationPSCredential
是 Azure 提供的模块。这不是我们的代码,而是微软的。
有时,它似乎只是“走开”。
那么这里发生了什么?Azure 自动化基础设施是否在不合时宜的时间重新加载或更新模块?我的印象是,一旦安排了 Runbook,相关模块就会“绑定”到 Runbook,因此它们会在需要时出现。
为什么会发生这种情况,防止失败的最佳方法是什么?
我接到了来自 Microsoft Azure 支持的电话,询问了根本原因。
我所在地区(美国东部)的 Azure 自动化在 PowerShell 5.0 上运行。他们说 5.0 中存在模块异步加载的问题。因此,不能保证跨模块依赖项可用。
他们告诉我这个缺陷将在 8 月份向美国东部地区发布 PowerShell 5.1 时修复。
他们提供了两种缓解措施:
另一个缓解措施是在我需要的地方导入所需的模块。这样做的一个复杂之处在于,所讨论的函数 Get-AutomationPSCredential 来自本地开发中的不同程序集,而不是在自动化上下文中执行时。在使用 Azure 自动化创作工具包进行本地开发时,该命令位于 assembly 中
AzureAutomationAuthoringToolkit
。在 Azure 中,它位于Orchestrator.AssetManagement.Cmdlets
.我将简单地尝试这个:
Import-Module Orchestrator.AssetManagement.Cmdlets -ErrorAction SilentlyContinue
在 ISE 环境中执行时,该函数将始终存在,并且此 Import-Module 将静默失败。
根据您的描述,我们应该检查模块是否有导入。如果没有,我们应该导入它。
我们可以使用门户网站来检查它:
自动化帐户-> 模块-> Orchestrator.AssetManagement.Cmdlets:
如果我们不导入它,我们应该使用门户来导入这个模块: