PowerShell DSCを使ってみた

2015.08.10

西澤です。 Chefでも使われているというPowerShell Desired State Configuration(DSC)について調べてみたところ、AWS公式ブログでもドキュメントが公開されていました。試したことが無かったので、早速AWS環境で検証してみることにしました。

DSC環境

環境はWindows Server 2012 R2を利用しました。DSCではプッシュ/プルのいずれの構成も可能とのことなのですが、今回はプッシュ型の環境とする為、DSCクライアントへのWinRM許可(OSのFirewall、EC2のSecurity Group含む)が必要でした。

dsc-env

  • AMI: Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2015.07.15
  • Firewall: DSCサーバからDSCクライアントへの5985/tcpを許可

DSCの利用準備

Windows Server 2012 R2、Windows 8.1からであれば、標準で利用できるので、今回は追加作業は不要でした。Windows 7、Windows Server 2008 R2、Windows Server 2012では、Windows Management Framework 4.0を導入することで利用可能です。

PS C:\dsc> $PSVersionTable

Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.34209
BuildVersion 6.3.9600.17400
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2

PS C:\dsc> Get-DscLocalConfigurationManager

ActionAfterReboot : ContinueConfiguration
AllowModuleOverwrite : False
CertificateID :
ConfigurationID :
ConfigurationMode : ApplyAndMonitor
ConfigurationModeFrequencyMins : 15
Credential :
DebugMode : {NONE}
DownloadManagerCustomData :
DownloadManagerName :
LCMCompatibleVersions : {1.0}
LCMState : Idle
LCMVersion : 1.0
RebootNodeIfNeeded : False
RefreshFrequencyMins : 30
RefreshMode : PUSH
PSComputerName :

Configurationの記述

DSCサーバ側に宣言的構文でConfigurationを記述します。Configurationは以下のブロックで構成されます。

  • Configuration: 任意のConfiguration名
  • Node: 反映対象ノード
  • Resource: 処理内容

カスタムResourceを作成することも可能なようですが、今回はBuilt-In Windows PowerShell Desired State Configuration Resourcesのみを利用して構成します。設定内容は何となく読み取れるのではないかと思います。

PS C:\dsc> Configuration IISSetup
{
    Node dsc-client
    {
        WindowsFeature FeatureAdd
        {
            Ensure = "Present"
            Name = "Web-Server"
        }

        Service ServiceStart
        {
            Name = "W3SVC"
            StartupType = "Manual"
            State = "Running"
        }

        File FilePut
        {
            Ensure = "Present"
            Type = "File"
            Contents = "<html><head><title>タイトル</title></head><body>こんにちは!</body></html>"
            DestinationPath = "C:\inetpub\wwwroot\index.html"
        }
    }
}

MOF作成

続けて指定したConfiguration(コンパイルのような処理)を実行すると、MOFファイルが作成されます。オプション指定をしないと、カレントディレクトリ配下にConfiguration名のフォルダが作成され、その配下にファイルが生成されます。これで配布準備が完了です。

PS C:\dsc> IISSetup
ディレクトリ: C:\dsc\IISSetup
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2015/08/10 17:58 2446 dsc-client.mof

CIMセッション接続

DSCクライアントに対して、CIMセッションから接続します。AWSで用意されているWindows AMIではデフォルトで有効となっているので、Enable-PSRemotingは不要なはずです。どちらもWinRM利用となりますが、PowerShell v3以降では、PSSessionよりもCIMSessionが推奨されているようです。後で実行するStart-DscConfigurationの際に、Credentialを渡すことも可能ですが、Firewallが正しく解放されていること、認証情報が正しいこと等を切り分けることができるよう、ここで接続しておいた方が確実です。

PS C:\dsc> New-CimSession -ComputerName dsc-client -Credential $(Get-Credential)

コマンド パイプライン位置 1 のコマンドレット Get-Credential
次のパラメーターに値を指定してください:
Credential
Id : 1
Name : CimSession1
InstanceId : db2bd94e-c2f9-4f8d-8e18-890d54d8102e
ComputerName : dsc-client
Protocol : WSMAN

PS C:\dsc> $cimsession = $(Get-CimSession)

DSCクライアントへのPush

生成したMOFファイルと接続したCIMセッションを利用して、設定した内容をPushします。Configurationが適用されていく様子が表示されています。

