Skip to content

Instantly share code, notes, and snippets.

@mtsukamoto
Created April 23, 2018 05:45
Show Gist options
  • Save mtsukamoto/e24f8fc3f963a801e014554871b01c7f to your computer and use it in GitHub Desktop.
Save mtsukamoto/e24f8fc3f963a801e014554871b01c7f to your computer and use it in GitHub Desktop.
Powershellから、仮想マシンサイズや仮想マシンイメージを指定して、仮想マシンを作成する手順のメモ
# Memo_Create_Azure-VM.ps1
# ----
# Powershellから、仮想マシンサイズや仮想マシンイメージを指定して、
# 仮想マシンを作成する手順のメモ
# ---- 事前準備(PowershellでAzureを操作する時の共通作業)----
# Azureにログインします(Azure Browser Shellでは、アクセス時にログインしているので不要です)。
# Login-AzureRmAccountコマンドレットを使用します。
Login-AzureRmAccount
# 既存のサブスクリプション名を確認します。
# 使用コマンドレット:Get-AzureRmSubscription
$subscriptions = Get-AzureRmSubscription
$subscriptions | Select Name
# 使用サブスクリプションを変数に保持しておき、また作業コンテキストをこのサブスクリプションに切り替えます。
# 使用コマンドレット:Set-AzureRmContext
$subscription = ($subscriptions | ?{$_.Name -eq "Microsoft Azure"}) # 前行の表示にあわせて検索文字列を変更
Set-AzureRmContext -Subscription $subscription
# 以下は必須ではないけど、後の引数指定で使いまわせるのでやっておくと便利
# ロケーションを取得し、作業対象ロケーションを変数に格納しておきます。
# 使用コマンドレット:Get-AzureRmLocation
$locations = Get-AzureRmLocation
$locations.location | ?{$_ -match "japan"} # `japan`や`us`などで絞り込み
$location = ($locations | ?{$_.location -eq "japaneast"})
# リソースグループを取得し、作業対象リソースグループを変数に格納しておきます。
# 使用コマンドレット:Get-AzureRmResourceGroup
# https://docs.microsoft.com/en-us/powershell/module/azurerm.resources/get-azurermresourcegroup
$rgs = Get-AzureRmResourceGroup
$rgs.ResourceGroupName
$rg = ($rgs | ?{$_.ResourceGroupName -eq "my-rg01"})
# ---- 仮想マシンサイズの選定 ----
# 使用できる仮想マシンサイズを取得します。
# 使用コマンドレット:Get-AzureRmVMSize
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.compute/get-azurermvmsize
$sizes = Get-AzureRmVMSize -Location $location.Location
# 仮想マシンサイズを選定します。件数が多いので、指定列、列順での表示や、`?`(where-object)での絞り込み等を活用します。
$props = @("Name","NumberOfCores","MemoryInMB","OSDiskSizeInMB","ResourceDiskSizeInMB","MaxDataDiskCount") # 表示列指定の簡略化のため
$sizes[0..2] | Format-Table -Property $props
$sizes | ?{($_.Name -match "_D") -and ($_.NumberOfCores -eq 2) -and ($_.MemoryInMB -ge 8192)} | Format-Table -Property $props
# 使用する仮想マシンサイズを、変数に保持しておきます。
$size = ($sizes | ?{$_.Name -eq "Standard_D2_v3"})
# ---- 仮想マシンイメージの選定 ----
# https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/cli-ps-findimage#navigate-the-images
# 使用する仮想マシンイメージを決定します。
# 発行元、イメージプラン、SKU、バージョンの順で選定していき、それぞれ変数に格納しておきます。
# マーケットプレイスから、仮想マシン提供元を取得し、選定します。
# 使用コマンドレット:Get-AzureRmVMImagePublisher
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.compute/get-azurermvmimagepublisher
$publishers = Get-AzureRmVMImagePublisher -Location $location.Location
$publishers | Select PublisherName | ? {$_ -match "MicrosoftWindows"} # 絞り込み
$publisher = ($publishers | ?{$_.PublisherName -eq "MicrosoftWindowsServer"})
# この提供元が登録しているイメージプランを取得し、選定します。
# 使用コマンドレット:Get-AzureRmVMImageOffer
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.compute/get-azurermvmimageoffer
$offers = Get-AzureRmVMImageOffer -Location $location.Location -PublisherName $publisher.PublisherName
$offers | Select Offer
$offer = ($offers | ?{ $_.Offer -eq "WindowsServer" })
# このイメージプランで登録されているSKUを取得し、選定します。
# 使用コマンドレット:Get-AzureRmVMImageSku
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.compute/get-azurermvmimagesku
$skus = Get-AzureRmVMImageSku -Location $location.Location -PublisherName $publisher.PublisherName -Offer $offer.Offer
$skus | Select Skus
$sku = ($skus | ?{ $_.Skus -eq "2016-Datacenter" })
# このSKUで使用できるバージョンを取得し、選定します。
# 使用コマンドレット:Get-AzureRmVMImage
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.compute/get-azurermvmimage
$versions = Get-AzureRmVMImage -Location $location.Location -PublisherName $publisher.PublisherName -Offer $offer.Offer -Skus $sku.Skus
$versions | Select Version
$version = ($versions | ?{ $_.Version -eq "2016.127.20180315"})
# $version = $versions[-1] # 最新版であればこれでもいいはず
# 仮想マシンイメージのURNを作成します。`$verName`は、最新版を使うときは前述の通り文字列`"latest"`としてください。
$image = @($version.PublisherName, $version.Offer, $version.Skus, $version.Version) -join ":"
# ---- 仮想マシンイメージの契約プランの確認 ----
# https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/cli-ps-findimage#deploy-an-image-with-marketplace-terms
# 契約プランの有無を確認します。
# 何も表示されなければ、契約プランは確認不要です。
$image.PurchasePlan
# 表示されたときは、契約プランを承諾しているか確認していきます。
# サンプルとして、以下は契約プランの指定されている仮想マシンイメージです。
# $image = Get-AzureRMVMImage -Location "westus" -Publisher "microsoft-ads" -Offer "windows-data-science-vm" -Skus "windows2016" -Version "0.2.02"
# 契約プランの情報を取得、表示します。
# 使用コマンドレット:Get-AzureRmMarketplaceTerms
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.marketplaceordering/get-azurermmarketplaceterms
$plan = $image.PurchasePlan
$terms = Get-AzureRmMarketplaceTerms -Publisher $plan.Publisher -Product $plan.Product -Name $plan.Name
$terms
# `Accepted`行の値が`True`ではないときは、未承諾のためこのイメージは使用できません。
# 必要であれば、承諾を行います。
# 使用コマンドレット:Set-AzureRmMarketplaceTerms
# https://docs.microsoft.com/ja-jp/powershell/module/azurerm.marketplaceordering/set-azurermmarketplaceterms
Set-AzureRmMarketplaceTerms -Publisher $terms.Publisher -Product $terms.Product -Name $terms.Plan -Terms $terms -Accept
# ---- ネットワークインターフェースカードの作成 ----
# VNetを取得し、接続先を選定します
# 使用コマンドレット:Get-AzureRmVirtualNetwork
# https://docs.microsoft.com/ja-jp/powershell/module/AzureRM.Network/Get-AzureRmVirtualNetwork
$vnets = Get-AzureRmVirtualNetwork -ResourceGroupName $rg.ResourceGroupName
# $vnets = Get-AzureRmVirtualNetwork -ResourceGroupName "my-rg02" # 別のリソースグループのネットワークに接続する場合は直指定
$vnets | Select Name
$vnet = ($vnets | ?{ $_.Name -eq "my-vnet01"})
# サブネットを取得し、接続先を選定します
$subnets = $vnet.Subnets
$subnets | Select Name,AddressPrefix
$subnet = ($subnets | ?{ $_.Name -eq "default" })
# パブリックIPを取得し、割当対象を選定します。
$pips = Get-AzureRmPublicIpAddress
$pips | ?{ $_.Location -eq $location.Location } | Select Name,ResourceGroupName,IpAddress
$pip = ($pips | ?{ $_.Name -eq "my-pip01" })
# $pip = $null # パブリックIPを割り当てないときは$null
# ネットワークセキュリティグループを取得し、割当対象を選定します。
$nsgs = Get-AzureRmNetworkSecurityGroup -ResourceGroupName $rg.ResourceGroupName
$nsgs | Select Name
$nsg = ($nsgs | ?{ $_.Name -eq "my-nsg01")
# $nsg = $null # ネットワークセキュリティグループを割り当てないときは$null
# NICを作成します。
$nicName = "my-nic01"
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rg.ResourceGroupName -Location $location.Location -SubnetId $subnet.Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id
# ---- 仮想マシンの作成 ----
# https://docs.microsoft.com/ja-jp/azure/virtual-machines/scripts/virtual-machines-windows-powershell-sample-create-vm
# 仮想マシン名とホスト名
$vmName = "my-vm01"
$hostname = $vmname
# ゲストOSの管理者アカウントに設定する認証情報を生成します。
# プロンプトが表示されるので、ユーザー名とパスワードを指定します。
# 使用コマンドレット:Get-Credential
# https://docs.microsoft.com/ja-jp/powershell/module/Microsoft.PowerShell.Security/Get-Credential
$cred = Get-Credential -Message "ゲストOSに設定する管理者情報" # `-Message`引数は省略可
# 仮想マシン情報の生成
# 使用コマンドレット:New-AzureRmVMConfig
# https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/new-azurermvmconfig
$vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $size.Name
# OS情報の設定
# 使用コマンドレット:Set-AzureRmVMOperatingSystem
# https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/set-azurermvmoperatingsystem
$vmConfig | Set-AzureRmVMOperatingSystem -Windows -ComputerName $hostname -Credential $cred
# 使用イメージの設定
# 使用コマンドレット:Set-AzureRmVMSourceImage
# https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/set-azurermvmsourceimage
$vmConfig | Set-AzureRmVMSourceImage -PublisherName $version.PublisherName -Offer $version.Offer -Skus $version.Skus -Version $version.Version
# NICの設定(NICが1つの場合)
# 使用コマンドレット:Add-AzureRmVMNetworkInterface
# https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/add-azurermvmnetworkinterface
$vmConfig | Add-AzureRmVMNetworkInterface -Id $nic.Id
# NICの設定(NICが2つ以上の場合)
#$vmConfig | Add-AzureRmVMNetworkInterface -Id $nic1.Id -Primary
#$vmConfig | Add-AzureRmVMNetworkInterface -Id $nic2.Id
# 仮想マシンの作成
# 使用コマンドレット:New-AzureRmVM
# https://docs.microsoft.com/en-us/powershell/module/azurerm.compute/new-azurermvm
$job = New-AzureRmVM -ResourceGroupName $rg.ResourceGroupName -Location $location.Location -VM $vmConfig -AsJob
# ---- ジョブの確認 ----
# ジョブの確認
# 使用コマンドレット:Get-Job
# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/get-job
Get-Job -Id $job.Id | select Command,PSBeginTime,State,Error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment