Azure 和 AzureRM Powershell 模块冲突

Azure and AzureRM Powershell Module Conflicts

我正在设置 Azure DevOps 自托管管道代理。我们有一些遗留的云服务,所以我们需要 "old" 以服务管理为目标的 Azure powershell 模块 API。我们显然也使用 Azure 资源管理器,因此还需要 AzureRM 或新的 Az 模块。

我们目前使用以下命令安装 Azure 模块版本 5.3.0 和 AzureRM 模块版本 6.13.1:

Install-Module -Name Azure -RequiredVersion 5.3.0 -AllowClobber -Scope AllUsers -Force
Install-Module -Name AzureRM -RequiredVersion 6.13.1 -AllowClobber -Scope AllUsers -Force

我们遇到的问题是,根据导入这些模块的顺序,我们会遇到脚本失败。例如,如果导入顺序是 Azure 后跟 AzureRM,我们会收到以下错误:

Import-Module : The following error occurred while loading the extended type data file: Error in TypeData "Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer": The TypeConverter was ignored because it already occurs. Error in TypeData "Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer": The member SerializationDepth is already present. Error in TypeData "Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache": The member PropertySerializationSet is already present. Error in TypeData "Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache": The member SerializationMethod is already present. Error in TypeData "Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache": The member PropertySerializationSet is already present. Error in TypeData "Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache": The member SerializationMethod is already present. Error in TypeData "Microsoft.Azure.Commands.Profile.Models.PSAzureContext": The member SerializationDepth is already present. Error in TypeData "Microsoft.Azure.Commands.Profile.Models.PSAzureProfile": The member SerializationDepth is already present. At C:\Program Files\WindowsPowerShell\Modules\AzureRm.13.1\AzureRM.psm1:81 char:1 + Import-Module AzureRM.Profile -RequiredVersion 5.8.2 -Global + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Import-Module], RuntimeException + FullyQualifiedErrorId : FormatXmlUpdateException,Microsoft.PowerShell.Commands.ImportModuleCommand

您可以在以下屏幕截图中看到这一点:

但是如果先导入 AzureRm,然后再导入 Azure,它似乎工作正常:

问题是,在使用 Microsoft 和其他公司构建的现有管道任务时,我们无法控制导入的顺序。由于 MS 构建的云服务部署任务恰好首先导入 Azure,因此我们部署云服务失败。

最后,我尝试简单地不安装旧的 Azure 模块,希望 AzureRM "came with" 它需要处理一些服务管理 API 任务,但它没有。如果我尝试在未安装 Azure 模块的情况下进行部署,我们会收到错误消息:

Certificate based authentication is not supported. Azure PowerShell module is not found.

看来遗留模块是必需的,但它有冲突。

这似乎是由安装顺序引起的。将顺序从 Azure 然后 AzureRm 翻转到 AzureRm 然后 Azure 解决了这个问题。所以以下安装命令不会导致问题:

Install-Module -Name AzureRM -RequiredVersion 6.13.1 -AllowClobber -Scope AllUsers -Force
Install-Module -Name Azure -RequiredVersion 5.3.0 -AllowClobber -Scope AllUsers -Force

看来根本原因是 Azure 模块,如果先安装,将始终安装最新版本的 AzureRm.profile。这似乎是由 Azure.Storage 模块引起的,该模块依赖于 AzureRm.profile.

如果您先安装 Azure 模块,它将安装 AzureRm.profile 版本 5.8.3。当您随后安装 AzureRm 时,它也具有 AzureRm.profile 的依赖项,但它会忽略您已经安装 AzureRm.profile v5.8.3 并安装 AzureRm.profile v5.8.2 的事实。我相信这是因为虽然 Azure 模块在 AzureRm.profile 上有 dependency,但 AzureRm 模块 includes AzureRm.profile。

当首先为 Azure 调用 Import-Module 时,它​​会加载 AzureRm.profile 模块的 v5.8.3,因为它将始终按设计加载最新版本。但是,当加载 AzureRm 本身时,它会尝试加载 IT 附带的版本 (v5.8.2),但由于问题中指出的类型错误而失败。

如果您在 Azure 之前安装 AzureRM,它可以防止这种情况发生。因为在安装 Azure 模块时它发现已经有满足其依赖性的 AzureRm.profile 版本(或者更具体地说,满足 Azure.Storage 具有的依赖性),所以它不会安装 AzureRm.profile 再次。这样就只剩下AzureRm打包的那个版本了,一切正常。

最后,对于现有的 "broken" 环境,运行 此命令解决了问题:

Uninstall-Module -Name AzureRM.profile -RequiredVersion 5.8.3