PowerShell DSCを利用したAzure仮想マシン構築の自動化

PowerShellのDSC(Desired State Configuration)はWindows Management Framework 4.0から導入されたMicrosoftのテクノロジで、ChefやPuppetのようなものですが、知らない人はこちらのページがわかりやすかったです。
PowerShell DSCで導入された新しい構文キーワード - Build Insider

上記のページの例ではWindows Server上でDSCを実行して、IISのWebサーバを自動構築する例が書かれています。ここで使われているDSCコードは以下の通りです。Nodeがlocalhostになっていますね。

Configuration WebSiteConfigInstall
{
    Node "localhost"
    {
      WindowsFeature IIS
      {
        Ensure               = "Present"
        Name                 = "Web-Server"
      }

      WindowsFeature IISMgmt
      {
        Ensure               = "Present"
        Name                 = "Web-Mgmt-Tools"
      }

      WindowsFeature ASP
      {
        Ensure               = "Present"
        Name                 = "NET-Framework-45-ASPNET"
      }
    }
}

WebSiteConfigInstall -OutputPath .
Start-DscConfiguration .\WebSiteConfigInstall -Wait -Verbose

こちらは、Windowsサーバを用意して、ログオンしPowerShellから上記コードを実行するだけで、簡単に試すことができます。

 
 

Azureに適用してみる

上記の例はWindowsサーバにログオンして、ローカル環境でのDSCを実行するための例でした。しかし、本当にマシンの構築を自動化したいのなら、リモートからもDSCを実行できるようにしたいところです。

ここでは、ローカルPCからAzure上の仮想マシンにリモートでDSCを実行するコードを載せたいと思います。方法としては、CIMのリモートセッションを張る方法でリモートのDSC実行を実現しています。

[CmdletBinding()]
Param(
   [Parameter(Mandatory=$True,HelpMessage="DSC設定対象となるAzure仮想マシンの含まれるサブスクリプション名")]
   [string]$subscriptionName,

   [Parameter(Mandatory=$True,HelpMessage="DSC設定対象となるAzure仮想マシンの含まれるクラウドサービス名(Get-AzureVMで取得可能)")]
   [string]$serviceName,

   [Parameter(Mandatory=$True,HelpMessage="DSC設定対象となるAzure仮想マシン名(Get-AzureVMで取得可能)")]
   [string]$vmName,

   [Parameter(Mandatory=$True,HelpMessage="DSC設定対象となるAzure仮想マシンへの接続に利用するOSユーザ名")]
   [string]$userName,

   [Parameter(Mandatory=$True,HelpMessage="DSC設定対象となるAzure仮想マシンへの接続に利用するOSユーザのパスワード)")]
   [string]$password
   	
)

Import-Module azure
Add-AzureAccount
Select-AzureSubscription $subscriptionName


#パスワードをSecureStringに変換
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force

#認証情報の生成
$credential = New-Object System.Management.Automation.PSCredential($userName,$secPassword)

#WinRMのUri情報をAzureのコマンドレットから取得します。ポート番号もここで自動的に取得できます含まれます。
#サービス名と仮想マシン名はGet-AzureVMコマンドで確認できます。
$winRmUri = Get-AzureWinRMUri -ServiceName $serviceName -Name $vmName

#WinRMの情報と認証情報を利用してCIMセッションを張ります
$cimSessionOption = New-CimSessionOption -UseSsl -SkipCACheck
$cimSession = New-CimSession -SessionOption $cimSessionOption -ComputerName $winRmUri.Host -Port $winRmUri.Port -Authentication Negotiate -Credential $credential

#DSCコードを準備します
#Nameの項目名がわからない場合はWindowsサーバでGet-WindowsFeatureコマンドを使って調べることができます。
Configuration WebSiteConfigInstall
{
    param (
        $NodeName
    )
    Node $NodeName
    {
      WindowsFeature IIS
      {
        Ensure               = "Present"
        Name                 = "Web-Server"
      }

      WindowsFeature IISMgmt
      {
        Ensure               = "Present"
        Name                 = "Web-Mgmt-Tools"
      }

      WindowsFeature ASP
      {
        Ensure               = "Present"
        Name                 = "NET-Framework-45-ASPNET"
      }
    }
}

#CIMセッションに対してDSCを実行します
WebSiteConfigInstall -NodeName $winRmUri.Host -OutputPath . 
Start-DscConfiguration -CimSession $cimSession .\WebSiteConfigInstall -Wait -Verbose

 
 

コードをPowerShellコンソールから実行した画面は以下のようになります。

 
 
エラー無く処理が完了すれば、WindowsサーバにログオンすればIISなど指定した機能がインストールされているのが確認できるはずです。

Azure上での仮想マシン構築の自動化

今回書いたDSCと、以前書いたPowerShellを利用したAzure仮想マシンの自動作成や、DSCで対応しきれない部分の自動化をPowerShellの自動実行で補うことで、Azure上のWindowsサーバ構築においてもかなりの部分を自動化できるようになってきていると思います。
【PowerShell】New-AzureVMでAzure仮想マシンの作成サンプル - YOMON8.NET
Azure上の仮想マシンにPowerShellでリモートコマンドを実行する - YOMON8.NET