連載
» 2014年08月28日 17時20分 UPDATE

PowerShell DSCで始めるWindowsインフラストラクチャ自動化の基本:PowerShell DSCによるプル型展開(後編) (2/2)

[吉崎生、http://tech.guitarrapc.com/,著]
前のページへ 1|2       

プルサーバーの構成

 リソースが適切に配置できたら、次は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の内容を説明する。

  • Import-DSCResource キーワードを使って、配置したxPSDesiredStateConfigurationリソースをインポートする。リソースが適切にモジュールフォルダーに配置されていないとConfiguraionでエラーが表示されるので、必ずxPSDesiredStateConfigurationリソースの配置を先に行うこと。
  • 続いてプルサーバーで利用する、「Windowsの機能」を4つインストールする。
    1. DSC-Service(Windows PowerShell Desired State Configuration Service)
    2. Web-Server(IIS)
    3. Web-Security(IISセキュリティ)
    4. Web-Mgmt-Tools(IIS管理ツール)
    5. Web-Asp-Net45(ASP.NET 4.5)
  • DSCPullServerでは、DSCサーバーにPSDSCPullServerの機能をインストールしている。順番に見ていこう。
  • EndPointNameは、プルノードがDSCサーバーを参照するときのエンドポイント名だ。今回は「PSDSCPullServer」を指定している。
  • Ensureには「存在(Present)」を指定している。「入っていてほしい」ので「Present」としているが、無いことを指定する(削除する)には、「Absent」を指定する。
  • IsComplianceServerは、PSDSCPullServerの構成なので「$false」だ。
  • CertificateThumbPrintは、HTTPSでの通信の場合は利用する証明書のThumbPrintを指定する。今回はHTTPとするため、「AllowUnencryptedTraffic」としている。
  • Portには、プルノードがDSCサーバーと通信する際に利用するポート番号を指定する。今回は「8080」を指定した。
  • Stateには、サイトの状態を指定する。今回は、「Started」で開始を「望んで」いる。
  • PhysicalPathは、サイトの動作に必要なDLLなどを配置するWebサイトの物理パスだ。
  • ConfigurationPathは、プルノードが自分のConfiguraionIDで問い合わせて来たときに、そのConfiguraionIdの.mofファイルがあるか確認するパスだ。
  • ModulePathは、プルノードに あるべき構成 を適用するときに利用するリソースを配置しておくパスだ。ここに配置したリソースは、プルノードに構成がダウンロードされた際に、自動的にプルノードに配置される。
  • DependsOnは、このConfigurationを実行する前に完了すべき、依存しているConfigurationを示している。今回は、DSCServiceが正常完了している時だけ実行するように依存関係を指定している。
  • DSCComplianceServerでは、DSCサーバーにPSDSCComplianceServerをインストールしている。設定している内容はDSCPullServerとほとんど変わらない。違いは、Portを「8081」にしたことと、IsComplianceServerを「$true」にしただけだ。
  • 最後に、Configurationを実行して.mofファイルを生成し、Start-DSCConfigurationで構成を展開している。実行完了後はDSCサーバーがプルサーバーで利用できるようになっているはずだ。

 それでは、DSCサーバーでDSCPullServer Configuraionを実行してみよう。

DSCPullServer Configurationの実行 DSCPullServer Configuraionの実行
DSCPullServer Configurationを実行している最中の様子だ。Windowsの機能である「DSC-Service」のインストールまで進んでいることが分かる。

DSCPullServer Configuraionの実行結果 DSCPullServer Configuraionの実行結果
正常に完了し、DSCサーバーがプルサーバーとして利用できるようになった。

プルノードがプルサーバーを参照するServerUrlの確認

 プルサーバーとして構成している途中で、プルサーバーの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アドレスで指定した。

PSDSCPullServerのServerUrl情報 PSDSCPullServerのServerUrl情報
プルサーバーを構成中に、プルノードが参照すべきServerUrlが表示されている。
  (1)更生中に表示されたServerUrl情報。

 実際に、DSCサーバーやプルノードから、Internet Explorerで接続できるか試す。正常にプルサーバーが構成されていれば、次のようにEndPointのXMLが表示されるはずだ。

EndPointのXML情報の確認 EndPointのXML情報の確認
正しく構成されているとプルサーバーのEndPointの情報が表示され、プルサーバーが問題なく動作していることが分かる。
  (1)プルノードが参照すべきServerUrlへアクセスしてみる。
  (2)アクセスされたXML情報。

プルノードに展開する構成ファイル.mofの配置

 プッシュで展開した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を実行するとハッシュ値も変化するので、更新の有無を判断できる。

 ここまでの流れを把握したら、実行してみよう。

mofファイルを展開する mofファイルを展開する
Configuraionを実行すると10.0.2.11.mof が生成され、さらにChecksumファイルも生成される。

 実際に、PSDSCPullServerで指定したConfigurationパス「$env:PROGRAMFILES\WindowsPowerShell\DscService\Configuration」を見てみよう。

生成されたmofとChecksumファイル 生成されたmofとChecksumファイル
PSDSCPullServerのConfigurationパスに、プルノードに設定したConfiguraionID「93018eed-0863-4274-8ee0-32ddfd1a85d8」と同名の.mofファイルと.mof.checksumファイルが存在することが分かる。

 これでDSCサーバーの作業は完了だ。後は、プルノードのLCMに設定したRefreshFrequencyMinsとConfiguraionModeFrequencyMinsの間隔に従って、プルノード自らがDSCサーバーから構成ファイルの確認、取得、適用を定期的に行う。

 それではプルノードの状態を見てみよう。前回、LCMパラメーターの説明の際に、同期間隔は30分に1回と説明した。時間をおいてから次のコマンドレットを実行してみてほしい。

$CimSession = New-CimSession -ComputerName 10.0.2.11
Get-DscConfiguration -CimSession $CimSession



 .mofで指定した通りに適用されていることが分かるだろう。

プルノードの実行結果の状態 プルノードの実行結果の状態
プルノードのLCMにキャッシュされた、DSCサーバーに配置した 構成ファイル.mof の あるべき状態

プルノードの実行結果 プルノードの実行結果
HelloDSCFileファイルが作成されている。プルノードの実際のファイル状態も適切だ。

 30分待たずに任意のタイミングで実行させることもできるが、今回は省略する。


 本連載では、PowerShell DSCの概要から実際にプッシュ型とプル型でサーバーとノードを構成し、あるべき状態 を適用するまでを解説した。実際に断片的なコードサンプルはさまざまなサイトでも公開されているが、展開から構成までを逐次解説した記事は筆者も見かけたことがないため、今回の連載では初歩から踏み入れる足掛かりとなるように書いた。

 PowerShell DSCを使うことで「Infrastrucure as Code」が容易に実現でき、アプリケーションコードと同様に、GitHubなどのバージョン管理システムでバージョン管理することもできる。バージョン管理ができれば、過去の任意のタイミングへのロールバックも可能だ。

 他にもインフラ構成がコードベースになることで、レビューがしやすくなるというメリットも生まれてくる。レビューを通して、これまで手順書や各人の知識に埋もれてしまっていた知恵が共有される足掛かりにできることも多い。GitHubのようなバージョン管理システムと連携することで、プルリクエストもできるので、よりコードレビューがしやすくなるだろう。

 PowerShell DSCは2013年10月にリリースされたばかりで、まだまだ成熟しているとはいえない。しかし今の段階でもサーバー構成作業を自動化できる部分は多く、人手による繰り返し作業、単純ミスから解放してくれることは多いだろう。

 ぜひ皆さんもPowerShell DSCを使って、Windowsインフラを あるべき状態 に維持していってほしいと思う。

「PowerShell DSCで始めるWindowsインフラストラクチャ自動化の基本」のインデックス

PowerShell DSCで始めるWindowsインフラストラクチャ自動化の基本

前のページへ 1|2       

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。