web-dev-qa-db-ja.com

ホストされた2017エージェントでのAzureRM Powershellのアップグレード(VSTS-Visual Studio Team Services)

Visual Studio Teams Services(オンライン)でリリース管理を使用しています。私たちはホストされたビルドエージェントを使用しており、カスタムエージェントの管理のオーバーヘッドを回避したいのです。

私が必要とする1つのアイテムは、AzureRM PowerShellモジュールです。 5.1.1までのバージョンは エージェントで使用可能 ですが、6.0.0が必要です。

私がしたいことは、リリースプロセス(PowerShell)のステップを使用してバージョン6.0.0を取得し、代わりにthartを使用することですが、それをうまく機能させることができません。私はすべてが行き詰まったいくつかのアプローチを試しました、現在のアプローチは次のとおりです:

Write-Output "------------------ Install package provider ------------------"
Find-PackageProvider -Name "NuGet" | Install-PackageProvider -Scope CurrentUser -Force

Write-Output "------------------ Remove Modules ------------------"
Get-Module -ListAvailable | Where-Object {$_.Name -like 'AzureRM*'} | Remove-Module

Write-Output "------------------ Install the AzureRM version we want - 6.0.1!  ------------------"
Install-Package AzureRM -RequiredVersion 6.0.1 -Scope CurrentUser -Force

Write-Output "------------------ Import AzureRM 6.0.1  ------------------"
Import-Module AzureRM -RequiredVersion 6.0.1

これはすべて正常に動作します(つまり、クラッシュしません...)が、6.0.1コマンドレットのいずれかを使用しようとすると、エラーが発生します。

Get-AzureRmADGroup:Azure PowerShellセッションが正しく初期化されていません。モジュールをインポートして、もう一度お試しください。

AzureRM 6.0.1をデプロイしてホストされたエージェントで使用するために、どこで問題が発生するのか、または代替の戦略を使用できるか?

14
Murray Foxcroft

私は最終的にそれを理解しました-同じことを苦しんでいる他の人のための答えを追加します。

キーは、AzureRMモジュールがアップグレードされた後にログインすることです。

PowerShellコード:

    Write-Output "------------------ Start: Upgrade AzureRM on build Host ------------------"

    Write-Output "- - - - - Install package provider"
    Install-PackageProvider -Name NuGet -Force -Scope CurrentUser

    Write-Output "- - - - - List Modules Before"
    Get-Module -ListAvailable| where {$_.Name -Like “*AzureRM*”}  | Select Name, Version

    Write-Output "- - - - - Remove alll existing AzureRM Modules" 
    Get-Module -ListAvailable | Where-Object {$_.Name -like '*AzureRM*'} | Remove-Module -Force 

    Write-Output "- - - - - Install AzureRM 6.0.1"
    Install-Module -Name AzureRM -RequiredVersion 6.0.1 -Force -Scope CurrentUser

    Write-Output "- - - - - Import AzureRM 6.0.1"
    Import-Module AzureRM -Force -Verbose -Scope Local

    Write-Output "- - - - - List Modules After"
    Get-Module -ListAvailable| where {$_.Name -Like “*AzureRM*”}  | Select Name, Version

    Write-Output "------------------ End: Upgrade AzureRM on build Host ------------------"

    Write-Output "------------------ Start: LoginToAzure ------------------"

    $SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force
    $AdminCredential = New-Object System.Management.Automation.PSCredential ($AdminUserEmailAddress, $SecurePassword)
    Login-AzureRmAccount -Credential $AdminCredential

    Get-AzureRmSubscription –SubscriptionId $SubscriptionId | Select-AzureRmSubscription

    Write-Output "------------------ End: LoginToAzure ------------------"
6
Murray Foxcroft

正しい方向への最初のポイントを提供してくれたMurrayに感謝します。私が望んでいたことを示すことは不可能ではありませんでした!

私は最初にAzure PowerShellタスク内でこれを実行しようとしましたが、かなり遠くまで行きましたが、古いバージョンをアンロードできないため、AzureRm.Profile で行き止まりになりました

トリックは、AzureRM VSTSタスクが依存関係のセットアップをどのように実行するかを理解することでした。これは、VSTS UIの「Azure Powershell Version」文字列を効果的に受け取り、それを使用してPSModules環境変数に追加の検索パスを定義します。つまり、C:\Modules\azurerm_5.1.1です。

ユーザープロファイルを検索する前に、そのディレクトリを検索してから、グローバルモジュールパスを検索します。

モジュールが見つかると、Azureログインが実行されます。これにより、後でモジュールを削除する希望が妨げられます。

したがって、代わりに単純なpowershellタスク、つまりAzureRMが読み込まれていないタスクを使用する場合(マレーも結論付けたように):

Plain Powershell Task

Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
Install-Module -Name AzureRM -RequiredVersion 6.2.1 -Force -Scope CurrentUser -AllowClobber

特にinstall-moduleは、 vsts画像生成プロジェクト のようなc:\ modulesにインストールされません。

実験するときに古いPowerShellバージョンを上書きする問題を回避するには、AllowClobberが必要であるように見えましたが、もう必要ないのではないかと思います。

エレガントなソリューションは、次にAzure PowerShellスクリプトを使用するときに始まります。

Azure PowerShell Task

6.2.1が入力された優先PowerShellバージョンのフィールドは、PSModulesパスにC:\Modules\azurerm_6.2.1を追加します。これは存在しませんが、ありがたいことに、PSModulesには依然としてユーザー固有のモジュールパスが含まれているため、6.2.1が単独でロードされます。

幸い、5.1.1からのAzureRM.Profileは、Azure Powershellタスクによって実行されるサービスプリンシパルログインが引き続き機能するのに十分な上位互換性があります。

ランニング

Get-Module AzureRm 
Get-AzureRmContext

希望するバージョンを出力します:

VSTS Azure rm powershell versions

特に、ログインできなかった場合は、IthinkSystem.AccessTokenを使用できます(エージェントフェーズレベルでオプションがオンになっている場合)。

回避策を微調整する必要がある場合の診断テクニック:

タスクでAzureRMに読み込まれるコードを読んで、非常に役立ちました。

https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/AzurePowerShellV3/AzurePowerShell.ps1#L80

https://github.com/Microsoft/vsts-tasks/blob/0703b8869041d64db994934bde97de167787ed2e/Tasks/Common/VstsAzureHelpers_/ImportFunctions.ps1

https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/AzurePowerShellV3/Utility.ps1#L18

また、VSTSイメージの生成方法:

https://github.com/Microsoft/vsts-image-generation/blob/2f57db26dc30ae0f257a3415d26eaa8eea0febf9/images/win/scripts/Installers/Install-AzureModules.ps1

環境解放変数としてSystem.Debug = trueを有効にします。次に、 VSCodeのログファイルハイライタープラグイン


https://github.com/Microsoft/vsts-image-generationで投票することに興味がある人なら誰でもお勧めします/issues/149

執筆時点でのAzureRMのバージョンは、VSTS Hosted 2017エージェントで古いためです。

残念ながら、プライベートにホストされているZipファイルを介してプルされているため、PRを送信してアップグレードすることはできません。

7
Alex KeySmith