tech.guitarrapc.cóm

Technical updates

PowerShell DSC Advent Calendar 2014 : Day 13 PUSH と PULL の切り替え と MOF構成

これは、アドベントカレンダー13日目の記事です。

https://www.adventar.org/calendars/579

PUSH飽きたのでPULLにしましょう。というのは冗談ですが、実際PUSHで伝えることは伝えたのでもうありません。次はPULLです。

LCM の切り替え

Local Configuration Manager (LCM)覚えてますか? 忘れた方は5日目へ。

https://tech.guitarrapc.com/entry/2014/12/05/221701

現在のモードの確認

Get-DscLocalConfigurationManagerをノードで実行した時に表示された、LCMのプロパティにGet-DscLocalConfigurationManagerがあります。ここがPUSHならPUSHモード。PULLならPULLです。

現在の流れでは、RefreshModeはPUSHになっているので、これをPULLに切り変えるのです。

AllowModuleOverWrite           : False
CertificateID                  :
ConfigurationDownloadManagers  : {}
ConfigurationID                :
ConfigurationMode              : ApplyAndMonitor
ConfigurationModeFrequencyMins : 30
Credential                     :
DebugMode                      : False
DownloadManagerCustomData      :
DownloadManagerName            :
LCMCompatibleVersions          : {1.0, 2.0}
LCMState                       : Ready
LCMVersion                     : 2.0
MaxPendingConfigRetryCount     :
StatusRetentionTimeInDays      : 7
PartialConfigurations          : {}
RebootNodeIfNeeded             : False
RefreshFrequencyMins           : 30
RefreshMode                    : PUSH
ReportManagers                 : {}
ResourceModuleManagers         : {}
PSComputerName                 :

PULLモードへの変更

さくっとLCMの構成を書きます。

https://gist.github.com/guitarrapc/a78948f06bf91030f2de

パラメータは、5日目のLCMで説明していますが、軽く振り返りましょう。

PULLモードの指定

いうまでもないですね。はい。

RefreshMode                    = "Pull"

DSC サーバーの指定

今回、PULLノードが参照するDSCサーバーを10.0.3.151とします。ここは別にDNS名でも構いません。が、まぁ今回はイメージしやすいようにIPを直に入れましょう。

ポートの8080は、DSC PULLサーバーを構成した時にデフォルトで生成される番号です。パスも同様です。

今回はHTTPSの証明書を用意するのが皆さんの手間と考えるのでAllowUnsecureConnectionAllowUnsecureConnectionにしていますが、ここをAllowUnsecureConnectionか省略することでAllowUnsecureConnection必須になります。本来はこっちにすべきです。

DownloadManagerCustomData      = @{
                ServerUrl                    = "https://10.0.3.151:8080/PSDSCPullServer/PSDSCPullServer.svc"
                AllowUnsecureConnection      = "true"
            }

ノードが参照するコンフィグレーションmofファイル

ノードがDSCノードに自分のあるべきMOFを問い合わせるために使うのが、ConfigurationIdです。

ConfigurationID                = "dc2edf66-8ad2-45dc-be37-39a8b8d2d25f"

これは単なるGUIDなので、適当にNewGuid()メソッドで生成するなり準備しておけばいいでしょう。

https://gist.github.com/guitarrapc/e229b95e21c2561ed7f9

私がサービス環境で利用しているモジュールでは、ロールごとにGuidをあらかじめEnumで用意して利用しています。

適用間隔

はい。15分に一度DSCサーバーに構成の更新がないか確認し、30分に1回自身の構成を確認します。

RefreshFrequencyMins           = 15
ConfigurationModeFrequencyMins = 30

この時、ConfigurationModeConfigurationModeになっているので、ノード自身の構成がDSCサーバーのあるべき状態と違っていたら自動的にあるべき状態に収束します。

ConfigurationMode              = "ApplyAndAutoCorrect"

LCMの構成

LCMの構成を書けたので自分に適用します。Set-DscLocalConfigurationManager CmdletでさくっとMOFを適用します。

https://gist.github.com/guitarrapc/a5abc43fb59acf205812

あとは、Windows Management Infrastructure*1 サービスを再起動してください。めんどくさいならノードの再起動でもいいです。なぜか海外の記事ではノードの再起動といっていていつも不思議ですね。

https://gist.github.com/guitarrapc/0ea326ce89b7fd18be60

ちなみに、Configurationの実行で生成されるmeta.mofはこんな感じです。

https://gist.github.com/guitarrapc/c333a563e78e7206c7bf

リモートマシンへの適用

これもGet-DscConfigurationGet-DscConfiguration同様にGet-DscConfigurationを受け入れるので、リモートマシンにはCimSession経由で設定可能です。

ちなみに私はサービス環境ではvalentiaを使っています。

meta.mof のファイル名とCimSessionで指定したコンピュータ名は一致する必要がある

mofファイル名はlocalhostをNodeブロックに指定して生成したのでlocalhost.meta.mofですね。このmofファイル名とCimSessionで適用する時に指定した名前は一致する必要があるので注意です。

たとえば、localhost.meta.moflocalhost.meta.mofで生成したlocalhost.meta.mofを利用してlocalhost.meta.mofにしてもエラーが出るということです。

どうすればいいのか? というと、Node名にCimSessionで指定予定の名前を入れればいいのです。

https://gist.github.com/guitarrapc/d22d5c49055ca70c1e15

めんどくさいでしょ? valentiaを使えば、常にlocalhostを指定するだけなのでこういった制約は透過されます。サービスのリスタートも含めてまとめて書けますし、Linuxへの適用がGAになるまではvalentia使うのが楽なのは事実です。

MOF 構成

さて、ここまでMOFといってきましたが、どこにこの構成が保持されるのでしょうか?

MOFが維持されるパスは以下の通りです。

C:\Windows\System32\Configuration

image

LCM のmof

LCMのmofは、MetaConfig.mofとして維持されます。

つまりこのMofこそがLCMが参照している本体なのですね。

Configurationのmof

Configurationのmofは、いくつかの世代を持ちます。

世代 ファイル名
現在のコンフィグレーション Current.mof
直前のコンフィグレーション Previous.mof と backup.mof

v5では、これに加えてPending.mofが追加予定です。これによりmof絡みの問題が回避できるのですがいずれそれは別の機会に。

Mof のリセット

PowerShell 4.0のDSCには、いくつか致命的なMofの異常状況に陥ることがあり、その際にMofをリセットする必要に迫られます。

ではどうやるのか? このMofファイルを消すわけです。具体的には、

現在のあるべき状態を消したい時

以下の3つを消します。

  • backup.mof
  • Current.mof
  • Previous.mof
  • Pending.mof*2

LCMの状態をSet-DscLocalConfigurationManagerを使わずにリセットしたい時

  • MetaConfig.mof

v5の最新November Previewではこの問題が解決されているので、必要となるシーンはほぼありませんが、知っておいても損はないでしょう。

まとめ

PUSHからPULLへの変更できましたか? 結構大事です。こういう基本はきっちり抑えておきたいところです。

*1:winmgmt

*2:v5のみ