【问题标题】:Azure and AzureRM Powershell Module ConflictsAzure 和 AzureRM Powershell 模块冲突
【发布时间】:2019-08-15 13:36:03
【问题描述】:

我正在设置 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 已被忽略,因为它已经发生。错误 类型数据 “Microsoft.Azure.Commands.Common.Authentication.Abstractions.IAzureContextContainer”: 成员 SerializationDepth 已经存在。类型数据错误 “Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache”: 成员 PropertySerializationSet 已经存在。错误 类型数据 “Microsoft.Azure.Commands.Common.Authentication.ProtectedFileTokenCache”: 成员 SerializationMethod 已经存在。类型数据错误 “Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache”: 成员 PropertySerializationSet 已经存在。错误 类型数据 “Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache”: 成员 SerializationMethod 已经存在。类型数据错误 “Microsoft.Azure.Commands.Profile.Models.PSAzureContext”:成员 SerializationDepth 已经存在。类型数据错误 “Microsoft.Azure.Commands.Profile.Models.PSAzureProfile”:成员 SerializationDepth 已经存在。在 C:\程序 文件\WindowsPowerShell\Modules\AzureRm\6.13.1\AzureRM.psm1:81 char:1 + 导入模块 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 “附带”处理一些服务管理 API 任务所需的东西,但事实并非如此。如果我尝试在未安装 Azure 模块的情况下进行部署,则会出现错误:

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

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

【问题讨论】:

  • 只需将它们分成 2 个作业,以便它们具有不同的环境吗?
  • 这不是一个选项。单个 Azure DevOps Pipeline 任务引用了这两个模块 - 一个由 Microsoft 编写。
  • 不确定您的意思?单个任务不能引用它们,除非它是一个脚本,在这种情况下,没有什么能阻止您在不同代理组\作业下的同一构建\发布管道中拥有 2 个脚本任务
  • 有一个名为“Azure 云服务部署”的内置 ADO 任务。此任务引用 Azure 和 AzureRM 模块。执行此任务会导致我看到的错误。除非您的意思是重新编写 Microsoft 任务,否则我无法将其“分解”。如果您有兴趣,这里是任务源代码的链接。 github.com/microsoft/azure-pipelines-tasks/tree/master/Tasks/…
  • 哦,我。从未使用过该任务。你可能需要在 azure powershell gh 上提出这个问题。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多