リソースが適切に配置できたら、次はDSCサーバーをプルサーバーとして構成しよう。DSCサーバーをプルサーバーとして構成しても、同時にプッシュサーバーとしても動作するので不安に思わないでほしい。
プルサーバーへの構成は、配置したxPSDesiredStateConfiguraionリソースを用いてConfigurationで記述する。構成を実行するまでのコード全文は次の通りだ。
Configuration DSCPullServer
{
    Import-DSCResource -ModuleName xPSDesiredStateConfiguration
    Node localhost
    {
        WindowsFeature DSCService
        {
            Name   = "DSC-Service"
            Ensure = "Present"
        }
        WindowsFeature IIS
        {
            Name                  = "Web-Server"
            Ensure                = "Present"
        }
        WindowsFeature IISSecurity 
        {
            Name                  = "Web-Security"
            Ensure                = "Present"
            IncludeAllSubFeature  = $true
        }
 
        WindowsFeature IISMgmt
        {
            Name                  = "Web-Mgmt-Tools"
            Ensure                = "Present"
        }
        WindowsFeature ASPNET
        {
            Name                  = "Web-Asp-Net45"
            Ensure                = "Present"
            IncludeAllSubFeature  = $true
        }
        xDSCWebService DSCPullServer
        {
            EndpointName          = "PSDSCPullServer"
            Ensure                = "Present"
            IsComplianceServer    = $false
            CertificateThumbPrint = "AllowUnencryptedTraffic"
            Port                  = 8080
            State                 = "Started"
            PhysicalPath          = "$env:SystemDrive\inetpub\wwwroot\PSDSCPullServer"
            ConfigurationPath     = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration"
            ModulePath            = "$env:PROGRAMFILES\WindowsPowerShell\DscService\Modules"
            DependsOn             = "[WindowsFeature]DSCService"
        }
        xDSCWebService DSCComplianceServer
        {
            EndpointName          = "PSDSCComplianceServer"
            Ensure                = "Present"
            IsComplianceServer    = $true
            CertificateThumbPrint = "AllowUnencryptedTraffic"
            Port                  = 8081
            State                 = "Started"
            PhysicalPath          = "$env:SystemDrive\inetpub\wwwroot\PSDSCComplianceServer"
            DependsOn             = ("[WindowsFeature]DSCService", "[xDSCWebService]DSCPullServer")
        }
    }
}
$outputPath = "C:\DSCPullServer"
DSCPullServer -OutputPath $outputPath
Start-DscConfiguration -Path $outputPath -Wait -Verbose
Configurationの内容を説明する。
それでは、DSCサーバーでDSCPullServer Configuraionを実行してみよう。
DSCPullServer Configuraionの実行プルサーバーとして構成している途中で、プルサーバーのEndPointとなるURL「http://<コンピューター名>:8080/PSDSCPullServer/PSDSCPullServer.svc」が表示される。
前回の「LCMをプル型に構成してみる」において、DSC Local Configuration Manager(LCM)でプルノード型に変更するときに、Configurationの ServerUrlで「http://10.0.2.20:8080/PSDSCPullServer/PSDSCPullServer.svc/」と指定していたアドレスはこのアドレスだ。PSDSCPullサーバーのEndPointはホスト名でバインドしていないので、DNS名でもIPアドレスでも接続が可能である。そのため、分かりやすくIPアドレスで指定した。
実際に、DSCサーバーやプルノードから、Internet Explorerで接続できるか試す。正常にプルサーバーが構成されていれば、次のようにEndPointのXMLが表示されるはずだ。
EndPointのXML情報の確認プッシュで展開したHelloPowerShellDSCを、プルノードにも展開してみよう。もう一度Configurationを示しておく。
Configuration HelloPowerShellDSC
{
    param
    (
        [string[]]$nodeName
    )
    Node $nodeName
    {
        File HelloDSCFile
        {
            DestinationPath = "C:\HelloDSCFile.txt"
            Ensure = "Present"
            Type = "File"
            Contents = "Hello PowerShell DSC World!!"
        }
    }
} 
Configurationを実行して構成ファイル.mofを生成するのだが、プッシュとは区別するため、OutputPathを「C:\HelloPowerShellDSCPull」としている。
プルノードに.mofを展開するためには、プルサーバーの所定のパスへ適用したい.mofファイルを配置する必要がある。コードにすると次の通りだ。
$nodeName = "10.0.2.11"
$outputPath = "c:\HelloPowerShellDSCPull"
HelloPowerShellDSC -OutputPath $outputPath -nodeName $nodeName
# Configurationを実行して生成された.mofファイルのパスをコピー元とする
$source = Join-Path -Path $outputPath -ChildPath "$nodename.mof" -Resolve
# プルノードのLCMで、ConfigurationIDに指定したguid
$guid = "93018eed-0863-4274-8ee0-32ddfd1a85d8"
# プッシュノードのLCMに指定したguidで.mofファイル名を指定し、PSDSCPullServerのConfiguraionPathに指定したパスをコピー先とする
$dest   = "C:\Program Files\WindowsPowerShell\DscService\Configuration\$guid.mof"
# Configurationを実行して生成された.mofファイルをコピーする
Copy-Item -Path $source -Destination $dest
# コピーした.mofファイルのchecksumファイルを生成する。
New-DSCCheckSum $dest -Verbose -Force
必要なのは、プルノードがLCMに設定されたConfigurationIDでプルサーバーに問い合わせて来たときに、適用する構成ファイル.mofが所定のパスに置いてあることだ。
そこでまず、プルノードのIPアドレスをConfigurationの実行時に渡して、構成ファイルを「c:\HelloPowerShellDSCPull\10.0.2.11.mof」に生成している。
次に、プルノードのLCMを設定する際にConfigurarionID に指定したGuid「93018eed-0863-4274-8ee0-32ddfd1a85d8」を指定する。
そして、プルノードに設定する.mofファイルのコピー先に、PSDSCPullServerの構成でConfigurationPathである「$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration」を指定し、コピー実行時にコピー元の 10.0.2.11.mofを{guidの名前}.mof(つまり「93018eed-0863-4274-8ee0-32ddfd1a85d8.mof」)にリネームするよう指示している。
Copy-Itemで、実際に「c:\HelloPowerShellDSCPull\10.0.2.11.mof」から「$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration\93018eed-0863-4274-8ee0-32ddfd1a85d8.mof」にコピーする。
そしてNew-DSCCheckSumを使って、ConfigurationPathに配置した「$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration\93018eed-0863-4274-8ee0-32ddfd1a85d8.mof」ファイルのChecksum「93018eed-0863-4274-8ee0-32ddfd1a85d8.mof.checksum」を生成する。このChecksumファイルの中にはハッシュ値だけが書かれている。ファイルの内容が少しでも変われば、もう一度New-DSCCheckSumを実行するとハッシュ値も変化するので、更新の有無を判断できる。
ここまでの流れを把握したら、実行してみよう。
実際に、PSDSCPullServerで指定したConfigurationパス「$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration」を見てみよう。
生成されたmofとChecksumファイルこれでDSCサーバーの作業は完了だ。後は、プルノードのLCMに設定したRefreshFrequencyMinsとConfiguraionModeFrequencyMinsの間隔に従って、プルノード自らがDSCサーバーから構成ファイルの確認、取得、適用を定期的に行う。
それではプルノードの状態を見てみよう。前回、LCMパラメーターの説明の際に、同期間隔は30分に1回と説明した。時間をおいてから次のコマンドレットを実行してみてほしい。
$CimSession = New-CimSession -ComputerName 10.0.2.11
Get-DscConfiguration -CimSession $CimSession
.mofで指定した通りに適用されていることが分かるだろう。
30分待たずに任意のタイミングで実行させることもできるが、今回は省略する。
本連載では、PowerShell DSCの概要から実際にプッシュ型とプル型でサーバーとノードを構成し、あるべき状態 を適用するまでを解説した。実際に断片的なコードサンプルはさまざまなサイトでも公開されているが、展開から構成までを逐次解説した記事は筆者も見かけたことがないため、今回の連載では初歩から踏み入れる足掛かりとなるように書いた。
PowerShell DSCを使うことで「Infrastrucure as Code」が容易に実現でき、アプリケーションコードと同様に、GitHubなどのバージョン管理システムでバージョン管理することもできる。バージョン管理ができれば、過去の任意のタイミングへのロールバックも可能だ。
他にもインフラ構成がコードベースになることで、レビューがしやすくなるというメリットも生まれてくる。レビューを通して、これまで手順書や各人の知識に埋もれてしまっていた知恵が共有される足掛かりにできることも多い。GitHubのようなバージョン管理システムと連携することで、プルリクエストもできるので、よりコードレビューがしやすくなるだろう。
PowerShell DSCは2013年10月にリリースされたばかりで、まだまだ成熟しているとはいえない。しかし今の段階でもサーバー構成作業を自動化できる部分は多く、人手による繰り返し作業、単純ミスから解放してくれることは多いだろう。
ぜひ皆さんもPowerShell DSCを使って、Windowsインフラを あるべき状態 に維持していってほしいと思う。
Copyright© Digital Advantage Corp. All Rights Reserved.