PS C:\dsc> Start-DscConfiguration -Wait -Verbose -Path .\IISSetup -CimSession $cimsession
詳細: パラメーター ''methodName' = SendConfigurationApply,'className' =
MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration' を使用して操作
'CimMethod の呼び出し' を実行します。
詳細: コンピューター WIN-DFQF61T82AD、ユーザー SID S-1-5-21-3376612907-2284739138-3425852451-1001 から LCM
メソッドが呼び出されました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature'
が開始されました: Web-Server
詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature'
は成功しました: Web-Server
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[WindowsFeature]FeatureAdd] 0.3120 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ スキップ 設定 ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[Service]ServiceStart] 0.0160 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: [[Service]ServiceStart] サービス 'W3SVC' が開始されました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[Service]ServiceStart] 0.4060 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 指定されたファイルが見つかりません。
詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 関連するファイル/ディレクトリは
C:\inetpub\wwwroot\index.html です。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[File]FilePut] 0.0310 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 指定されたファイルが見つかりません。
詳細: [WIN-DFQF61T82AD]: [[File]FilePut] 関連するファイル/ディレクトリは
C:\inetpub\wwwroot\index.html です。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[File]FilePut] 0.0000 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] (0.9142 秒)。
詳細: 操作 'CimMethod の呼び出し' が完了しました。
詳細: 構成ジョブが完了するまでにかかった時間は 2.362 秒です

IISが導入されて、ファイル配置にも成功していますね。 dsc−client

冪等性確認とConfiguration更新

Configurationを更新して、再度Pushしてみましょう。サービスの起動設定とhtmlファイルだけ書き換えてみました。

PS C:\dsc> Configuration IISSetup
>> {
>>     Node dsc-client
>>     {
>>         WindowsFeature FeatureAdd
>>         {
>>             Ensure = "Present"
>>             Name = "Web-Server"
>>         }
>>
>>         Service ServiceStart
>>         {
>>             Name = "W3SVC"
>>             StartupType = "Automatic"
>>             State = "Running"
>>         }
>>
>>         File FilePut
>>         {
>>             Ensure = "Present"
>>             Type = "File"
>>             Contents = "<html><head><title>タイトル</title></head><body>こんにちは!さようなら!</body></html>"
>>             DestinationPath = "C:\inetpub\wwwroot\index.html"
>>         }
>>     }
>> }
>>

PS C:\dsc> IISSetup
ディレクトリ: C:\dsc\IISSetup
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2015/08/10 18:37 2464 dsc-client.mof

PS C:\dsc> Start-DscConfiguration -Wait -Verbose -Path .\IISSetup -CimSession $cimsession
詳細: パラメーター ''methodName' = SendConfigurationApply,'className' =
MSFT_DSCLocalConfigurationManager,'namespaceName' = root/Microsoft/Windows/DesiredStateConfiguration' を使用して操作
'CimMethod の呼び出し' を実行します。
詳細: コンピューター WIN-DFQF61T82AD、ユーザー SID S-1-5-21-3376612907-2284739138-3425852451-1001 から LCM
メソッドが呼び出されました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature'
が開始されました: Web-Server
詳細: [WIN-DFQF61T82AD]: [[WindowsFeature]FeatureAdd] 操作 'Get-WindowsFeature'
は成功しました: Web-Server
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[WindowsFeature]FeatureAdd] 0.2660 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ スキップ 設定 ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[WindowsFeature]FeatureAdd]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: [[Service]ServiceStart] サービス 'W3SVC' の開始の種類は 'Manual'
です。'Automatic' と一致しません。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[Service]ServiceStart] 0.0310 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: [[Service]ServiceStart] サービス 'W3SVC'
は既に開始されています。操作は必要ありません。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[Service]ServiceStart] 0.0630 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[Service]ServiceStart]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 リソース ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 テスト ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 テスト ] [[File]FilePut] 0.0000 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 開始 設定 ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] [[File]FilePut] 0.0000 秒かかりました。
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 リソース ] [[File]FilePut]
詳細: [WIN-DFQF61T82AD]: LCM: [ 終了 設定 ] (0.4606 秒)。
詳細: 操作 'CimMethod の呼び出し' が完了しました。
詳細: 構成ジョブが完了するまでにかかった時間は 2.195 秒です

変更があった箇所だけ更新されていますね。

dsc−client2

まとめ

DSCはChefやpuppetのWindows版のようなものだろうと考えていたのですが、Windowsに限らずもっと大きな枠組みを目指して設計されているものだそうです。PowerShell v5ではさらに機能拡張される予定とのことですので、今後にも期待したいですね。