Azure VM Image Builder サービスの DevOps タスク (プレビュー)
適用対象: ✔️ Linux VM ✔️ フレキシブルなスケール セット
この記事では、アプリケーションとオペレーティング システムをインストールして構成できるように、Azure DevOps タスクを使用してビルド成果物を仮想マシン (VM) イメージに挿入する方法について説明します。
重要
VM Image Builder の Azure DevOps タスクは現在プレビュー段階です。 ベータ版、プレビュー版、または一般提供としてまだリリースされていない Azure の機能に適用される法律条項については、「Microsoft Azure プレビューの追加使用条件」を参照してください。
DevOps タスクのバージョン
現時点では、Azure VM Image Builder には、次の 2 つの DevOps タスクがあります。
"安定した" VM Image Builder タスク: テスト済みの最新の安定ビルドで、一般データ保護規制 (GDPR) の問題がないことが報告されています。
"不安定な" VM Image Builder タスク: タスク コードを "安定" としてリリースする前に最新の更新プログラムと機能をテストできるよう、いわゆる "不安定な" タスクを提供しています。 約 1 週間後、お客様から報告された問題やテレメトリの問題がなければ、タスク コードは "安定" に昇格されます。
前提条件
Note
現在、VM Image Builder タスクでは、Windows の再起動や管理者権限での特権コマンドの実行はサポートされていません。 つまり、このタスクは、これらの機能を必要とする Azure Virtual Desktop シナリオや Windows のカスタマイズには適していないということです。 VM Image Builder で DevOps を使用するには、Azure Resource Manager タスク内でテンプレートを入れ子にし、Azure CLI または PowerShell タスクを使用します。
開始する前に、次の操作を行う必要があります。
Azure DevOps Services (旧称 Visual Studio Team Services、または VSTS) アカウントを取得し、ビルド パイプラインを作成します。
パイプラインで使用するサブスクリプションに VM Image Builder 機能の要件を登録して有効にします。
ソース イメージ リソース グループに標準の Azure ストレージ アカウントを作成します。 他のリソース グループやストレージ アカウントを使用できます。 このストレージ アカウントは、ビルド成果物を DevOps タスクからイメージに転送するために使用されます。
# Azure PowerShell $timeInt=$(get-date -UFormat "%s") $storageAccName="aibstorage"+$timeInt $location=westus # Create a storage account and blob in the resource group New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
# The Azure CLI location=westus scriptStorageAcc=aibstordot$(date +'%s') # Create a storage account and blob in the resource group az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
リリース パイプラインにタスクを追加する
[リリース パイプライン]>[編集] の順に選択します。
ユーザー エージェントで、プラス記号 (+) を選択して Image Builder を追加して検索します。
[追加] を選択します。
次のセクションでは、タスクのプロパティを設定します。
Azure サブスクリプション
ドロップダウン リストで、VM Image Builder を実行するサブスクリプションを選択します。 ソース イメージが保存されており、イメージの配布先となるサブスクリプションを使用します。 VM Image Builder の共同作成者にサブスクリプションまたはリソース グループへのアクセスを付与する必要があります。
Resource group
一時的なイメージ テンプレート成果物が格納されるリソース グループを使用します。 テンプレート成果物の作成時に、追加の一時的な VM Image Builder リソース グループ IT_<DestinationResourceGroup>_<TemplateName>_guid
が作成されます。 この一時的なリソース グループには、スクリプトなどのイメージ メタデータが格納されます。 タスクの最後に、イメージ テンプレート成果物と一時的な VM Image Builder リソース グループが削除されます。
Location
場所は、VM Image Builder が実行されるリージョンです。 設定された数のリージョンのみがサポートされます。 この場所にソース イメージが存在している必要があります。 たとえば、Azure Compute Gallery (旧称 Shared Image Gallery) を使用している場合は、そのリージョンにレプリカが存在している必要があります。
マネージド ID (必須)
VM Image Builder にはマネージド ID が必要です。ソース カスタム イメージの読み取り、Azure Storage への接続、カスタム イメージの作成などにこれが使用されます。 詳細については、VM Image Builder の詳細に関するページを参照してください。
Virtual Network のサポート
作成された VM を特定の仮想ネットワークに配置するように構成することができます。 タスクを構成するときに、[VNet 構成 (省略可能)] 入力フィールドに既存のサブネットのリソース ID を指定します。 特定の仮想ネットワークを使用する必要がない場合は、リソース ID を省略します。 詳細については、Azure VM Image Builder サービスのネットワーク オプションに関するページをご覧ください。
source
ソース イメージは、サポートされている VM Image Builder のオペレーティング システムのものである必要があります。 VM Image Builder が実行されているのと同じリージョン内の既存のカスタム イメージを選択できます。
マネージド イメージ: リソース ID を渡します。 次に例を示します。
/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
Compute Gallery: イメージ バージョンのリソース ID を渡します。 次に例を示します。
/subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
Compute Gallery の最新バージョンを取得する必要がある場合は、Azure PowerShell または Azure CLI タスクを使用して取得し、DevOps 変数を設定します。 その変数を VM Image Builder の DevOps タスクで使用します。 詳細については、最新のイメージ バージョンのリソース ID を取得する方法に関するページに記載の例を参照してください。
(Marketplace) 基本イメージ: よく使われるイメージのドロップダウンリストを使用します。これらは、サポートされているオペレーティング システムの最新バージョンを常に使用します。
基本イメージがリストにない場合は、
Publisher:Offer:Sku
を使用して正確なイメージを指定できます。(省略可能) 基本イメージのバージョン - 使用するイメージのバージョンを指定できます。 既定のバージョンは
latest
です。
カスタマイズ
次のセクションでは、タスクをカスタマイズするさまざまな方法について説明します。
プロビジョナー
初期状態では、Shell と PowerShell の 2 つのカスタマイザーがサポートされています。 インラインのみがサポートされています。 スクリプトをダウンロードする場合は、インライン コマンドを渡してこれを行うことができます。
お使いのオペレーティング システムに応じて、PowerShell または Shell を選択します。
Windows Update タスク
Windows のみの場合、このタスクではカスタマイズの最後に Windows Update が実行されます。 また、必要な再起動も行われます。
タスクにより、次の Windows Update の構成が実行されます。
"type": "WindowsUpdate",
"searchCriteria": "IsInstalled=0",
"filters": [
"exclude:$_.Title -like '*Preview*'",
"include:$true"
タスクにより、"プレビュー" 版ではない重要かつ推奨される Windows Update がインストールされます。
再起動の処理
DevOps タスクは現在、Windows ビルドの再起動をサポートしていません。 PowerShell コードを使用して再起動しようとすると、ビルドは失敗します。 ただし、コードを使用して Linux ビルドを再起動することはできます。
ビルド パス
このタスクは、DevOps ビルド リリースの成果物をイメージに挿入できるように設計されています。 これを機能させるには、ビルド パイプラインを設定する必要があります。 リリース パイプラインの設定で、ビルド成果物のリポジトリを追加します。
[ビルドパス] ボタンを選択して、イメージに配置するビルド フォルダーを選択します。 VM Image Builder タスクによって、その中のすべてのファイルとディレクトリがコピーされます。 イメージが作成されると、VM Image Builder によって、それらのファイルとディレクトリがオペレーティング システムに応じて異なるパスに配置されます。
重要
リポジトリ成果物を追加する際、ディレクトリ名の前にアンダースコア文字(_)が付いている場合があります。 このアンダースコアが原因で、インライン コマンドに関する問題が発生する可能性があります。 コマンドでは、適切な引用符を使用するようにしてください。
次の例で、このしくみについて説明します。
Windows の場合: ファイルは C: ドライブに存在します。 webapp ディレクトリを含む buildArtifacts という名前のディレクトリが作成されます。
Linux の場合: ファイルは
/tmp
ディレクトリに存在します。 すべてのファイルとディレクトリを含むwebapp
ディレクトリが作成されます。 これは一時ディレクトリであるため、ファイルを移動する必要があります。 そうしないと、削除されます。
インライン カスタマイズ スクリプト
Windows の場合: PowerShell のインライン コマンドはコンマで区切って入力できます。 ビルド ディレクトリ内のスクリプトを実行する場合は、次を使用できます。
& 'c:\buildArtifacts\webapp\webconfig.ps1'
複数のスクリプトを参照することも、コマンドをさらに追加することもできます。 次に例を示します。
& 'c:\buildArtifacts\webapp\webconfig.ps1' & 'c:\buildArtifacts\webapp\installAgent.ps1'
Linux の場合: ビルド成果物は /tmp ディレクトリに格納されます。 ただし、多くの Linux オペレーティング システムでは、再起動時に /tmp ディレクトリの内容が削除されます。 成果物がイメージ内に存在するようにする場合は、別のディレクトリを作成してそれらをコピーする必要があります。 次に例を示します。
sudo mkdir /lib/buildArtifacts sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
/tmp ディレクトリを使用しても問題ない場合は、次のコードを使用してスクリプトを実行できます。
# Grant execute permissions to run scripts sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh" echo "running script" sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
イメージのビルド後にビルド成果物はどうなるか
Note
VM Image Builder によって、ビルド成果物が自動的に削除されることはありません。 ビルド成果物を削除する際は、常にコードを使用することを強くお勧めします。
Windows の場合: VM Image Builder によって、ファイルは C:\buildArtifacts ディレクトリにデプロイされます。 ディレクトリは永続化されるため、スクリプトを実行して削除する必要があります。 次に例を示します。
# Clean up buildArtifacts directory Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse # Delete the buildArtifacts directory Remove-Item -Path "C:\buildArtifacts" -Force
Linux の場合: ビルド成果物は /tmp ディレクトリに格納されます。 ただし、多くの Linux オペレーティング システムでは、再起動時に /tmp ディレクトリの内容が削除されます。 内容を削除する際は、オペレーティング システムに頼らず、コードを用いて削除することをお勧めします。 次に例を示します。
sudo rm -R "/tmp/AppsAndImageBuilderLinux"
イメージのビルドの合計時間
DevOps パイプライン タスクでは、まだ合計時間を変更することはできません。 既定値の 240 分を使用します。 buildTimeoutInMinutes を増やす場合は、リリース パイプラインで Azure CLI タスクを使用します。 テンプレートをコピーして送信するようにタスクを構成します。 ソリューションの例については、VM Image Builder で環境変数とパラメーターを使用する方法に関するページを参照するか、Azure PowerShell を使用してください。
ストレージ アカウント
前提条件で作成したストレージ アカウントを選択します。 一覧に表示されない場合は、それに対するアクセス許可が VM Image Builder にありません。
ビルドが開始されると、VM Image Builder によって imagebuilder-vststask という名前のコンテナーが作成されます。これは、リポジトリのビルド成果物が格納される場所です。
Note
ビルド後に毎回、ストレージ アカウントまたはコンテナーを手動で削除する必要があります。
配布
次の 3 種類の配布がサポートされています。
マネージド イメージ
リソース ID:
/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
場所
Azure Compute Gallery
Compute Gallery は既に存在している必要があります。
リソース ID:
/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
リージョン: コンマで区切られたリージョンの一覧。 (例:
westus
、eastus
、centralus
)
仮想ハード ディスク
これに値を渡すことはできません。 VM Image Builder では、仮想ハード ディスク VHD を vhds コンテナー内の一時的な VM Image Builder リソース グループ IT_<DestinationResourceGroup>_<TemplateName>
に出力します。 リリース ビルドを開始すると、VM Image Builder によってログが出力されます。 VM Image Builder が完了すると、VHD URL が出力されます。
オプション設定
VM サイズの設定を、既定のサイズの Standard_D1_v2 からオーバーライドできます。 カスタマイズ時間の合計を短縮するため、これを行うことをお勧めします。 または、GPU (グラフィック処理装置)、HPC (ハイ パフォーマンス コンピューティング) など、特定の VM サイズに依存するイメージを作成することもできます。
タスクのしくみ
リリースを作成すると、このタスクによってストレージ アカウントに imagebuilder-vststask という名前のコンテナーが作成されます。 ビルド成果物が圧縮されてアップロードされ、zip ファイルの共有アクセス署名トークンが作成されます。
このタスクでは、タスクに渡されたプロパティを使用して、VM Image Builder テンプレートの成果物を作成します。 このタスクでは次の処理が実行されます。
ビルド成果物の zip ファイルと関連するその他のスクリプトをダウンロードする。 これらのファイルは、一時的な VM Image Builder リソース グループ
IT_<DestinationResourceGroup>_<TemplateName>
のストレージ アカウントに保存されます。先頭に t_ と 10 桁の単調な整数が付いたテンプレートを作成する。 テンプレートは選択したリソース グループに保存され、ビルドの期間中、リソース グループ内に存在します。
出力例:
start reading task parameters...
found build at: /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image: { type: 'SharedImageVersion',
imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name: t_1556938436xxx
starting put template...
イメージのビルドが開始されると、実行状態がリリース ログに報告されます。
starting run template...
イメージのビルドが完了すると、次のテキストのような出力が表示されます。
2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template: Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) = /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template: Succeeded
イメージ テンプレートと IT_<DestinationResourceGroup>_<TemplateName>
が削除されます。
$(imageUri)
Azure DevOps Services (旧称 Visual Studio Team Services、または VSTS) 変数を取得し、次のタスクで使用するか、値だけを使用して VM を構築することができます。
DevOps の出力変数
ソース マーケットプレース イメージの発行元、オファー、SKU、バージョンを次に示します。
$(pirPublisher)
$(pirOffer)
$(pirSku)
$(pirVersion)
分散イメージのリソース ID であるイメージ URI を次に示します。
$(imageUri)
よく寄せられる質問
DevOps の外部で作成した既存のイメージ テンプレートを使用できますか?
現時点ではありません。
イメージ テンプレート名を指定できますか?
いいえ。 一意のテンプレート名が使用され、その後削除されます。
VM Image Builder タスクが失敗しました。 この問題をトラブルシューティングする方法を教えてください。
ビルド エラーが発生した場合、DevOps タスクではステージング リソース グループが削除されません。 ビルド カスタマイズ ログが含まれているステージング リソース グループにアクセスできます。
VM Image Builder タスクの DevOps ログにエラーが表示され、メッセージには customization.log の場所が記載されています。 次に例を示します。
詳細については、VM Image Builder サービスのトラブルシューティングに関するページを参照してください。
エラーを調査した後、ステージング リソース グループを削除できます。 まず、VM Image Builder テンプレート リソース成果物を削除します。 この成果物の先頭には t_ が付いており、これは DevOps タスクのビルド ログで確認できます。
...
Source for image: { type: 'SharedImageVersion',
imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name: t_1556938436xxx
...
VM Image Builder テンプレートのリソース成果物は、タスクで最初に指定されたリソース グループに含まれています。 トラブルシューティングが完了したら、成果物を削除してください。 Azure portal を使用して削除する場合は、リソース グループ内で [非表示の種類の表示] を選択して成果物を表示します。
次のステップ
詳細については、VM Image Builder の概要に関する記事を参照してください。