簡體   English   中英

Azure 和 AzureRM Powershell 模塊沖突

[英]Azure and AzureRM Powershell Module Conflicts

我正在設置 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 已被忽略,因為它已經發生。 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.AuthenticationStoreTokenCache”:成員 PropertySerializationSet 已經存在。 TypeData 中的錯誤“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 Files\\WindowsPowerShell\\Modules\\AzureRm\\6.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“附帶”處理某些服務管理 API 任務所需的功能,但事實並非如此。 如果我嘗試在未安裝 Azure 模塊的情況下進行部署,則會收到錯誤消息:

不支持基於證書的身份驗證。 找不到 Azure PowerShell 模塊。

所以看起來遺留模塊是必需的,但它沖突。

這似乎是由安裝順序引起的。 將順序從 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。 這似乎是由依賴於 AzureRm.profile 的 Azure.Storage 模塊引起的。

如果先安裝 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 模塊時,它看到已經有一個滿足其依賴項(或更具體地說,滿足 Azure.Storage 具有的依賴項)的 AzureRm.profile 版本,因此它不會再次安裝 AzureRm.profile。 這僅留下 AzureRm 打包的版本,一切都很好。

最后,對於現有的“損壞”環境,運行此命令解決了問題:

Uninstall-Module -Name AzureRM.profile -RequiredVersion 5.8.3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM