我正在设置一个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
您可以在以下屏幕截图中看到它:
但是如果先导入AzureRm,然后再导入Azure,它似乎可以正常工作:
问题是,当使用Microsoft等开发的现有管道任务时,我们无法控制导入的顺序。由于MS构建的云服务部署任务恰巧首先导入Azure,因此部署云服务失败。
最后,我只是尝试不安装旧的Azure模块,希望AzureRM“附带”处理某些服务管理API任务所需的内容,但事实并非如此。如果我尝试在未安装Azure模块的情况下进行部署,则会收到错误消息:
不支持基于证书的身份验证。 Azure PowerShell 找不到模块。
因此看来旧版模块是必需的,但是却有冲突。
答案 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