PowerShell DSCを調べてみる

## PowerShell DSC(Desired State Configuration)とは

Windowsで標準で入ってるPowershellを使った構成管理ツール。Ansibleとかその辺みたいなやつ。
普通のPowerShellは命令型で書いていくが、PowerShell DSCは宣言型の構文になっていて当然ながら冪等性を担保できるような作りになっている（はず）。
OSSで、Microsoftが提供しているモジュールも、コミュニティによって作られたモジュールもある。
Microsoftが提供してるモジュールは

- Archive 
　　zipファイルを展開するモジュール
- Environment
　　環境変数を操作するモジュール
- File
　　File操作をするモジュール
- Group
　　ローカルグループを操作するモジュール
- Log
　　Log出力を行うモジュール
- package
　　Windows Installerやsetup.exeなどのパッケージを管理するモジュール
- Registry
　　レジストリを操作するモジュール
- Script
　　Powershellスクリプトを実行するモジュール
- Service
　　サービスを操作するモジュール
- User
　　ユーザを操作するモジュール
- Windows Feature
　　windowsの機能を管理するモジュール
- Windows Process
　　プロセスを操作するモジュール

などがある。

管理対象はWindowsだけではなくLinuxも対象。
PowershellがLinuxでも使えるようになったからかと思いきや、それ以前から使えたらしい。
現在はLinux用モジュールも提供されてる模様（[この辺](https://docs.microsoft.com/ja-jp/powershell/dsc/reference/resources/linux/lnxarchiveresource?view=dsc-1.1)）
<del>Microsoftが提供してるモジュールはxで始まる名前になっており、コミュニティのモジュールはcで始まる名前になってるとのこと。ドキュメントを見る限りLinux用の公式モジュールはnxで始まるっぽい。</del>
参考にしてた情報が古かった。Linuxのがnxなのはあってそうだが、xで始まる公式モジュールはおそらくもう更新されてなくて、最新のは[DSC Community](https://dsccommunity.org/resources/)に移ってるっぽい。
モジュールは[Powershell Gallery](https://docs.microsoft.com/ja-jp/powershell/dsc/reference/resources/linux/lnxarchiveresource?view=dsc-1.1)や、

```powershell
Find-Module -Name hoge
```

みたいな感じで探せる。さらにインストールまでする場合には

```
Install-Module -Name xActiveDirectory
```

なお、オフラインインストールをしたい場合には`Save-Module`を使う。

## Powershell DSCの構成要素

Powrshell DSCは4つの要素？で構成されているらしい。

1. Configuration
1. Configuration Data
1. Management Object Format Files (MOF)
1. Local Configuration Manager (LCM)

### Configuration
実際に構成要素を書いていく中身。↓のように書いていく
こちらはServerAにあるtmpフォルダが`C:¥tmp` に配置されてる状態を定義している。

```
configuration MyDSCConfiguraion{
    File DirectoryCopy{
        Ensure = "Present"
        Type =  "Directory"
        SourcePath = "\\ServerA\tmp"
        DestinationPath = "C:\tmp"
    }
}
```

### ConfigurationData
Configurationをどのサーバに適用するかを定義するハッシュテーブル。
こんな感じで書く。

```
@{
    AllNodes = @(
        @{
            NodeName ='Server1'
        }
        @{
            NodeName = 'Server2'
        }
    )
}
```
### Management Object Format Files (MOF)
configurationファイルをコンパイルした結果生成されるファイル。
これを管理対象のサーバに配布して実行させることで構成管理を実現する。

### Local Configuration Manager(LCM)
各管理対象サーバでMOFファイルを実行するやつ。
単に実行するだけでなく、どういうタイミングでどう実行するかもここで管理している。
例えば、後述するPull/Pushのどちらで動くか、更新頻度はどうするか、再起動が必要となった場合にどう対応するか、などなど。
要は構成管理を実行するエージェントか。

（powershell 7からはLCMを使ってないらしいが、、まあ何かしらエージェントが動いてるのだろう。エージェントレスではないと思う、たぶん）

## Powershecll DSCの動きかた
Powershell DSCは、

- DSC管理サーバ
- ターゲットサーバ（管理対象サーバ）
 
の２種類で構成される。
そして、以下の2種類のモードで動作する。

- Push
- Pull

### Pushモード
DSC管理サーバがConfigurationをコンパイル、MOFを生成して管理対象サーバに送り付けるモード。
各管理対象サーバのLCMが、受信したMOFをもとに構成の変更などを行う。
構成の変更を特定のサーバにスポットで実行したい場合に使う。
デフォルトの動きはこちらになる。

### Pullモード
DSC管理サーバがConfigurationをコンパイル、MOFを生成するまではPushと同じだが、
各管理対象サーバからDSC管理サーバにMOFファイルを要求する。
構成情報に差分があったらMOFをダウンロードするのか、MOFをダウンロードして差分を見るのかはよくわからないが、とにかくDSC管理サーバにある構成情報と自身（管理対象サーバ）の構成情報との差異が出たら自動的に適用する。
この場合にはDSC管理サーバもPull用に構成が必要らしい。
なお、WindowsサーバにPull型のDSC管理機能をインストールすることは可能だが、2022/02/18時点では今後特にUpdateなどを適用する予定はないとのこと。AzureのAutomation DSC機能を使うことを推奨している。（[こちら参照](https://docs.microsoft.com/en-us/powershell/dsc/pull-server/pullserver?view=dsc-1.1)）
自分もAzure Automationを使用している。



まずはいったんここまで。
というかDSC CommunityのFAQとか見る限り、いろいろ情報が古そうだな。。