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