PowershellDSCで始めるWindows構成管理のコード化(初期導入)

はじめまして。GMOインターネットグループ株式会社でWindows系インフラを担当している中島です。

長年に渡りWindowsServerの運用に携わっていますが、IaCには関心は有りつつもなかなか時間が取れず、悶々とした日々を過ごしていましたが、ようやく着手するに至りましたので備忘録も兼ねて簡単ですがこちらで紹介させて頂きます。

はじめに

Infrastructure as Code(以後IaCと記載)といえば最近ではTerraformやAnsible等が代表的かつ導入事例も多いと感じますが、私は日頃WindowsServerを中心としたインフラ管理がメインの為、Windowsに標準搭載のPowershellを利用できれば導入コストも抑えつつWindowsとの親和性も気にせず利用できる点から、今回はPowershellDesired State Configuration(DSC)をご紹介したいと思います。
尚、私も今まさにPowershellDSCで構成管理をコード化している真っ最中なので、
まずは簡単な「動かせる環境の作成」までをご紹介します。

IaCの必要性

今更語るような事でも有りませんが、IaCの必要性は規模に関係なく適用する先の環境(OS)設定において冪等性(何度繰り返しても同じ結果を得られる事)の担保ができる点かと思います。これにより、設定の漏れや差異が無くせる点だけでなく、手動と比べてゼロから構築する手間も省けるため工数削減にも非常に有効です。
PowershellDSCでの冪等性は、「定義された構成とノードの状態を一致させる」ことを保証するものであり、「定義されていない要素を削除する」ことを保証するものでは無い点は注意が必要かと思います。

PowershellDSCの実装手順

PowershellDSCの種類

DSCは大きく分けてプッシュモードとプルモードの2つがあり、本稿ではプッシュモードでの実装手順となります。※モードの違いについてはMicrosoftLearnよりご確認ください。

今回のゴール

今回は、用意したターゲットノードにWebサーバーの機能(IIS)を構成ドキュメントから導入するまでをゴールとして設定します。

今回の環境概要

  • 環境は「DSCサーバー」と構成定義を適用する「PUSH-NODE」「PUSH-NODE02」の3台で構成。
  • OSはいずれもWindowsServer2022を利用します。
  • Powershellのバージョンは5.1(DSCのverは2.x)

DSCサーバーにPowershellモジュールのインストール

以下コマンドをDSCサーバー上で管理者モード実行し、モジュールを導入します。

#モジュールインストール
>install-Module 'PSDscResources' -Verbose

#確認
> Get-InstalledModule

Version Name Repository Description
------- ---- ---------- -----------
2.12.0.0 PSDscResources PSGallery This module contains the standard DSC resources….

構成の定義~構成ドキュメントの作成

以下の様に構成を定義し、.ps1ファイルとして任意の場所に保存します。
構成定義で設定されたリソースは、ノードに適用するものとなりこの情報を基に一貫性が保たれます。
今回は「D:\DSC\configuration」というディレクトリに配置します。
ps1は”ServerConfig.ps1”として保存。

configuration ServerConfig {
   param
   (
      [string[]]$ComputerName=@('Your TargetComputerName or IPADDRESS')
   )
   Import-DscResource –ModuleName 'PSDesiredStateConfiguration'
   Node $ComputerName
   {
    WindowsFeature IIS {
      Ensure = "Present"
      Name = "Web-Server"
    }
File WebContent {
      Ensure = "Present"
      Type = "Directory"
      DestinationPath = "C:\inetpub\wwwroot\TESTWebsite"
    } 
Service W3SVC {
      Name = "W3SVC"
      State = "Running"
      DependsOn = "[WindowsFeature]IIS"
      }
   }
}
ServerConfig

続いて、作成した.ps1ファイルを実行して構成ドキュメント(mof)ファイルを作成します。

> D:\DSC\configuration\ServerConfig.ps1

ディレクトリ: D:\DSC\configuration\ServerConfig

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/10/10 11:42 3560 YourTargetComputerName.mof
-a---- 2024/10/10 11:42 3560 YourTargetComputerName2.mof
※今回の検証では2台に構成を適用するため2台分作成されています。

ターゲットノードへの構成の適用

作成した構成ファイルを元に、プッシュ先のノードへ構成を適用します。

