1

我正在设置 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,我们会收到以下错误:

Import-Module:加载扩展类型数据文件时发生以下错误:TypeData“Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer”中的错误:TypeConverter 已被忽略,因为它已经发生。TypeData“Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer”中的错误:成员 SerializationDepth 已存在。TypeData“Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache”中的错误:成员 PropertySerializationSet 已存在。TypeData“Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache”中的错误:成员 SerializationMethod 已存在。TypeData 中的错误“Microsoft.Azure.Commands.Common.Authentication。

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

导入失败

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

导入成功

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

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

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

所以看起来遗留模块是必需的,但它发生了冲突。

4

1 回答 1

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
于 2019-08-15T20:08:40.340 回答