次の方法で共有


IIS: 迅速かつ簡単に Web サーバーをインストールする

Windows PowerShell を使用すると、迅速かつ簡単に Web サーバーをインストールできます。

Jason Helmick

IIS をインストールする回数を考えてみてください。それほど多くありませんか。それは本当ですか。IIS が前提要件ソフトウェアになっている Exchange Server や SharePoint などのプラットフォーム、Web ファームの展開、テスト環境、および開発環境についても考えてみてください。皆さんは、ご自分が考えているよりも多くの時間を IIS のインストールに費やしている可能性があります。

それから、障害復旧の自動化についても考えてみてください。Web ファームを数分でオンライン状態に復旧することはできますか。Web サイトと一緒に IIS をインストールして構成するのは、単純な作業ですが、サーバーの台数が多い場合は、時間がかかる退屈な作業になります。

サーバーのセットアップに週末を費やすことを望む人はいないでしょう。平日の 9:00 ~ 17:00 の間に Web ファームや Web サイトなど、Web に関連するすべてのものを管理できるのが望ましいでしょう。ご自分の任務は、できるだけ迅速に進めて自動化することをお勧めします。

このステップ バイ ステップ ガイドでは、約 4 分で、IIS と既定の Web サイトを多数のサーバーに一括でインストールする方法を紹介します。この処理は、GUI ベースのサーバー マネージャー ツールや IIS マネージャーでは行えません。実際、GUI は、この問題の一端を担っています。この魔法のような処理を行うには、Windows PowerShell を使用します (注: このコラムの情報は、IIS 7.5 と IIS 8 に適用されます)。

Windows PowerShell Remoting

まず、サーバーで Windows PowerShell Remoting が有効になっているかどうかを確認してください。有効になっていない場合は、有効にします。これが有効になっていないと、この処理は実行できません。IIS を迅速かつ簡単に展開する手順について説明する前に、Windows PowerShell Remoting が有効になっていない方のために、この機能を有効にする方法を説明しましょう。

これを行う方法は 2 つあります。この処理をテスト環境で実行する場合は、1 つ目の手順が簡単です。Windows PowerShell では、Windows PowerShell Remoting およびスクリプト実行という 2 つの機能を有効にする必要があります。1 つ目の方法では、管理対象となるサーバーがある場所まで行く必要があります。リモート デスクトップ プロトコル (RDP) またはリムーバブル メディアを使用して、2 つのコマンドを実行します。

1. 管理者として Windows PowerShell コンソールを起動します。Enable-PSRemoting コマンドレットを使用して、各サーバーで次のコマンドを実行して、Windows PowerShell Remoting を有効にします。

PS> Enable-PSRemoting -Force

2. Windows PowerShell Remoting を有効にしたサーバーに格納されているコマンドレットの追加モジュールを使用することができます。これらのモジュールを後で使用するには、スクリプトを実行できる必要がありますが、Windows PowerShell の既定の設定では、スクリプトの実行が許可されていません。ですから、次のコマンドを実行して、この設定を変更しましょう。

PS> Set-ExecutionPolicy RemoteSigned –Force

これで、IIS サーバーを展開して管理する準備ができました。数百台ものサーバーを管理する場合は、この変更を行うグループ ポリシーを発行することをお勧めします。管理するサーバーがある場所まで行くことは、時間の無駄でしかないので、グループ ポリシー オブジェクト (GPO) を使用して、Windows PowerShell Remoting を有効にする手順を紹介しましょう。

  1. [リスナーの自動構成を許可する] を有効にして、[IPv4 フィルター] ボックスと [IPv6 フィルター] ボックスに「*」を設定します。この設定は、[コンピューターの構成]、[管理用テンプレート]、[Windows コンポーネント]、[Windows リモート管理]、[WinRM サービス] を順に展開したところにあります。
  2. [スクリプトの実行を有効にする] でスクリプトの実行を有効にし、[署名済みスクリプトのみ許可する] または [ローカル スクリプトとリモートの署名済みスクリプトを許可する] を設定します。この設定は、[コンピューターの構成]、[管理用テンプレート]、[Windows コンポーネント]、[Windows PowerShell] を順に展開したところにあります。
  3. [コンピューターの構成]、[Windows の設定]、[セキュリティの設定]、[システム サービス] を順にクリックして、Windows リモート管理 (WinRM) サービスが自動的に開始されるように設定します。

