Я настраиваю саморазмещаемый агент конвейера 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 не найден.
Таким образом, кажется, что требуется устаревший модуль, но он конфликтует.