これは、アドベントカレンダー12日目の記事です。
時空の歪みが観測できてます?
今日は対象ノードをあるべき状態に収束させたことを確認してみましょう。
ノードに適用されたコンフィグレーションを確認する
まずは、ノード自身がどんなコンフィグレーションを適用されたのか確認してみましょう。
Get-DscConfiguration
PowerShell DSCには、現在ノードに適用されたコンフィグレーションに対して、ノードが現在どのような状態なのか確認するための専用Cmdletがあります。
コンフィグレーションを適用したノード上で実行してみた結果です。
現在のノードの状態が取得できました。
ではサービスを停止してみると?
適用したコンフィグレーションについて、サービスが停止した現在のノード状態が取得できていますね。
こうして、コンフィグレーションの適用状態を取得するために使うのが、Get-DscConfiguration Cmdletです。
リモートノードの確認
CimSessionの利用
このCmdletには-CimSessionパラメータがあるので、対象ノードへのCimSessionを生成しておけばリモート上のノードに対して実行することもできます。
valentiaの利用
しかし、リモートに向けて一々cimSessionをラップするのはあれなのでvalentiaを使うと認証周りも含めてローカルで実行しているのと同様に扱えます。
実際運用している実環境では、valentiaがデフォルトで入っているためvalentiaで各種DSC Cmdletをラップしたモジュールを使っています。
CIMではなくvalentia経由の実行にすることで、「認証周り」や「非同期処理」を意識することなくローカルでの実行をスクリプトブロック{}で括るだけでまったく同じ挙動をするようにしています。Linux向けのDSCがGAされるまではCIMの真価は薄いため、コストがかからず高速に動作するため重宝しています。
ノードがあるべき状態か確認する
ノードの現在のコンフィグレーションが取得できることはわかりました。しかし状態を一々確認するのはだるいため、現在ノードがコンフィグレーションで指示した状態なのかどうかbooleanで端的に欲しくなります。
| 返戻値 | 状態 |
|---|---|
$true |
現在あるべき状態である |
$false |
現在あるべき状態でない |
このために利用するのが、Test-DscConfiguration Cmdletです。
早速実行してみましょう。
コンフィグレーション実行直後に実行すると結果は、trueです。

サービスを片方停止させるとfalseにかわりました。

どうでしょうか? わかりやすいですね。
リモートノードへの実行
Get-DscConfiguraitionと同じでGet-DscConfiguraitionが使えます。
しかし本番環境では、valentiaでラップしてより使いやすくしています。標準より数倍楽なのでいいですね。
問題点
さて、Test-DscConfigurationですが、問題点があります。
- 複数ノードに実行した時にどのノードがtrue/falseかわからない
- falseの時にどのコンフィグレーションが問題なのかわからない
対策を見てみましょう。
複数ノードに実行した時にどのノードがtrue/falseかわからない
私は現状valentiaを使っているのでこの問題は自然と解決しています。valentiaでは、対象ノードごとの状態を示してくれるためです。
通常利用している人にとっては、厄介ですね。結果をforeachでまわして加工するのが妥当でしょうか?
DSC側での改善が待たれる機能となっています。
falseの時にどのコンフィグレーションが問題なのかわからない
最も厄介なのはこれです。
対策は単純で、2つあります。
- テストを書く
- 2本木探索
テストを書く
ツールとしては、serverspecやpesterがあります。現状DSCを利用する仲間の間ではPesterが主流です。
現状、私もPesterを使っています。通常のPowerShellスクリプトに書くテストと同様にサーバー状態をテストできるので重宝します。
二本木探索
複数のコンフィグレーションに分岐している時に有効です。
この場合、コンフィグレーションをコメントアウトしつつ探索すればくぎれるためです。が、初めからテストを書いていればいい話なので手法の問題であるのも事実です。
さくっと調べるならいいでしょう。
まとめ
テスト大事。完結させるので待っててね?