これらのコンピューターで Windows ファイアウォールを実行している場合、WinRM では、ポート 5985 をリッスンするので受信規則が必要になります。この設定は、[コンピューターの構成]、[Windows の設定]、[セキュリティが強化された Windows ファイアウォール] を順に展開したところにあります。

Web サーバーを展開する

ここからが楽しいところです。いくつかの Windows PowerShell コマンドを実行するだけで、魔法のような処理を行えるので、作業は比較的簡単です。

1. 展開対象となる全サーバー名を変数に格納します。メモ帳でサーバー名の一覧を作成し、Windows PowerShell で次のコマンドを実行して、サーバー名の一覧を読み取ることも可能です。

PS> $servers= get-content c:\servers.txt

特に展開対象となるサーバーの台数が多い場合、メモ帳でサーバー名の一覧を作成するのは、少し面倒な作業になります。この作業には、Windows PowerShell を使用することをお勧めします。Active Directory のコマンドレットを使用して、コンピューター名の一覧を取得できることは、ご存じですか。Active Directory のコマンドレットを使用するには、Active Directory 用のリモート サーバー管理ツールがインストールされている必要があります。Windows PowerShell で暗黙的にリモート処理を行う秘策をご存じの場合は、コマンドレットをローカルにインストールすることなく、コマンドレットを使用できます。RSAT をインストールしたら、まず、次のコマンドを実行して、Active Directory に関連するコマンドレットのモジュールをインポートします。

PS> Import-Module ActiveDirectory

モジュールをインポートしたら、Get-ADComputer コマンドレットを使用して、指定の条件に一致するコンピューター名の一覧を取得できます。この例では、IIS を展開するコンピューターの名前は、すべて Web で始まっています。Get-ADComputer コマンドレットにフィルター条件を指定して、Web という単語で名前が始まるコンピューターのみを検出し、その結果を Select-Object コマンドレットにパイプ処理して、IIS を展開するコンピューター名のみを取得します。

PS> $servers= Get-ADComputer -filter 'name -like "web*"' | Select-Object -ExpandProperty name

2. ここで、Windows PowerShell Remoting の処理能力を活用して、一般的に時間がかかる退屈な作業を簡単に行えるようにします。では、IIS を展開しましょう。まず、次のコマンドを実行して、コンピューター名を収集した全サーバーでセッションを確立します。

PS> $session=New-PSSession -ComputerName $servers

3. 次に、リモート コンピューターに ServerManager モジュールをインポートします。このモジュールには、サーバーの役割や機能のインストールと削除を行うコマンドレットが含まれています。ここでは、Invoke-Command コマンドレットで、先ほど作成したセッションを指定するパラメーターを使用しています。興味深いのは、すべてのサーバーが、スクリプト ブロック { } 内の命令を瞬時に受け取ることです。

PS> Invoke-Command -Session $session {Import-module ServerManager}

次の手順は、必須ではなく、リモート コンピューターに IIS がインストールされているかどうかを確認するためのものです。次のように Get-WindowsFeature コマンドレットを使用すると、この処理を簡単に行えます。

PS> invoke-command -Session $session {Get-WindowsFeature web-server} | format-table -AutoSize

IIS を展開するコマンドの実行を始める前に、IIS のインストールについて少し説明しましょう。IIS の既定のインストールでは、静的な Web ページのみを許可する設定になっています。セキュリティの観点では、これは優れた設定ですが、多くの場合、アプリケーションのニーズによって追加のコンポーネントが必要になります。

GUI を使用してインストールを実行しているときには、コンポーネントが一覧表示されるので、その隣にあるチェック ボックスをオンにしてコンポーネントを追加できます。Windows PowerShell を使用してインストールを実行しているときには、追加するコンポーネントをリモート コンピューターに明示的に指定する必要があります。たとえば、Windows Server 2008 R2 または Windows 8 では、Get-WindowsFeature コマンドレットを使用して、利用可能な IIS 関連のすべてのコンポーネントの一覧を表示できます (このコマンドレットを使用するには、ServerManager モジュールがインポートされている必要があります)。

PS> Get-WindowFeature *web*

コンポーネント名を特定したら、Add-WindowsFeature コマンドレットを使用して、コンポーネントをインストールできます。まず、Web-Server を指定し、次のコンポーネントとの区切り文字にコンマを使用します。

PS> Add-WindowsFeature Web-Server, ASP