#構成ドキュメントをターゲットノードへ適用
> Start-DscConfiguration -Path D:\DSC\configuration\ServerConfig -Verbose -wait

冪等性が保たれるか、複数回実行して結果が同じであるかを検証したいと思います。
今回は、2台のノードにそれぞれ構成を適用し、同じ結果になっているかを確認します。
上記コマンドで各ノードへ構成を適用します。

実行中..
実行完了

各ノードで完了後のステータスを取得します。ここでは、正常に構成が適用された事が確認できます。

ノード1
ノード2

念の為、適用したノードコンピューター側のロールを見てみます。(1台のノードのキャプチャのみ)

Before
After

これで、DSCサーバーからターゲットノードへの構成が適用され、構成定義したリソース(IIS)が定義通りに導入された事が確認できました。

2回目の構成適用

再び「Start-DscConfiguration」を実行し、各ノードへ構成を適用してみます。
リソースのテストが行われ、最後に構成された構成定義の内容と差分が無いため、「何もする必要はありません」とのメッセージで終了します。

続いて、各ノードで「Test-DscConfiguration」コマンドレットを用いてノード上の構成が必要な構成と一致するかどうかのテストを行ってみます。

ノード1
ノード2

いずれのノードも結果に「True」が返され、定義された構成と不一致が無いことが示されました。
更に、先程と同様に各ノードの完了後のステータスを確認してみます。

ノード1
ノード2

先ほどと少し違いTypeが「Consistency-一貫性」が加わり、定義されている構成との一貫性が保たれているステータスが示されており、2回目の構成適用でも構成定義と同じものが適用されている事が確認でき、これにより「何度繰り返しても同じ結果になる事を担保する」という冪等性の一面を確認することができました。

今回はテスト的に1つの役割を導入するだけだったので約1分弱で完了しましたが、構成定義のボリューム次第ではそれなりの時間がかかるのと、導入時にエラーなども発生する可能性もありますので、構成定義はトライアンドエラーをしつつ仕上げていくイメージかと思います。
また、構成定義を作るにはそれなりの時間がかかる事が難点ではありますが、一度できてしまえばその後の時間短縮と冪等性の担保が可能になりますので、理想とする構成定義を目指して頂ければと思います。

構成ファイルの定義に生成AIを活用

折角なので、実際に構成定義を生成AIに作成してもらいました。
精度はまだ人が確認する必要がありますが、何度かプロンプト生成を行えばより精度が高いレベルで生成可能ですので、ぜひお試しください。
※回答はそのまま転記していますので、事実とは異なることが書かれている可能性はご留意ください。

プロンプト

あなたは、WindowsのPowershellに非常に精通した超高性能なAIです。
PowershellDSCで利用する構成定義を{要件}に基づいてアウトプットしてください。
なお、アウトプットされた内容が、Microsoftのリファレンスなどに一切記載がないものは虚偽記載と認められ違反となるため、絶対に行わないでください。
できない場合はできないと回答してください。

また、構成するうえで追加パラメーターがある場合は、教えて下さい。その場で答えるので、それを追加パラメーターとして含めてください。

{要件}
・必要なロール:IIS
・必要なロールName:
Web-Server
Web-WebServer
Web-Common-Http
Web-Http-Errors
Web-Dir-Browsing
Web-Default-Doc
Web-Static-Content
Web-Http-Redirect
Web-Security
Web-Filtering
Web-IP-Security
Web-Windows-Auth
Web-Basic-Auth
Web-Performance
Web-Stat-Compression
Web-Health
Web-Http-Logging
Web-ODBC-Logging
Web-Custom-Logging
Web-Http-Tracing
Web-Log-Libraries
Web-Request-Monitor
Web-App-Dev
Web-Net-Ext45
Web-AppInit
Web-Asp-Net45
Web-ISAPI-Filter
Web-ISAPI-Ext
Web-Mgmt-Tools
Web-Mgmt-Console
Web-Mgmt-Service

