1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

powershellで仮想マシンを作成する

2022-01-04 05:51:47

azure関連の作業を自動化する場合、仮想ホストの作成は避けて通れない道です。システム自体が複雑なため、1つか2つの簡単なコマンドでバーチャルホストを作成することは困難です。そこで、PowerShellを使ったazure上のバーチャルホスト(Ubuntuサーバー)の作成をドキュメント化した記事を作成しました。
バーチャルホスト バーチャルホストは、ネットワークカード、パブリックIPアドレス、仮想ネットワーク、ネットワークセキュリティグループ、ストレージなど、使用可能なサービスを提供するために他の多くの基礎的なコンポーネントと関連付ける必要があります。次の図は、新しい仮想マシンを作成するために必要な他のコンポーネントを含んでいます。

つまり、仮想マシンを作成する際に、コンポーネントを1つ1つ作成していくのです。

変数の定義

このスクリプトを将来も再利用できるように、使用するすべての変数をまとめておき、スクリプトのパラメータを使って簡単に修正または初期化できるようにします。

$rgName = "vmpool"
$rgLocation = "East Asia"
$subnetConfigName = $rgName + "subnet"
$vnetName = $rgName + "vnet"
$vmName = "vmxman"
$pipName = $vmName + "pip"
$nsgRule22Name = "nsgRule22"
$nsgName = $rgName + "nsg"
$interfaceName = $vmName + "nic"
$storageName = $rgName + "storage"
$storageType = "Standard_GRS"
$oSDiskName = $vmName + "OSDisk"
$vmSize = "Standard_D1"
$vmVersion = "16.04-LTS"
$userName = "nick"
$userPassword = "123456"


怖がらせてしまったかな?そうなんです! それだけ変数が必要なんだから、ここでは説明しないで、後で1つずつ使おうよ。

仮想マシンにログインするためのクレデンシャルを作成する

このスクリプトで作成した仮想マシンは、デフォルトでユーザーを作成しますので、ユーザー名とログインパスワードを指定する必要があります(今回作成したユーザーは公開鍵認証でログインしますので、このパスワードは実際には使用されません)。ユーザー名とパスワードでクレデンシャルオブジェクトを作成する場合。

$securePassword = ConvertTo-SecureString $userPassword -AsPlainText -Force
$userCred = New-Object System.Management.Automation.PSCredential ($userName, $securePassword)


リソースグループの作成

仮想マシンとその関連コンポーネントがすべて同じResource Groupに所属する新しいResource Groupを作成します。

New-AzureRmResourceGroup -Name $rgName -Location $rgLocation


パラメータLocationにResource Groupの所在地をEast Asia(高速アクセス)と指定します。

仮想ネットワークの作成

次に仮想ネットワークで作成します。まず、サブネットの設定を作成します。

$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig -Name $subnetConfigName -AddressPrefix 192.168.1.0/24


次に、1つのサブネットで仮想ネットワークを作成します。
$vnet = New-AzureRmVirtualNetwork -ResourceGroupName $rgName -Location $rgLocation `
                 -Name $vnetName -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig


最後に、外部ネットワークからアクセス可能なホストのパブリックIPを作成します。
$pip = New-AzureRmPublicIpAddress -ResourceGroupName $rgName -Location $rgLocation `
                 -AllocationMethod Static -IdleTimeoutInMinutes 4 `
                 -Name $pipName


ネットワークセキュリティグループの作成

22番ポートへのアクセスを許可するルールを最初に設定する必要があります。

$nsgRule22 = New-AzureRmNetworkSecurityRuleConfig -Name $nsgRule22Name -Protocol Tcp `
  -Direction Inbound -Priority 200 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
  -DestinationPortRange 22 -Access Allow


次に、ネットワークセキュリティグループを作成します。
$nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $rgName -Location $rgLocation `
  -Name $nsgName -SecurityRules $nsgRule22


Webインタフェースの作成

ホストにはまだネットワークカードがないので、ホスト用の仮想ネットワークカードを作成します。

$nic = New-AzureRmNetworkInterface -Name $interfaceName -ResourceGroupName $rgName -Location $rgLocation `
  -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id


ストレージアカウントの作成

仮想マシンのディスクファイルはazureのストレージにblobとして格納されるので、ディスクファイルを格納するStorageAccountを作成する必要があります。

$storageAccount = New-AzureRmStorageAccount -ResourceGroupName $rgName -Name $storageName -Type $storageType -Location $rgLocation


以下は、ディスクファイルの場所と名前を定義しています。

$oSDiskUri = $storageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $oSDiskName + ".vhd"


仮想マシンの作成

仮想マシンの作成に関連する以下の設定です。

$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize | `
      Set-AzureRmVMOperatingSystem -Linux -ComputerName $vmName -Credential $userCred -DisablePasswordAuthentication | `
      Set-AzureRmVMSourceImage -PublisherName Canonical -Offer UbuntuServer -Skus $vmVersion -Version latest |`
      Add-AzureRmVMNetworkInterface -Id $nic.Id | `
      Set-AzureRmVMOSDisk -VhdUri $oSDiskUri -CreateOption FromImage


作成した仮想マシンはUbuntu Server 16.04-LTSで、ユーザー名パスワードによるログインは無効になっています。公開鍵でのログインを可能にするには、ユーザーの公開鍵を用意する必要があります。
$sshPublicKey = "nick's ssh public key"


以下のコマンドを実行すると、指定した公開鍵がユーザーの authorized_keys ファイルに書き込まれます。
Add-AzureRmVMSshPublicKey -VM $vmconfig -KeyData $sshPublicKey -Path "/home/$userName/.ssh/authorized_keys"


実際にazure上に仮想マシンを作成するのは以下のコマンドです。
New-AzureRmVM -ResourceGroupName $rgName -Location $rgLocation -VM $vmConfig


アクセス権の問題

azure上でアクションを実行するには、まずユーザーがログインする必要があります。そこで、PowerShellスクリプトでどのようにそれを行うのですか?
の作者は Azureの基本。PowerShellで自動ログイン 記事 "Azureの基礎知識 に詳しい説明があります。PowerShellでログインを自動化する" に詳しい説明があります。