LoginSignup
13

More than 5 years have passed since last update.

【#Chef】Windows 環境での Chef Solo(chef-solo)と Berkshelf の基本的な使い方 #GetChef_ja

Last updated at Posted at 2014-06-26

Windows 環境での Chef Solo と Berkshelf の基本的な使い方について自分用のメモとしてまとめました。

AWS の EC2 インスタンス上に作成した Windows Server 2012 R2 環境で Chef Solo と Berkshelf を使って IIS をインストールします。

PowerShell でのリモート接続

まずは、リモートから PowerShell コマンドを使うためのいくつかの設定を行います。

手順 1: リモートコンピューターにサインインします

リモートデスクトップを使って、 Administrator ユーザーでサインインします。

手順 2: Windows PowerShell を起動します

リモートコンピューター側のスタートメニューから Windows PowerShell を起動します。

手順 3: Windows PowerShell の実行ポリシーを変更します

PS> Set-ExecutionPolicy "RemoteSigned" -Force
PS> Get-ExecutionPolicy

RemoteSigned

→ RemoteSigned と表示されることを確かめます。

手順 4: Windows リモート管理(WinRM)を有効にします

PS> Enable-PSRemoting -Force

手順 5: Windows リモート管理に関するWindowsファイアウォールのルールを変更します

PS> Set-NetFireWallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress "Any"

→ デフォルトでは、同一サブネットのアドレスにのみ WinRM のポート(5985)が開放されています。そこで、ローカルマシンからも接続できるように、ファイアウォールのルールを変更します。

手順 6: Windows リモート管理 (WinRM)の接続タイムアウト値を"1,800,000[ミリ秒](30分)"に設定します

PS> Set-Item -Path "WSMan:\localhost\MaxTimeoutms" 1800000
PS> Get-Item -Path "WSMan:\localhost\MaxTimeoutms"

   WSManConfig: Microsoft.WSMan.Management\WSMan::localhost

Type            Name           SourceOfValue   Value
----            ----           -------------   -----
System.String   MaxTimeoutms                   1800000

→ 値が 1800000[ミリ秒](30分) であることを確かめます。デフォルト値は 60000[ミリ秒](60秒) です。

手順 7: リモートコンピューターからサインアウトします

PS> & logoff.exe

手順 8: Windows PowerShell を起動します

ローカルコンピューター側のスタートメニューから Windows PowerShell を起動します

手順 9: ドメインの異なるコンピューターへ接続するための設定を行います

PS> Set-Item -Path "WSMan:\localhost\Client\TrustedHosts" -Value "*"

WinRM サービスの起動
WinRM サービスは現在起動していません。このコマンドを実行すると、WinRMサービスが起動します。

続行しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):Y

WinRM セキュリティの構成。
このコマンドは WinRM クライアントの TrustedHosts の一覧を変更します。TrustedHosts の一覧内にあるコンピューターは認証されない可能性があります。クライアントはこれらのコンピューターに資格情報を送信する可能性があります。この一覧を変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):Y

→ 全ての質問に対して、"はい(Y)"" を選択します。

手順 10: コマンドレット New-PSSession を使ってリモートコンピューターとの PSSession を作成します

PS> New-PSSession -ComputerName "IPアドレス" -Credential "Administrator"

手順 11: パスワードを入力します

[パスワード(P):]欄に "Administrator" のパスワードを入力し [OK]ボタンをクリックします。

手順 12: 作成した PSSession の ID を確認します

PS> Get-PSSession

 Id Name      ComputerName    State  ConfigurationName    Availability
 -- --------- --------------- ------ -------------------- ------------
 XX SessionXX xxx.xxx.xxx.xxx Opened Microsoft.PowerShell Available

→ Id 欄の値を確認します

手順 13: Enter-PSSession コマンドレットを使って作成した PSSesion に接続します

PS> Enter-PSSession ID番号

[xxx.xxx.xxx.xxx]: PS C:\Users\Administrator\Documents>

→プロンプトが上記のように変われば成功です。

Chef と Berkchelf のセットアップ

