このブログでは、1ラインの PowerShell を使って Azure ラボ全体のセットアップを行う方法を紹介します。このラボ環境では、学習者がトレーニング資料を正確にフォローできます。
私は、これまで、このようなハウツーものをたくさん書いており、また、多くのオンライントレーニングコースも作成しています。この種のトレーニングコンテンツでは、常に前提条件セクションを定義する必要があります。前提条件セクションでは、読者の環境を私の環境とまったく同じように設定するために必要なことについて詳しく説明しなければなりません。これが面倒なので、この過程を自動化できないかと考えました。
このような技術的なハウツーコンテンツを作成する場合、トレーナーは学習者の環境が利用する例と適合しているかを確認するのに苦労します。実行するスクリプトを提供することはできても、たいてい何かが不十分で、すべてを完全に整えるのはなかなか難しいものです。
そこで、考えました。実行するだけで、ラボ環境全体を、自分の環境とまったく同じものになるよう設定できる1ラインの PowerShell コマンドは作成できないものだろうかと。結論としては、それは可能です!
唯一の要件は、学習者自身の Azure サブスクリプションです。
学習者へのインストラクション
トレーニングコースを開始するときは、たいてい次のような指示が出されるのではないでしょうか?
- ここをクリックします
- このコマンドを実行します
- 次にここに行ってこれをクリックします
- このスクリプトを実行してください
トレーナーは、ただトレーニングを開始するだけのために、セクション全体を実行して、デモ環境が正確に構築できるよう、学習者に1つ1つ丁寧に指示する必要があります。さらに、単一のマシンでも、データセンター全体であっても、ラボ環境を設定するためのプロセスは同じです。
「リモートの Windows サーバーと Windows 10 ワークステーションで作業します。環境を構築したら、ユーザー名は “foo”、パスワードは “far” を使います。接続するIPアドレスはX.X.X.Xです。」といったような指示です。
始めるために、ユーザー名、パスワード、そしてRDPへのIPアドレスを指定します。この点が重要です。
PowerShell コンソールを開いて1ラインのスクリプト、labsetup.ps1 を実行するだけで、ラボ全体をプロビジョンできます。
プロジェクトの概要
ここで紹介するラボ環境自動化プロジェクトには、以下の6つのステップが含まれます。
- ファイル/スクリプトを格納するための GitHub リポジトリを作成
- ラボリソースをプロビジョニングする Azure ARM テンプレートを作成
- 学習者がダウンロードして実行するためのメインの PowerShell スクリプトを作成
- すべてのファイルを GitHub リポジトリに同期
- メインの PowerShell スクリプトを呼び出す方法を指示
- ラボにすぐ接続したいかどうかをプロンプトで確認
目標は、学習者がラボ環境を稼働させるためにやらなければならないことをできる限り削除することです。
GitHub リポジトリの作成
このステップは単純です。GitHub リポジトリを作成し、適切な名前をつけます。私の場合、担当することになっていたためにこのプロジェクトを思いついたコースが「DevOps from the Ground Up」という名称だったので、”devops-from-the-ground-up-resources” と名付けました。
Azure ARM テンプレートの作成
Azure ARM テンプレートの作成はこのブログの趣旨ではないので、説明は省略しますが、必要ならこちらを参照してください。私がこのプロジェクト用に作成したものは、こちらにあります。
ラボのセットアップスクリプトの作成
ラボのセットアップスクリプトが最も重要で、ここでマジックが起こります。学習者は、スクリプトをダウンロードして実行するだけです。スクリプトの内容をチェックしたい場合は、こちらから自由にダウンロードしてください。
ラボのセットアップスクリプトは、いくつかの異なるセクションから構成されます。
- Azure PowerShell モジュールのインストールと認証(必要な場合)
- ARM テンプレートのダウンロード
- Azure リソースグループの作成
- リソースグループへの ARM デプロイメントの呼び出し
- プロビジョニングされたVMのパブリックIPアドレスを学習者に提供
- オプションで、学習者のために、開始するVMに接続
学習者が、私のパブリック GitHub リポジトリからラボのセットアップスクリプトをダウンロードして実行すると、マジックが始まります。
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/adbertram/devops-from-the-ground-up-resources/master/labsetup.ps1'))
Azure モジュールをダウンロードして認証
このスクリプトは、Azure とやり取りするためにいくつかの PowerShell コマンドレットを使うため、Azure PowerShell モジュールが必要になります。また、サブスクリプションに対して認証される必要があります。
## Download the Azure PowerShell module if the student doesn't have it
if (-not (Get-Module -Name Azure -ListAvailable -ErrorAction Ignore)) {
Install-Module -Name Azure -Force
}
## If the student isn't already authenticated to Azure, ask them to
if (-not (Get-AzContext)) {
Connect-AzAccount
}
ARM テンプレートのダウンロード
スクリプトをダウンロードしたら、GitHub に戻って、ARM テンプレートをダウンロードします。次のように、Invoke-WebRequest が表示する煩わしいプログレスバーを非表示にして、ARM テンプレートをローカルに保存します。
## Hide the prog bar generated by Invoke-WebRequest
$progPrefBefore = $ProgressPreference
$ProgressPreference = 'SilentlyContinue'
## Download the ARM template
$templatePath = "$env:TEMP\lab.json"
$url = 'https://raw.githubusercontent.com/adbertram/devops-from-the-ground-up-resources/master/lab.json'
Invoke-WebRequest -Uri $url -OutFile $templatePath
Azure リソースグループの作成
スクリプトは、コースラボのリソースグループがまだ存在しなければ、作成します。このリソースグループで、すべてのコースリソースが作成されます。
## Azure resource group will be the course name
$rgName = "$($CourseName -replace ' ','-')"
## Create the lab's resource group
if (-not (Get-AzResourceGroup -Name $rgName -Location $AzureRegion -ErrorAction Ignore)) {
$null = New-AzResourceGroup -Name $rgName -Location $AzureRegion
}
Azure デプロイメントの呼び出し
次に、New-AzResourceGroupDeployment コマンドレットを介して Azure ARM のデプロイメントを開始します。
## Deploy lab using the ARM template just downloaded
$deploymentName = "$rgName-Deployment"
$null = New-AzResourceGroupDeployment -Name $deploymentName -ResourceGroupName $rgName -TemplateFile $templatePath -Verbose
$deploymentResult = (Get-AzResourceGroupDeployment -ResourceGroupName $rgName -Name $deploymentName).Outputs
学習者の IP を接続
その後、学習者のために作成された Azure 仮想マシンのパブリック IP アドレスが通知されます。
Write-Host "Your lab VM IPs to RDP to are:"
$vmIps = @()
foreach ($val in $deploymentResult.Values.Value) {
$pubIp = Get-AzResource -ResourceId $val
$vmName = $pubIp.Id.split('/')[-1].Replace('-pubip', '')
$ip = (Get-AzPublicIpAddress -Name $pubip.Name).IpAddress
$vmIps += [pscustomobject]@{
Name = $vmName
IP = $ip
}
Write-Host "VM: $vmName IP: $ip"
}
VM に自動的に接続
スクリプトが実行する最後のステップは、mstsc.exe を介してVMに自動的に接続することです。環境が整い、学習者は、何もしなくてもすぐコースを開始できます。
## If the student is on Windows, prompt and connect for them. Otherwise, tell them the IPs to connect to
if ($env:OS -eq 'Windows_NT') {
$rdpNow = Read-Host -Prompt "RDP to the required host ($RequiredRdpVM) now (Y,N)?"
if ($rdpNow -eq 'Y') {
$requiredVM = $vmIps.where({ $_.Name -eq $RequiredRdpVM })
$ip = $requiredVM.IP
mstsc /v:$ip
} else {
Write-Host "Please RDP to the VM [$($RequiredRdpVM) : $ip] now to begin course. The username and password are provided in the Lab Preparation section of the chapter."
}
} else {
Write-Host "Please RDP to the VM [$($RequiredRdpVM) : $ip] now to begin course. The username and password are provided in the Lab Preparation section of the chapter."
}
まとめ
単一の PowerShell スクリプトを実行するだけで、(トレーニングだけでなく)あらゆる目的に使えるラボ環境の設定を完全に自動化できることがわかりました。
このプロジェクトが、より堅牢なツールを作成するための基盤となることを願っています!もしスクリプトに改良できる点があれば、お知らせください。GitHub リポジトリとこのブログを新しい情報で更新します。
Adam Bertram
Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.