Imperative Programming を日本語でどう訳すべきなのかググると、命令型プログラミングと呼ぶことが多いようです。 一方で、 Declarative programmingは、宣言型プログラミングだとか。
これまでPowerShell 1.0 - 3.0までは、所謂Imperative Programming「命令型プログラミング」が主体となってきました。 TechEd NA 2013においてJeffrey SnoverとKenneth HansenからDesired State Configuration (DSC)をPowerShell 4.0で取り込む事が明らかにされました。
では、そのDSCでどう変わるのかを見てみましょう。 本内容を示すに当たり、秀逸にまとめられた記事があったので、参照しつつ進めていきます。
Imperative versus declarative syntax in PowerShell
DSCとは
Jeffrey SnoverがDSCについて講演しています。
Desired State Configuration in Windows Server 2012 R2 PowerShell
PowerShell Desired State Configuration Enables you to ensure that the components of your data center have the correct configuration. Allows "continuous deployment" and prevents "configuration drift" Uses language extensions and providers to enable declarative, autonomous and idempotnt (repeatable) Deployment, Configuration and Conformance of standards-based manged elements. PowerShell Desired State Configurationとはデータセンター(大規模環境)において各コンポーネント (IISなど) が正しい設定になっているかを確実にしてくれる継続したデプロイを可能にして、設定(コンフィグ)が流れてしまうことを防ぐ言語拡張(各国の言語)で、宣言を可能にし、繰り返し実行してもデプロイ結果、設定を維持します。
データセンター(大規模環境)において 各コンポーネント (IISなど) が正しい設定になっているかを確実にしてくれる
これまでの命令型では、このモジュールが含まれて入ることを確認して、なければ入れて、あれば次の..... と順に順に実行しました。一方で、DSCではあるべき姿を示し、足りない部分をpsd1で定義したとおりにセットアップします。 この時、HashTableを用いてDSCを構造化して示す、つまりdeclarative syntaxと表されています。 依存を解決し、必要に応じて処理をすすめる、これが可能になります。
継続したデプロイを可能にして、設定(コンフィグ)が流れてしまうことを防ぐ
宣言をベースにしているため、変更があった場合は、その箇所の宣言を変えるだけです。 つまり、過程、変更を考慮してコードに落とす必要はなく、宣言を変えるのみで済みます。 この小さな変更が、継続したデプロイを可能にし、人による理解の差異を少なくします。
言語拡張(各国の言語)で、宣言を可能にし、繰り返し実行してもデプロイ結果、設定を維持します。
DSCはあるべき姿にする = 命令型のような、考慮もれにより開始状態によって結果が変わることを防ぎます。 つまり、初期状態から設定しても、設定完了後に再度実行しても結果は変わりません。standards-based manged elements
は、DSCはPowerShellなの?それともWindowsの機能なの? にかけています。
講演中、これに対して二人はこのように答えています。
First inplemented on Windows, Using PowerShell Language and WMI and PowerShell Extention Mode. DSCはPowerShellだけの機能ではなく、 Windowsのcore OSに新たに実装された機能です。 PowerShell 4.0のDSCは、PowerShellを用いてより容易にDSCを扱おうというものです
PowerShell 3.0までのImperativeな記述
Pull/Push型に関しては、またの機会で記事に起こすとしてImperativeとDSCの違いを見てみましょう。 これは、PowerShell 3.0までにおける、Imperativeスタイルで記述したIISとASP.NETのインストールスクリプト例です。
Import-Module ServerManager #Check and install ASP.NET 4.5 feature If (-not (Get-WindowsFeature "Web-Asp-Net45").Installed) { try { Add-WindowsFeature Web-Asp-Net45 } catch { Write-Error $_ } } #Check and install Web Server Feature If (-not (Get-WindowsFeature "Web-Server").Installed) { try { Add-WindowsFeature Web-Server } catch { Write-Error $_ } } #Create a new website Add-PSSnapin WebAdministration New-WebSite -Name MyWebSite -Port 80 -HostHeader MyWebSite -PhysicalPath "$env:systemdrive\inetpub\MyWebSite" #Start the website Start-WebSite -Name MyWebSite
見てわかる通り、望む結果に至るために、どのようにすればいいのか」(how to perform what we need to perform)
を記述しています。
この場合で言うと、ASP.NETやIISが存在するかを確認して、無ければ機能追加/WebSiteを作成/WebSiteを開始しています。 見慣れた記述であり、私自身毎日このような記述を書いています。
DSCを用いた記述
同じ結果を、PowerShell 4.0からはDSCで行えます。
Configuration WebSiteConfig { Node MyWebServer { WindowsFeature IIS { Ensure = "Present" Name = "Web-Server" } WindowsFeature ASP { Ensure = "Present" Name = "Web-Asp-Net45" } Website MyWebSite { Ensure = "Present" Name = "MyWebSite" PhysicalPath = "C:\Inetpub\MyWebSite" State = "Started" Protocol = @("http") BindingInfo = @("*:80:") } } }
次のように宣言されているだけで、どのように実行されるか記述していないことに気づきます。
- ASP.NETとIISがある (Ensure = "Present")
- WebSiteは作る (Ensure = "Present")
- 名称などを記述
- DSC実行後開始する (State = "Started")
これが、これまでのImperativeとdeclarative syntaxとの違いです。
もちろん、DSCというフレームワーク内で上記を実現するためにdeclarative syntaxの宣言以外にやるべきことはあります。 それでも、何をしたいのかがDSCは明らかに見やすくなっていることが分かります。
詳しいDSCの設定は後日に譲るとして、DSCが目指すこれからのPowerShell 4.0これが主体となる事を如実に感じさせ、わくわくしてきます! また、PowerShell 4.0とDSCについては記事にしていきます。