windows で chef を試せる環境を vagrant を利用して作る

# この記事の内容
## windows から chef を試せる環境を作ろうとしたけど挫折したので、 windows > vm(workstation) > vm(node) の流れでなんとか windows から chef をさわれるようにした

### FAQ
Q. どうしてとなりに転がってる mac book でやらなかったの？
A. どうしても windows でやりたかった。

Q. もうちょっと頑張ったら windows から直接動かせたんじゃない？
A. 多分動かせたと思うけど、ssh を入れたり rsync を入れたり、それが既存の環境に影響を与えないように考慮したりって考えながらやってたときに、ふと、`冪等性`がキーワードの chef を動かそうっていうのにそれを動かす環境自体が複雑ってのはどうなの？って思ったのです。

# 目指したもの
1. vagrant とvirtual box の環境だけ整えればどの windows でも chef が試せるようにする

# 目指したchef 利用時の流れ
1. Windows で chef の recipe を書く(guest との共有フォルダで作業)
2. Windows から chef が使えるように設定された VM に ssh
3. VM(workstation) 上で `knife solo cook hoge`
4. VM(node) に色々適用される

---

# 今回のおおまかな作業の流れ
1. HostOS(windows) に必要なソフトをインストール
2. GuestOS(workstation), GuestOS(node) を建てる
3. GuestOS(workstation) から chef を実行できる環境を構築する
4. GuestOS(workstation) から GuestOS(node) に `knife solo` ができることを確認する
5. その状態で GuestOS(workstation) を Box化(vagrant package)する
6. 新しく作成された box から GuestOS(node) に `knife solo` ができることを確認する

---

### 以下、実際の作業手順
フォルダとかは適宜自分の環境に合わせて読み替えてください
%homepath% とか何回もでてくるのはなんとなく冪等性を意識してみたかったからです！

--- 

