Конфликты модулей PowerShell в Azure и AzureRM

Я настраиваю саморазмещаемый агент конвейера Azure DevOps. У нас есть устаревшие облачные службы, поэтому нам нужен «старый» модуль Azure PowerShell, ориентированный на API управления службами. Мы также, очевидно, используем Azure Resource Manager, поэтому также требуется 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.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 символ: 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 не найден.

Таким образом, кажется, что требуется устаревший модуль, но он конфликтует.


person RMD    schedule 15.08.2019    source источник
comment
просто разделить их на 2 работы, чтобы у них была отдельная среда?   -  person 4c74356b41    schedule 15.08.2019
comment
Это не вариант. Одна задача Azure DevOps Pipeline ссылается на оба модуля - один, написанный Microsoft.   -  person RMD    schedule 15.08.2019
comment
не уверен, что ты имеешь в виду? одна задача не может ссылаться на них, если это не сценарий, который в этом случае ничто не мешает вам иметь 2 задачи сценария в одном конвейере сборки \ выпуска только под разными группами агентов \ заданиями   -  person 4c74356b41    schedule 15.08.2019
comment
Существует встроенная задача ADO под названием «Развертывание облачной службы Azure». Эта задача ссылается на модули Azure и AzureRM. Выполнение этой задачи приводит к ошибке, которую я вижу. У меня нет возможности разбить это на части, если вы не имеете в виду переписывание задачи Microsoft. Вот ссылка на исходный код задачи, если вам интересно. github.com/microsoft/azure-pipelines-tasks/tree/ мастер / Задачи /   -  person RMD    schedule 15.08.2019
comment
о, ic. никогда не использовал эту задачу. вам, вероятно, нужно поднять это на лазурном powershell gh.   -  person 4c74356b41    schedule 15.08.2019
comment
@RMD Интересный вопрос! [ссылка] imgur.com/37qwRQs Согласно снимку экрана по этой ссылке, я не вижу ошибок при импорте Модуль Azure версии 5.3.0 и модуль AzureRM версии 6.13.1 (который включает модуль AzureRM.Profile версии 5.8.2) из ​​PowerShell v5.1. В соответствии с полученной ошибкой проблема может быть связана с импортом модуля AzureRM.Profile версии 5.8.2, поэтому вы можете вручную проверять модули, как я сделал на прилагаемом снимке экрана, и посмотреть, помогает ли это. Также вы можете вручную импортировать модуль AzureRM.Profile с помощью команды Import- Модуль AzureRM.Profile -RequiredVersion 5.8.2 -Global и проверьте, помогает ли это.   -  person KrishnaG-MSFT    schedule 15.08.2019
comment
@ KrishnaG-MSFT, спасибо. Это указывало мне в правильном направлении. Похоже, что проблема связана с порядком установки. Я собираюсь опубликовать ответ на свой вопрос, если он сработает. :)   -  person RMD    schedule 15.08.2019


Ответы (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.

Когда сначала вызывается Import-Module для Azure, он загружает v5.8.3 модуля AzureRm.profile, так как он всегда будет загружать самую последнюю версию по умолчанию. Однако, когда загружается сам AzureRm, он пытается загрузить версию, поставляемую ИТ-специалистами (v5.8.2), и это не удается из-за ошибки типа, указанной в вопросе.

Если вы установите AzureRM до Azure, это предотвратит это. Поскольку при установке модуля Azure он видит, что уже существует версия AzureRm.profile, которая удовлетворяет его зависимости (или, более конкретно, удовлетворяет зависимость, имеющуюся в Azure.Storage), он не устанавливает AzureRm.profile снова. Остается только версия, с которой был упакован AzureRm, и все в порядке.

Наконец, для существующей "неработающей" среды выполнение этой команды решило проблему:

Uninstall-Module -Name AzureRM.profile -RequiredVersion 5.8.3
person RMD    schedule 15.08.2019