こんにちは。インフラの自動化という荒野を旅するエンジニアの皆さん。
今日は、Windowsサーバー管理という「自動化の聖杯」に挑む皆さんのために、PuppetとPowerShellを掛け合わせた最強の布陣についてお話しします。
多くのエンジニアが「PuppetでWindowsを管理しよう」として挫折し、結局「手動でPowerShellを叩く」という泥沼に陥ります。しかし、それはPuppetの「宣言的記述」とPowerShellの「命令的パワー」の役割分担を理解していないだけです。
この知見を身につければ、数千台のWindowsサーバーであっても、あなたの書いた一行のコードがサーバーの運命を決定するようになります。さあ、深淵を覗きに行きましょう。
—
1. なぜWindowsでPuppetを使うのか?(そしてなぜ苦しむのか)
Puppetの本質は「あるべき状態(Desired State)」を定義することです。「このサービスは起動しているべき」「このファイルは存在するべき」。
しかし、Windowsの世界は複雑です。レジストリ、COMオブジェクト、WMI、Active Directory……これらは「ファイル」や「パッケージ」といった単純なリソースでは表現しきれません。ここでPuppet単体に固執すると、地獄を見ます。
「Puppetはオーケストレーター、PowerShellは現場の実行部隊」と割り切るのが、極限自動化への第一歩です。
2. 環境構築:まずは「触れる」ところから
まずはPuppet AgentをWindowsにインストールしましょう。
(※ここではPDK(Puppet Development Kit)がインストール済みである前提で進めます)
1. [Puppet公式](https://www.puppet.com/try-puppet)からMSIインストーラーをダウンロード。
2. インストール後、コマンドプロンプトで以下を確認。
puppet –version
バージョンが返ってくれば、あなたの戦場は整いました
3. ハマりどころを避ける:Execリソースの「魂」
Puppetには `exec` という万能リソースがありますが、これを単にコマンドを叩く道具として使うのは素人です。「冪等性(べきとうせい)」を担保しなければ、自動化は「破壊活動」に変わります。
ベストプラクティス:冪等性を担保する `onlyif` / `unless`
PowerShellをキックする際、必ず「実行する必要がある時だけ実行する」条件を付与してください。
Active Directoryの機能が未インストールの場合のみインストールする例
exec { ‘Install-AD-DS’:
command => ‘Install-WindowsFeature -Name AD-Domain-Services’,
provider => powershell, # これが重要!
# 以下のコマンドが「正常終了(0)」を返さない場合のみ実行される
unless => ‘if (Get-WindowsFeature -Name AD-Domain-Services).Installed { exit 0 } else { exit 1 }’,
logoutput => true,
}
- `provider => powershell`: これを指定することで、Puppetは内部的にPowerShellセッションを正しくハンドリングし、文字コード問題や実行ポリシーの壁を越えます。
- `unless`: ここが自動化の知能指数です。このスクリプトが「完了しているか」を常に確認させることで、何度実行しても環境が汚染されない(冪等な)状態を保ちます。
4. 実践:AD環境下での「極限自動化」
例えば、新しく参加したサーバーのDNS設定を強制的に社内ADサーバーに向ける処理。これもPuppetで管理します。
DNS設定を強制するPowerShellを実行
exec { ‘Set-Primary-DNS’:
command => ‘$nic = Get-NetAdapter | Where-Object Status -eq Up; Set-DnsClientServerAddress -InterfaceAlias $nic.Name -ServerAddresses (“192.168.1.10”)’,
provider => powershell,
# 既に設定済みなら実行しない(判断基準をDNSの戻り値にする)
unless => ‘if ((Get-DnsClientServerAddress).ServerAddresses -contains “192.168.1.10”) { exit 0 } else { exit 1 }’,
}
5. 今日から始める「賢い自動化」の作法
最後に、現場で生き残るための3つの鉄則を授けます。
1. 「PowerShellをPuppetのmanifestの中に直書きしない」: スクリプトが長くなったら、Puppetの `files/` ディレクトリに `.ps1` ファイルとして配置し、`file` リソースで配布してから `exec` で実行してください。
2. エラーハンドリングを標準化する: `exit 0` で成功、それ以外は失敗。この単純なルールを徹底するだけで、インフラの信頼性は格段に向上します。
3. 「冪等性」を疑え: 「このコードを100回連続で実行しても、サーバーの状態は変わらないか?」を常に自分に問いかけてください。
—
最後に:自動化は「愛」です
インフラ自動化は、単なる手抜きではありません。手作業によるヒューマンエラーという「苦痛」から、自分自身と仲間を解放するための、愛ある設計です。
PuppetとPowerShellという強力な武器を手に、ぜひ皆さんの環境を「触らずとも完璧に動くサーバー群」へと進化させてください。
もし行き詰まったら、いつでも戻ってきてください。また次の深淵の攻略法を伝授します。それでは、素晴らしい自動化ライフを!