いよいよ、Chef と Berkshelf のインストール手順です。

Chef のインストールには、Windows 向けパッケージマネージャーである Chocolatey を利用します。

Berkshelf のバージョンは 3 ではなく、インストールが容易な 2.0.16 を利用します。

手順 1: Chocolatey をインストールします

PS> Invoke-Expression (New-Object System.Net.WebClient).DownloadString("https://chocolatey.org/install.ps1")

手順 2: Chocolatey を使って、Chef と Git をインストールします

PS> & chocolatey install "chef-client" "git"

手順 3: Chef Solo の設定ファイル solo.rb を作成します

PS> New-Item -Path "$env:SystemDrive\chef\solo.rb" -ItemType "File" -Value @"
environment_path '$env:SystemDrive\chef\environments'
data_bag_path '$env:SystemDrive\chef\data_bags'
cookbook_path '$env:SystemDrive\chef\cookbooks'
file_cache_path '$env:SystemDrive\chef\cache'
"@

手順 4. Chef の Omnibus Installer でインストールされたパッケージ群と Git をパスに通します。

PS> $env:Path = "$env:SystemDrive\opscode\chef\bin;$env:SystemDrive\opscode\chef\embedded\bin;${env:ProgramFiles(x86)}\git\bin;$env:ProgramFiles\git\bin;$env:Path"

手順 5. gem コマンドを使って、Berkshelf をインストールします

PS> & gem install "buff-extensions" -v "0.5.0" --no-ri --no-rdoc
PS> & gem install "varia_model" -v "0.3.2" --no-ri --no-rdoc
PS> & gem install "berkshelf" -v "2.0.16" --no-ri --no-rdoc
PS> & gem list --local | Select-String "berkshelf"

berkshelf (2.0.16)

ラッパークックブックの作成

コミュニティに公開されているクックブック iis をラップするだけの簡単なクックブックを作成します。

手順 1: Cookbook の置き場を作成します

PS> New-Item -Path "$env:SystemDrive\chef\site-cookbooks" -ItemType "Directory"

手順 2: berks コマンドを使って wrapper-cookbook という名前でクックブックのひな形を作成します

PS> Set-Location -Path "$env:SystemDrive\chef\site-cookbooks"
PS> & berks cookbook "wrapper-cookbook" --skip-vagrant --skip-test-kitchen --license="reserved" --maintainer="YOUR_NAME" --maintainer-email="YOUR_EMAIL"

手順 3: Cookbook のメタデータ設定ファイル metadata.rb を編集します

PS> Add-Content -Path "$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook\metadata.rb" -Value @'
depends          "iis"
'@

手順 4: Cookbook のデフォルトレシピファイル default.rb を編集します

PS> Add-Content -Path "$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook\recipes\default.rb" -Value @'
include_recipe "iis::default"
'@

クックブックの適用(Chef Solo の実行)

ここでは、Chef の Environment という機能を利用して Chef Solo の実行します。

Environment を利用することで、クックブック内で指定している Attribute(変数)の値を上書きすることができます。

開発環境と本番環境など、環境によって異なるパラメーターを設定する必要がある場合に便利です。

手順 1: Berkshelf を使って依存関係のあるクックブックをダウンロードします

PS> & berks install --berksfile="$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook\Berksfile" --path="$env:SystemDrive\chef\cookbooks\"

手順 2: Node の設定ファイル node.json を作成します

PS> New-Item -Path "$env:SystemDrive\chef\node.json" -ItemType "File" -Value @'
{
  "run_list": "wrapper-cookbook::default"
}
'@

手順 3: Environment の置き場を作成します

PS> New-Item -Path "$env:SystemDrive\chef\environments" -ItemType "Directory"

手順 4: Environment の設定ファイル development.json を作成します

PS> New-Item -Path "$env:SystemDrive\chef\environments\development.json" -ItemType "File" -Value @'
{
  "name": "development",
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "iis": {
      "home": "#{ENV['WINDIR']}\\System32\\inetsrv",
      "conf_dir": "#{iis['home']}\\config",
      "pubroot": "#{ENV['SYSTEMDRIVE']}\\inetpub",
      "docroot": "#{iis['pubroot']}\\wwwroot",
      "log_dir": "#{iis['pubroot']}\\logs\\LogFiles",
      "cache_dir": "#{iis['pubroot']}\\temp"
    }
  }
}
'@

手順 5: Chef Solo を実行します

PS> & chef-solo -j "$env:SystemDrive\chef\node.json" -E "development"

手順 6: ブラウザを使って http://[IPAddress]/ にアクセスします

ブラウザを使って http://[IPAddress]/ にアクセスします

→ Internet Infomation Services と書かれたページが表示されれば成功です。

おまけ

これらの手順をスクリプト風にすると次のようになります。

# Installation of 'Chocolatey'
Invoke-Expression (New-Object System.Net.WebClient).DownloadString("https://chocolatey.org/install.ps1")

# Installation of 'Chef Client' and 'Git'
& $env:SystemDrive\chocolatey\bin\cinst.bat "chef-client" "git"

# Creation of 'solo.rb'
New-Item -Path "$env:SystemDrive\chef\solo.rb" -ItemType "File" -Value @"
environment_path '$env:SystemDrive\chef\environments'
data_bag_path '$env:SystemDrive\chef\data_bags'
cookbook_path '$env:SystemDrive\chef\cookbooks'
file_cache_path '$env:SystemDrive\chef\cache'
"@ -Force

# Setting 'PATH'
$env:Path = "$env:SystemDrive\opscode\chef\bin;$env:SystemDrive\opscode\chef\embedded\bin;${env:ProgramFiles(x86)}\git\bin;$env:ProgramFiles\git\bin;$env:Path"

# Installation of 'Berkshelf'
& gem install "buff-extensions" -v "0.5.0" --no-ri --no-rdoc
& gem install "varia_model" -v "0.3.2" --no-ri --no-rdoc
& gem install "berkshelf" -v "2.0.16" --no-ri --no-rdoc
& gem list --local | Select-String "berkshelf"

# Creation of a cookbook template
New-Item -Path "$env:SystemDrive\chef\site-cookbooks" -ItemType "Directory" -Force
Remove-Item -Path "$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook" -Force -Recurse
Set-Location -Path "$env:SystemDrive\chef\site-cookbooks"
& berks cookbook "wrapper-cookbook" --skip-vagrant --skip-test-kitchen --license="reserved" --maintainer="YOUR_NAME" --maintainer-email="YOUR_EMAIL"

# Editting 'metadata.rb'
Add-Content -Path "$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook\metadata.rb" -Value @'
depends          "iis"
'@

# Editting the default recipe
Add-Content -Path "$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook\recipes\default.rb" -Value @'
include_recipe "iis::default"
'@

# Installation of the depended cookbooks
& berks install --berksfile="$env:SystemDrive\chef\site-cookbooks\wrapper-cookbook\Berksfile" --path="$env:SystemDrive\chef\cookbooks\"

# Creation of 'node.json'
New-Item -Path "$env:SystemDrive\chef\node.json" -ItemType "File" -Value @'
{
  "run_list": "wrapper-cookbook::default"
}
'@ -Force

# Creation of 'development.json'
New-Item -Path "$env:SystemDrive\chef\environments" -ItemType "Directory" -Force
New-Item -Path "$env:SystemDrive\chef\environments\development.json" -ItemType "File" -Value @'
{
  "name": "development",
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "iis": {
      "home": "#{ENV['WINDIR']}\\System32\\inetsrv",
      "conf_dir": "#{iis['home']}\\config",
      "pubroot": "#{ENV['SYSTEMDRIVE']}\\inetpub",
      "docroot": "#{iis['pubroot']}\\wwwroot",
      "log_dir": "#{iis['pubroot']}\\logs\\LogFiles",
      "cache_dir": "#{iis['pubroot']}\\temp"
    }
  }
}
'@ -Force

# Execution of 'Chef Solo'
& chef-solo -j "$env:SystemDrive\chef\node.json" -E "development"

exit 0

以上

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13