{構成定義サンプル}
configuration ServerConfig {
    param
    (
        [string[]]$ComputerName='TargetComputerNodeName'
    )
        Import-DscResource –ModuleName 'PSDesiredStateConfiguration'
    Node $ComputerName
    {
        WindowsFeature IIS {
            Ensure = "Present"
            Name = "Web-Server"
        }

        File WebContent {
            Ensure = "Present"
            Type = "Directory"
            DestinationPath = "C:\inetpub\wwwroot\TESTWebsite"
        }

        Service W3SVC {
            Name = "W3SVC"
            State = "Running"
            DependsOn = "[WindowsFeature]IIS"
        }
    }
}
ServerConfig

今回はこのプロンプトで3つの生成AI(GPT-4o、Claude3.5 Sonnet、Gemini1.5 Pro)を天秤AIを利用して生成してみました。その中でも、Claude3.5 Sonnetの回答を参考までに記載します。

回答

ご要件に基づいて、PowerShell DSCの構成定義を作成いたします。以下の構成定義は、指定されたIISの機能をインストールするものです。

configuration IISServerConfig {
    param
    (
        [string[]]$ComputerName='localhost'
    )

    Import-DscResource –ModuleName 'PSDesiredStateConfiguration'

    Node $ComputerName
    {
        # Install IIS role
        WindowsFeature IIS {
            Ensure = "Present"
            Name = "Web-Server"
        }

        # Install required IIS features
        $features = @(
            "Web-WebServer",
            "Web-Common-Http",
            "Web-Http-Errors",
            "Web-Dir-Browsing",
            "Web-Default-Doc",
            "Web-Static-Content",
            "Web-Http-Redirect",
            "Web-Security",
            "Web-Filtering",
            "Web-IP-Security",
            "Web-Windows-Auth",
            "Web-Basic-Auth",
            "Web-Performance",
            "Web-Stat-Compression",
            "Web-Health",
            "Web-Http-Logging",
            "Web-ODBC-Logging",
            "Web-Custom-Logging",
            "Web-Http-Tracing",
            "Web-Log-Libraries",
            "Web-Request-Monitor",
            "Web-App-Dev",
            "Web-Net-Ext45",
            "Web-AppInit",
            "Web-Asp-Net45",
            "Web-ISAPI-Filter",
            "Web-ISAPI-Ext",
            "Web-Mgmt-Tools",
            "Web-Mgmt-Console",
            "Web-Mgmt-Service"
        )

        foreach ($feature in $features) {
            WindowsFeature $feature {
                Ensure = "Present"
                Name = $feature
                DependsOn = "[WindowsFeature]IIS"
            }
        }

        # Ensure IIS service is running
        Service W3SVC {
            Name = "W3SVC"
            State = "Running"
            DependsOn = "[WindowsFeature]IIS"
        }
    }
}

IISServerConfig

この構成定義では以下のことを行っています:

  • IIS役割(Web-Server)をインストールします。
  • 要件に記載されたすべてのIIS機能をインストールします。
  • IISサービス(W3SVC)が実行中であることを確認します。

追加のパラメータについて:

  • $ComputerName: ターゲットコンピュータの名前またはIPアドレスを指定できます。デフォルトは’localhost’です。
    この構成定義を使用する際は、以下のように実行できます:
IISServerConfig -ComputerName "TargetServerName"

または、ローカルマシンに適用する場合は単に:

IISServerConfig

注意:この構成はIISの基本的なインストールと設定を行いますが、特定のウェブサイトの設定やアプリケーションプールの設定などは含まれていません。それらが必要な場合は、追加の設定を行う必要があります。

まとめ

本稿では、物理・仮想問わずWindowsServerを管理しているけど、まだIaCの仕組みを取り入れた事がない方向けに少しでも役に立てればと思い「導入編」的な位置付けで掲載させて頂きました。
今後機会があれば、より詳しい使い方や、パッケージマネージャーと組み合わせた事例などを紹介できればと妄想しています。(私もまだまだ勉強中なので)
また、生成AIがより身近になったことで、今まで時間をかけて調べていた事でも瞬時に解決することができる世の中になってきましたので、まだ生成AIに触れる機会が少ない方も是非天秤AIを活用して頂き触れてみて頂いてAIが少しでも身近な存在になる事を願っています。

ブログの著者欄

中島 賢治

GMOインターネットグループ株式会社

入社以来、Windowsインフラを中心にバックオフィス系のシステム管理を経て、現在はWindows系のサービス側のインフラに携わっています。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック