【#Chef】Windows 環境上に Vagrant と Chef を使って CentOS + Apache HTTP Server の環境をセットアップ #Vagrant #GetChef_ja

Windows 環境上に Vagrant と Chef を使って CentOS + Apache HTTP Server の環境をセットアップした際の手順を自分用のメモとしてまとめました。

Vagrant と Chef のインストールと操作は、[PowerChef](https://github.com/kukita/PowerChef) という PowerShell モジュールを作成しましたので、これを使います。

- PowerChef [[https://github.com/kukita/PowerChef]](https://github.com/kukita/PowerChef)

## 1: PowerChef モジュールのインストール

まず、PowerChef モジュールをローカルマシンにダウンロードします。

### 手順 1-1: 'Windows PowerShell' を起動します

```
スタートメニューから 'Windows PowerShell' を起動します
```

### 手順 1-2: PowerShellスクリプトの実行セキュリティ・ポリシーを RemoteSigned に変更します

```ps1
PS> Set-ExecutionPolicy RemoteSigned
PS> Get-ExecutionPolicy
RemoteSigned
```

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

### 手順 1-3: インストールスクリプト（`install.ps1`）を使って、GitHub上からモジュールをダウンロードします

```ps1
PS> Invoke-Expression (New-Object System.Net.WebClient).DownloadString("https://raw.github.com/kukita/PowerChef/master/install.ps1")
```

→ Installation of 'PowerChef' has finished successfully. と表示されれば成功です。

## 2: WorkStation 環境のセットアップ

次に、ローカルマシンを Chef の WorkStation 環境としてセットアップします。

### 手順 2-1: PowerChef モジュールをインポートします

```ps1
PS> Import-Module "PowerChef"
PS> Get-Module
ModuleType Version    Name
---------- -------    ----
Manifest   3.1.0.0    Microsoft.PowerShell.Management
Manifest   3.1.0.0    Microsoft.PowerShell.Utility
Manifest   0.5.0      PowerChef
```

→ PowerChef が表示されていることを確かめます。

### 手順 2-2: `SetUp-ChefWorkstation` ファンクションを使って、ローカルマシンを WorkStation 環境としてセットアップします

```
PS> SetUp-ChefWorkstation -PowerChefHomePath "D:\PowerChef"
※30分くらいかかります。最後にWinRMのセキュリティ設定に関して聞かれるので [Y]Yes を選択します。
```

次のソフトウェアがインストールされます。

* Chocolatey [[https://chocolatey.org/]](https://chocolatey.org/)
* Oracle VM VitrualBox [[https://www.virtualbox.org/]](https://www.virtualbox.org/)
* Git for Windows [[http://msysgit.github.io/]](http://msysgit.github.io/)
* posh-git [[https://github.com/dahlbyk/posh-git]](https://github.com/dahlbyk/posh-git)
* Chef [[http://www.getchef.com/chef/]](http://www.getchef.com/chef/)
* serverspec [[http://serverspec.org/]](http://serverspec.org/)
* Bento [[https://github.com/opscode/bento]](https://github.com/opscode/bento)
* em-winrm [[https://github.com/opscode/em-winrm]](https://github.com/opscode/em-winrm)
* Oracle Java Runtime [[http://java.com/en/download/]](http://java.com/en/download/)
* Vagrant [[http://www.vagrantup.com/]](http://www.vagrantup.com/)
* 7-Zip [[http://www.7-zip.org/]](http://www.7-zip.org/)
* CwRsync [[https://www.itefix.no/i2/cwrsync]](https://www.itefix.no/i2/cwrsync)
* Berkshelf [[http://berkshelf.com/]](http://berkshelf.com/)

### 手順 2-3: `Open-HomeVagrantfile` ファンクションを使って、Vagrant ホームディレクトリの `Vagrantfile` を編集します

```ps1
PS> Open-HomeVagrantfile
```

→ 仮想化支援機能の有無等ホストマシンのスペックに合わせてファイルを編集しファイルを閉じます。

## 3: クックブックの作成

コミュニティに公開されているクックブック `apache2` と `chef-client` をラップしただけの簡単なクックブック `role-as-webserver` を作成します。

### 手順 3-1: `New-ChefRepo` ファンクションを使って、"SampleRepo" という名前のリポジトリを作成します

```
PS> New-ChefRepo "SampleRepo"
PS> Show-ChefRepoList
Name        CreationTime        LastWriteTime       LastAccessTime
----        ------------        --------------      -------------
SampleRepo  2014/XX/XX XX:XX:XX 2014/XX/XX XX:XX:XX 2014/XX/XX XX:XX:XX
```

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

### 手順 3-2: `Get-ChefRepoPath` ファンクションを使って、作成した chef-repo のパスを取得しカレントディレクトリを移動します

```
PS> Get-ChefRepoPath "SampleRepo" | Set-Location
PS> pwd
Path
----
D:\PowerChef\chef-repositories\SampleRepo\chef-repo
```

→ D:\PowerChef\chef-repositories\SampleRepo\chef-repo と表示されることを確かめます。

### 手順 3-3: `New-Cookbook` ファンクションを使って、"role-as-webserver" という名前のクックブックを作成します

```
PS> New-Cookbook "role-as-webserver"
Maintainer: xxxxxxx xxxxxx ←作成者（メンテナー）の名前を入力します。
MainteinerEmail: xxxxxxxx@xxxxxx.xx ←作成者（メンテナー）のメールアドレスを入力します。
PS> Show-CookbookList
Name              Parent         CreationTime        LastWriteTime       LastAccessTime
----              ------         ------------        --------------      -------------
role-as-webserver site-cookbooks 2014/xx/xx xx:xx:xx 2014/xx/xx xx:xx:xx 2014/xx/xx xx:xx:xx
```

→ role-as-webserver が表示されることを確かめます。

### 手順 3-4: `Open-CookbookMetadata` ファンクションを使って、クックブックのメタデータ（`metadata.rb`）を編集します

```ps1
PS> Open-CookbookMetadata "role-as-webserver"
```

次のように編集しファイルを閉じます。

```ruby
name             'role-as-webserver'
maintainer       'xxxxxxx xxxxxx'
maintainer_email 'xxxxxxxx@xxxxxx.xx'
license          'Apache 2.0'
description      'This is a cookbook of the role as web server.' ←編集
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.0'
depends          'apache2'     ←追記
depends          'chef-client' ←追記
```

### 手順 3-5: `Open-CookbookRecipe` ファンクションを使って、クックブックのデフォルトレシピ(`default.rb`）を編集します

```ps1
PS> Open-CookbookRecipe "role-as-webserver"
```

行末に次の2行を追記しファイルを閉じます。

```ruby
include_recipe "apache2::default"     ←追記
include_recipe "chef-client::default" ←追記
```

## 4: クックブックのアップロード

Chef Zero（インメモリー版軽量 Chef Server）を起動し、作成したクックブックをアップロードします。

### 手順 4-1: `Start-ChefZero` ファンクションを使って、ローカルマシン上にChef Zero（インメモリー版軽量 Chef Server）を起動します。

```ps1
PS> Start-ChefZero
PS> & NETSTAT.EXE -anb | Select-String "8889"
```

→ ポート 8889 番の状態が LISTENING であることを確かめます。

### 手順 4-2: `New-ChefZeroACL` ファンクションを使って、Windows ファイアウォールの設定を行います（Windows 8、Windows Server 2012 以降の環境のみ）

```ps1
PS> New-ChefZeroACL
```

### 手順 4-3: `Update-Cookbook` ファンクションを使って、依存関係のあるクックブックをダウンロードし Chef Zero にアップロードします

```ps1
PS> Update-Cookbook "role-as-webserver"
PS> & knife.bat cookbook list
```

→ クックブックの一覧が表示されれば成功です。

## 5: Node の作成とセットアップ

Vagrant を使って CentOS がインストールされた仮想マシンを作成し Chef の Node 環境としてセットアップします。

### 手順 5-1: CentOS の Box を登録します

```
PS> & vagrant.exe box add "opscode-centos-6.5" "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"
PS> & vagrant.exe box list
opscode-centos-6.5 (virtualbox, 0)
```

→ "opscode-centos-6.5" という名前の Box が追加されたことを確かめます。

### 手順 5-2: `New-ChefNode` ファンクションを使って、Node 環境の定義ファイルを作成します

```
PS> New-ChefNode -BoxName "opscode-centos-6.5" -OSType "Linux" -VMNumber 20 -NodeNamePrefix "WebServer"
PS> Show-ChefNodeList
```

→ "WebServer-192-168-56-20" という名前の Node が作成されたことを確かめます。

### 手順 5-3: `Open-ChefNodeVagrantfile` ファンクションを使って、`Vagrantfile` を編集します

```ps1
PS> Open-ChefNodeVagrantfile "WebServer-192-168-56-20"
```

→ ここでは、`Vagrantfile` が作成されていることを確認し、そのままファイルを閉じます。

### 手順 5-4: `Create-ChefNode` ファンクションを使って、仮想マシン（VirtualBox のゲスト OS）を作成します

```ps1
PS> Create-ChefNode "WebServer-192-168-56-20"
PS> Show-ChefNodeStatus "WebServer-192-168-56-20"
```

### 手順 5-5: `SetUp-ChefNode` ファンクションを使って、作成した仮想マシンを Node 環境としてセットアップします

```ps1
PS> SetUp-ChefNode "WebServer-192-168-56-20"
```

### 手順 5-6: knife コマンドを使って、Chef Zero サーバー上に Node として登録されたことを確認します

```ps1
PS> & knife.bat node list

WebServer-192-168-56-20
```

→ WebServer-192-168-56-20 が表示されれば成功です。

## 6: クックブックの適用

作成したクックブックを Node 環境に適用します。

### 手順 6-1: knife コマンドを使って run_list に作成したクックブックを追加します

```ps1
PS> & knife.bat node run_list add "WebServer-192-168-56-20" "role-as-webserver::default"
PS> & knife.bat node show "WebServer-192-168-56-20"
```

### 手順 6-2: Environment の設定ファイル `development.json` を作成します

```ps1
PS> New-Item -Path ".\environments\development.json" -ItemType "File" -Value @'
{
  "name": "development",
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "apache2": {
      "worker": {
        "startservers": 4,
        "serverlimit": 16,
        "maxclients": 1024,
        "minsparethreads": 64,
        "maxsparethreads": 192,
        "threadsperchild": 64,
        "maxrequestsperchild": 0
      }
    }
  }
}
'@
```

### 手順 6-3: knife コマンドを使って、 Environment を設定します

```ps1
PS> & knife.bat environment create from file ".\environments\development.json"
```

### 手順 6-4: `Converge-ChefNode` ファンクションを使って、クックブックを Node に適用します（Node 上で chef-client を実行します）

```ps1
PS> Converge-ChefNode "WebServer-192-168-56-20"
```

→ Node 上で chef-client が実行されエラーが出力されなければ成功です。

以上