このブログでは、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 リポジトリを作成し、適切な名前をつけます。私の場合、担当することになっていたためにこのプロジェクトを思いついたコースが「DevOps from the Ground Up」という名称だったので、”devops-from-the-ground-up-resources” と名付けました。
Azure ARM テンプレートの作成はこのブログの趣旨ではないので、説明は省略しますが、必要ならこちらを参照してください。私がこのプロジェクト用に作成したものは、こちらにあります。
ラボのセットアップスクリプトが最も重要で、ここでマジックが起こります。学習者は、スクリプトをダウンロードして実行するだけです。スクリプトの内容をチェックしたい場合は、こちらから自由にダウンロードしてください。
ラボのセットアップスクリプトは、いくつかの異なるセクションから構成されます。
学習者が、私のパブリック GitHub リポジトリからラボのセットアップスクリプトをダウンロードして実行すると、マジックが始まります。
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/adbertram/devops-from-the-ground-up-resources/master/labsetup.ps1'))
このスクリプトは、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
}
スクリプトをダウンロードしたら、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 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
}
次に、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
その後、学習者のために作成された 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"
}
スクリプトが実行する最後のステップは、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 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.
より優れた業務アプリケーションやウェブサイトの開発に役立つ、ニュース、情報、チュートリアルをご案内します。