すべての IIS コンポーネントは、長い文字列を入力することなくインストールできます。セキュリティ上、すべてのコンポーネントをインストールすることは望ましくありませんが、Add-WindowsFeature コマンドレットには、便利なパラメーターが用意されています。

PS> Add-WindowsFeature Web-Server -IncludeAllSubFeature

IIS をリモート展開する話に戻りましょう。ここでは、既定のインストールを使用して、ASP と ASP.NET のコンポーネントを追加します。ここでも、Invoke-Command コマンドレットを使用します。次のコマンドを実行すると、すべてのサーバーに IIS がインストールされます。

PS> Invoke-command -Session $session {Add-WindowsFeature web-server,web-asp,web-asp-net}

4. テストを行うために、新しい Web サーバーに、いくつかの Web ページを展開します。ここでは default.htm と testpage.asp ファイルを使用します。サーバーにドライブをマップして、既定の Web サイトにファイルをコピーする作業には、時間がかかるので、Windows PowerShell とサーバー名の一覧を使用して、この処理を行います。

ここでは、Web ファイルは、c:\files にあります。Copy-Item コマンドレットを使用して、files フォルダーにある Web ファイルを UNC パスで指定した場所にコピーします。UNC パスには、サーバー名を含める必要があります。Foreach-Object コマンドレットにサーバー名の一覧 ($Servers) を渡します。Foreach-Object コマンドレットでは、$Server に格納されている各サーバーに対して処理を反復します。サーバー名を入力する必要がない形で UNC パスを固定するために、Windows PowerShell の特殊変数 $_ を使用します。この変数では、$Server に格納されているサーバー名を保持しています。

PS> $servers | foreach{copy-item -Path c:\files\*.* -Destination "\\$_\c$\inetpub\wwwroot"}

このコマンドを使用して、約 4 分で多数のサーバーに IIS と既定の Web サイトを展開しました。Web サイトのテストを行うには、先ほど紹介した技法を使用して Internet Explorer を起動します。このコマンドを実行すると、各サーバーでブラウザーを起動して、テスト ページを表示します。

PS> $servers | foreach{Start-Process iexplore "http://$_/testpage.asp"}

すべてのブラウザーを閉じるには、Windows PowerShell の画面に戻って、次のコマンドを実行します。

PS> Stop-Process –Name iexplore

Web サーバーを削除する

障害復旧対策として展開のテストを行っている場合やこの技法を試している場合には、追加したものを削除して、クリーンな環境で最初からやり直すことをお勧めします。次のコマンドを実行すると、Web サイトのファイルと Web サーバーを削除し、コンピューターを再起動できます。

PS> $servers | foreach{remove-item -Path "\\$_\c$\inetpub\wwwroot\*.*"} PS> Invoke-command -Session $session {Remove-WindowsFeature web-server,web-asp,web-asp-net} PS> Restart-Computer –Computername $servers -Force

ソリューションのスクリプトを作成する

Windows PowerShell を使用する最大のメリットは、コンソールから実行した処理をテキスト ファイルにコピーして、スクリプトを作成できることです。面倒な作業もプログラミングの必要もありません。完全な自動化です。障害復旧の必要が生じたり、追加のテストを実施したりする場合に、IIS をすぐ展開できるようにするには、このコラムで紹介したコマンドをテキスト ファイルにコピーして、IISDeploy.ps1 という名前を付けて保存します。IIS を展開する必要が生じたときには、このスクリプトを実行するだけで IIS を展開できます。

このような技法は、さまざまな可能性をもたらします。複数の Web サイトを Web ファームに展開する処理を自動化したり、ファームでロード テストを生成する処理を自動化したり、他の Windows の役割や機能をインストールしたりするのに、この技法を使用することもできます。

Web サイトやアプリケーション プールなどを作成および構成するコマンドレットが含まれている IIS の WebAdministration モジュールもチェックしてみてください。処理を自動化する必要がある場合、Windows PowerShell を使用すると、迅速かつ簡単に対応できるようになります。

Jason Helmick は、エンタープライズ コンサルタント、トレーナー、および執筆者として IT 業界に 20 年以上携わっています。Interface Technical Training で Windows PowerShell テクノロジの指導者として働いており、Active Directory と IIS の自動化を専門としています。近日発売予定の彼の著書『Learn Windows IIS in a Month of Lunches』(Manning Publication、2012 年) では、IIS について詳しく学ぶことができます。連絡先は、JasonHelmick@gmail.com (英語のみ) です。

関連コンテンツ