ちょっと話題の記事

Windows Serverにchef-soloでIISをインストールする ※PowerShell縛り

2013.10.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、望月です。
入社して2週間、専らchefと戯れる日々が続いています。
弊社AWSコンサルティング部では、CloudFormationとchefを利用した環境構築の自動化を推進しています。chefやCloudFormationについては、過去のブログに記事が沢山あるので、そちらを見てみてください。
ところで、chefで環境構築する際に悩みの種になりがちなのが、Windows Serverへの適用です。

  • Linuxで標準のパッケージインストールが出来ない
  • knife-soloを利用するためのSSH serverがインストールされていない
  • そもそもRubyも入っていない

などなど、課題が山積です。そこで本日は第一歩として、Windows Serverでchef-soloを実行するところまで行いましたので、その作業記録を残します。

ただし、手でインストーラをクリックしていくのは面白く無いので、PowerShellのみで挑戦してみます。
私はWindowsプログラミングは全くの初心者なので、奇妙な記述をしているかもしれませんが、その時は指摘をお待ちしております。

はじめに

前提環境

以下の環境で検証を行いました。

  • 環境:Windows Server 2008R2
  • インスタンスサイズ : m1.small
  • Security Group : RDP(3389)のみ開放

PowerShellスクリプトと解説

PowerShellはデフォルトではインタラクティブシェルの実行のみが許可されており、保存したスクリプトファイルの実行はできません。なので以下のコマンドでポリシーを緩める必要があります。

[PowerShell] # RestrictedからRemote Signedにポリシーを変更 Set-ExecutionPolicy RemoteSigned [/PowerShell]

ポリシーを変更したら、以下のスクリプトを保存し、実行してください(PowerShellに直接コピペしても構いません)。それだけでIISのインストールが完了します。 [PowerShell] # chefのmsiのダウンロード、インストール (new-object System.Net.WebClient).DownloadFile("https://opscode-omnibus-packages.s3.amazonaws.com/windows/2008r2/x86_64/chef-client-11.6.2-1.windows.msi", "C:\\Users\\Administrator\\chef.msi") msiexec /i "C:\\Users\\Administrator\\chef.msi" /l*v "C:\\Users\\Administrator\\install.log" /qn

# chefを実行するための準備 $chefRepository="C:\\Users\\Administrator\\chef-repository" $env:Path = $env:Path + ";C:\opscode\chef\embedded\bin"

# berkshelfのインストール -- ※1 gem install berkshelf --no-ri --no-rdoc

mkdir $chefRepository cd $chefRepository

# berksfileの設定、インストール -- ※2 $berksfile=@" site :opscode

cookbook "iis" "@

$berksfile | Out-File -FilePath ${chefRepository}\berksfile -Encoding UTF8 berks install --path=cookbooks

# solo.rbの作成 $chefConfigFile = @" cookbook_path "C:/Users/Administrator/chef-repository/cookbooks" "@

[System.IO.File]::WriteAllLines("${chefRepository}\solo.rb", $chefConfigFile)

$jsonFile = @" { "iis" : { "accept_eula" : true }, "run_list" : "recipe[iis]" } "@

[System.IO.File]::WriteAllLines("${chefRepository}\solo.json", $jsonFile)

# chef-soloの実行 chef-solo -c solo.rb -j solo.json [/PowerShell]

上のスクリプト内で、以下のことを実行しています。

  1. chef/Rubyのインストール
  2. 各種設定ファイル(berksfile, solo.rb, solo.json)の準備
  3. chef-soloの実行

chef/Rubyのインストール

今回は、chefのインストールにopscode社が提供しているchef+Rubyのomnibus installerを利用しました。これにより、同じマシンで今後Rubyが必要になった時にバージョンやライブラリの競合が起こらずに済みます。

各種設定ファイルの準備

今回は簡単なサンプルインストールですので、使うファイルも最小限です。IISのCookbookはopscode社が提供しているものを使うのですが、IISのcookbookは、webpiというcookbookに依存していて、webpiはwindowsというcookbookに依存していて...と面倒なので、素直にberkshelfを使います。
6行目の$chefRepositoryをchefのルートディレクトリとして変数定義し、その下にberksfile, solo.rb, solo.jsonを作成します。
chef-solo実行用のsolo.rb, solo.jsonも同様に作成します。

IISのインストールの際には、ライセンスへの許諾が必要です。その値はattributeの"accept_eula"で与えられるようになっているので、そのattribute設定も同時に行っています。

chef-soloの実行

実行結果がコマンドプロンプトに現れて、インストールが進むのが見えると思います。
実行が完了したら、RDPの接続先から http://localhost/ で接続してみましょう。

chef-iis

Welcomeページが表示されました!
サーバーマネージャーからも、IISがインストールされ、動いていることが確認できると思います。

chef-iis-manager

まとめ

普段滅多に使用しないPowerShell + chefでの構築を行ってみました。PowerShellの使い方はまだまだ勉強していかなければいけませんね。。。
ですが、chefがしっかりとWindowsでも動くのが確認できたので、これからWindows向けcookbookの作成を進めていこうと思います。

参考記事