Azure和AzureRM Powershell模块冲突

时间:2019-08-15 13:36:03

标签: azure azure-devops azure-powershell azure-devops-self-hosted-agent

我正在设置一个Azure DevOps自托管管道代理。我们有一些旧的云服务,因此我们需要针对服务管理API的“旧” Azure Powershell模块。显然,我们也使用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,则将出现以下错误:

  

导入模块:加载该模块时发生以下错误   扩展类型数据文件:TypeData中的错误   “ Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer”:   TypeConverter被忽略,因为它已经存在。错误中   类型数据   “ Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer”:   成员SerializationDepth已经存在。 TypeData中的错误   “ Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache”:   成员PropertySerializationSet已经存在。错误中   类型数据   “ Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache”:   成员SerializationMethod已存在。 TypeData中的错误   “ Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache”:   成员PropertySerializationSet已经存在。错误中   类型数据   “ Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache”:   成员SerializationMethod已存在。 TypeData错误   “ Microsoft.Azure.Commands.Profile.Models.PSAzureContext”:成员   SerializationDepth已经存在。 TypeData错误   “ Microsoft.Azure.Commands.Profile.Models.PSAzureProfile”:成员   SerializationDepth已经存在。在C:\ Program   文件\ WindowsPowerShell \ Modules \ AzureRm \ 6.13.1 \ AzureRM.psm1:81字符:1   +导入模块AzureRM.Profile -RequiredVersion 5.8.2-全局   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(:) [导入模块],RuntimeException       + FullyQualifiedErrorId:FormatXmlUpdateException,Microsoft.PowerShell.Commands.ImportModuleCommand

您可以在以下屏幕截图中看到它:

Import Failure

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

Import Success

问题是,当使用Microsoft等开发的现有管道任务时,我们无法控制导入的顺序。由于MS构建的云服务部署任务恰巧首先导入Azure,因此部署云服务失败。

最后,我只是尝试不安装旧的Azure模块,希望AzureRM“附带”处理某些服务管理API任务所需的内容,但事实并非如此。如果我尝试在未安装Azure模块的情况下进行部署,则会收到错误消息:

  

不支持基于证书的身份验证。 Azure PowerShell   找不到模块。

因此看来旧版模块是必需的,但是却有冲突。

1 个答案:

答案 0 :(得分:1)

这似乎是由安装顺序引起的。将订单从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上具有依赖性,但AzureRm模块包括 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的版本了,一切都很好。

最后,对于现有的“损坏”环境,运行此命令可以解决问题:

Uninstall-Module -Name AzureRM.profile -RequiredVersion 5.8.3