# HostOS(windows) での作業
## 前準備. 必要なソフトのインストール
1. Vagrant のインストール
	+ 今回は[v1.3.5](http://files.vagrantup.com/packages/a40522f5fabccb9ddabad03d836e120ff5d14093/Vagrant_1.3.5.msi) を利用
2. VartualBox のインストール
	+ 最新版だと自分の環境 (windows7 64bit) でうまく動かなかったので今回は[4.2.18](http://download.virtualbox.org/virtualbox/4.2.18/VirtualBox-4.2.18-88781-Win.exe) を利用

## Vagrant による仮想環境構築
1. box を追加(ubuntu 13.04)
	+ `vagrant box add Ubuntu1304 http://cloud-images.ubuntu.com/vagrant/raring/current/raring-server-cloudimg-amd64-vagrant-disk1.box`

2. 作業用のフォルダ作成
	+ `mkdir "%homedrive%%homepath%\vm\chef_lessons\vagrantWork"`
		+ knife solo を実行するVM. vagrantWork
	+ `mkdir "%homedrive%%homepath%\vm\chef_lessons\vagrantNode"`
		+ chef で色々いじられるVM. vagrantNode

3. インスタンスのネットワークアドレスを同一ネットワークになるように設定する
	+ work station 側
		+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantWork"`
		+ `vagrant init Ubuntu1304`
		+ `vagrantfile` をエディタで開く
		+ `config.vm.network` を編集する。今回は下記の設定を利用
			+ config.vm.network :private_network, ip: "192.168.33.10"
	+ node 側
		+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantNode"`
		+ `vagrant init Ubuntu1304`
		+ `vagrantfile` をエディタで開く
		+ `config.vm.network` を編集する。今回は下記の設定を利用
			+ config.vm.network :private_network, ip: "192.168.33.20"

4. box を立ち上げる
	+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantWork"`
	+ `vagrant up`
	+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantNode"`
	+ `vagrant up`

5. vagrantWork から vagrantNode にssh接続する際に利用する鍵を共有フォルダに置く。
	+ `copy "%homedrive%%homepath%\.vagrant.d\insecure_private_key" "%homedrive%%homepath%\vm\chef_lessons\vagrantWork\"`

## ssh での接続確認
1. ssh クライアントのダウンロード
	+ 今回は [rlogin](http://nanno.dip.jp/softlib/man/rlogin/) を利用

2. vagrantWork へのログイン
	+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantWork"`
	+ (`vagrant ssh-config` で設定を確認)
	+ 大抵は下記の設定でログインできるはず。できなかったらできるまでぐぐる。
		+ host: 192.168.33.10
		+ User: vagrant
		+ Pass: vagrant
		+ Port 22
		+ IdentityFile %homedrive%%homepath%\.vagrant.d\insecure_private_key

# GuestOS(vagrantWork) での作業
## chef の利用環境構築
3. chef, knife-solo のインストール及び初期設定
	+ `curl -L https://www.opscode.com/chef/install.sh | sudo bash`
	+ `sudo apt-get install ruby-dev`
        + `sudo apt-get install make`
	+ `sudo gem install knife-solo --no-ri --no-rdoc`
	+ `knife configure`
		+ 問い合わせは enter 連打でOK

4. insecure_private_key を ~/.ssh/ ヘ移動しパーミッションを 600 へ変更
	+ `mv /vagrant/insecure_private_key ~/.ssh/`
	+ `chmod 600 ~/.ssh/insecure_private_key`

5. knife-solo がやりやすいように、ssh の設定を行う. (vagrantNode へのssh 接続を ~/.ssh/config に追記)

```bash
echo \
'Host node
  HostName 192.168.33.20
  User vagrant
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL' \
>> ~/.ssh/config
```

## chef による　node の設定！ やっとデース！長かったネー！
1. chef の準備. リポジトリの作成　から node のchef 対応化まで
	+ `mkdir /vagrant/chef_lessons && cd /vagrant/chef_lessons`
	+ `knife solo init chef-repo`
	+ `cd chef-repo`
	+ `knife solo prepare node`

2. hello world! による確認
	+ `knife cookbook create hello -o site-cookbooks/`
	+ `echo 'log "Hello world Nanodesu!"' >> site-cookbooks/hello/recipes/default.rb`
	+ `echo '{"run_list":["recipe[hello]"]}' > nodes/node.json`
	+ `knife solo cook node`


# chef の設定が終わった状態の GuestOS(vagrantWork) を base box 化
## GuestOS(vagrantWork) での 作業
1. ネットワークインターフェース名とMACアドレスのマッピングを無効にする
	+ `sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules`

## HostOS(windows) での 作業
1. base box の作成
	+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantWork"`
	+ `vagrant halt`
	+ `vagrant package  --base vagrantWork_default_1383987529`
		+ --base 以降は実際に動いているVMの名前に置き換える
2. box の登録
	+ `vagrant box add Ubuntu1304WithChef package.box`


# 新しく作成したBOXの確認
1. HostOS(Windows) での作業
	+ `mkdir "%homedrive%%homepath%\vm\chef_lessons\vagrantWork2"`
	+ `cd /d "%homedrive%%homepath%\vm\chef_lessons\vagrantWork2"`
	+ `xcopy /E "%homedrive%%homepath%\vm\chef_lessons\vagrantWork\chef_lessons" "%homedrive%%homepath%\vm\chef_lessons\vagrantWork2\chef_lessons\"`
	+ `vagrant init Ubuntu1304WithChef`
	+ `vagrantfile` をエディタで開き編集する
		+ config.vm.network :private_network, ip: "192.168.33.11"
	+ `vagrant up`

2. 	ssh 立ち上げたBOXに接続

3. GuestOS(vagrantWork2) での作業
	+ `cd /vagrant/chef_lessons/chef-repo/`
	+ `knife solo cook node`

4. 実行できた？
	+ できた！
		+ おつかれさまでした！
	+ できない！
		+ ぐぐれ！

---
# 感想
windows がメインの職場なんかでも、 hey. chef が使いたいならこのbox を使いなヨー って言えていいんじゃないかなと思いました。
---

# 参考
+ [Chef入門](http://dotinstall.com/lessons/basic_chef)
+ その他多くのHP

#### おまけ

Q. guestOS(vagrantWork) の ssh 設定がハードコーディングされね？
A. 簡単なうまい方法がみつからなかったからあきらめたのです！

Q.  ・・・vagrant とvirtual box の環境だけっていってなかった？ これ 標準でついてない ssh クライアントも使ってるよね？
 A. 目指す、とはいったけれど、それ以外は使わないとはいっていないのです！