Vagrant + knife-solo を proxy 環境下で構築

こんにちは。

今回は、Windows7上に Vagrant + knife-solo 環境を構築しようと思います。
今回も、いつも通りproxyが鬼門となりましたので、その全容をお見せ致します。


## 構築環境
Host : Windows7 Professinal 32bit
Guest : Ubuntu 12.04 LTS

Vagrant 1.2.1
VirtualBox 4.2.12

## 参考サイト
[Ryuzee.com - Vagrantで簡単仮想マシン構築](http://www.ryuzee.com/contents/blog/4292)
[naoyaのはてなダイアリー - Vagrant](http://d.hatena.ne.jp/naoya/20130205/1360062070)
[僕の車輪の再発明 - Window 7 でVagrantでCent OS 6.3入れてみた](http://kazuph.hateblo.jp/entry/2013/02/05/234243)
[時の回廊 - Windows 8 に Vagrant と chef-solo をインストールしてみた](http://www1205uf.sakura.ne.jp/wp/world/?p=398)
[メモ的な思考的な - Windows7上で Vagrant + Chef solo + knife-soloを使い、Ubuntu + ubuntu-desktopの環境を構築してみた](http://d.hatena.ne.jp/thinkAmi/20130407/1365310673)

記事の新しさと情報の多さを見ると、いかに今Hotな話題なのかが分かりますね。

## 構築手順

まずはVagrantを使ってVMが立ち上がるまで。

### VirtualBoxのインストール
普通に[公式](https://www.virtualbox.org/)から最新を取ってきてインストール

### Vagrantのインストール
普通に[公式](http://www.vagrantup.com/)から最新を取ってきてインストール

完了。実にシンプル。

各設定は、`/Users/貴方のユーザ/`以下に展開されています。

### Boxの追加
VagrantでVMを構築する場合、ゼロからマシンを構築するのではなく、BaseBoxという雛形VMを元に構築していく事になる。

各Linux系OSのインストール～初期セットアップ + 必須アプリインストールが済んだだけのベーシックな環境のBaseBoxが[Vagrantbox.es](http://www.vagrantbox.es/)というサイトに丸ごと公開されているので、それを頂戴して簡単に始めることが出来る。
( 危険性についての指摘もある。参考：[Hack like a rolling stone - vagrant ユーザよ、その VM は安全なのか? ](http://tk0miya.hatenablog.com/entry/2013/03/15/115710) )

今回は、Ubuntu12.04 Desktopを立ち上げます。
Vagrantは全ての操作をCommandPromptから行う。
CommandPromptを立ち上げて、以下を打ち込む。

```
$ vagrant box add '任意の名前' http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-vagrant-i386-disk1.box
```

内部ではcurlで取ってきていて、当然proxyで引っかかる。
環境変数に、http_proxy=servername:portを追加する必要がある。
ちなみにダウンロードには結構時間がかかる(20分位)が、これは初めの一回だけである。

改めて取得をし、エラー無く完了したら、以下コマンドを打って先程の名前のBoxがあるかを確認。

```
$ vagrant box list 
```

これで、新しい雛形が貴方のマシンに用意されます。

### VMの作成
今度は、この雛形からVMを作成する。
VM設定を保持するフォルダを作成、移動し、`vagrant init`することでセッティングが行われる。
(このフォルダはあくまで設定ファイルのみであり、本体は`/Users/貴方のユーザ/VirtualBox VMs`以下に展開される。)

```
$ cd machines
$ mkdir dev01
$ cd dev01
$ vagrant init
```

すると、`dev01`フォルダ以下にvagrantfileという設定ファイルができる。
VMの設定をここに記述することになりますが、今は取り敢えずDefaultで続ける。

これでもうVMを構築出来ます。非常に簡単ですね。

### VMの起動
では、VMを起動。以下のコマンドで立ち上げる。

```
$ vagrant up
```

起動の確認のために、`$ vagrant ssh`というSSH接続機能も用意されているのですが、これがWindowsでは動きません。

```
`ssh` executable not found in any directories in the %PATH% variable. Is an
SSH client installed? Try installing Cygwin, MinGW or Git, all of which
contain an SSH client. Or use the PuTTY SSH client with the following
authentication information shown below:

Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: C:/Users/貴方のユーザ/.vagrant.d/insecure_private_key
```
　
言われたとおり、putty等のSSHクライアントで上記環境に接続を行う。
接続出来れば、VMが起動しているということ。素晴らしい。
では、一旦停止。以下のコマンドを打つ。

```
$ vagrant halt
```

また、マシンを削除するには`$ vagrant destroy`で、また作成するには`$ vagrant init`。

これだけでも感動してしまいました。

### chef-solo, knife-soloの導入
次に、chef-soloとknife-soloのをインストールしたいので、gemを使いたい。
調度良くvagrantが必要最低限なコマンドを持っているので、それを拝借する。

Windowsの環境変数の`Path`に以下を追加して、パスを通す。

```
C:\Program Files\HashiCorp\Vagrant\embedded\bin
```

試しにCommandPromptで`gem -v`して反応したらOK。
あとは、linuxと思って普通にインストール。

```
$ gem install chef
$ gem install knife-solo
```

途中でDocument関係でエンコード変換エラーのようなものが起こるが、Documentなので無視。気になるようであれば、`--no-ri --no-rdoc`をつけてinstlalすると出ない。

### knife-soloの設定
インストールできたら、knife-soloの設定を行う。

```
$ knife configure
```

色々と聞かれるが、全てEnterで進む。
たまに、依存するパッケージが足りないと言われる(こちらの環境では`ffi`が無かった)ので、それを`gem install XXXX`してから、もう一度configureする。

### Vagrantとknife-soloの連携
いよいよVagrantとknife-soloを連携させる。

まずは、先程作成したマシンのフォルダ以下にknife-soloの設定フォルダを作成し、初期化する。

```
$ cd machines/dev01
$ knife solo init chef-repo
```

これで、そのフォルダにchef-repoフォルダが出来る。
この中にCookbooks等が入っていく事になる。

次に、Vagrantで作成されるマシンのprivate ipを変更する。
先程`vagrant init`したフォルダに出来ているであろうvagrantfileを編集する。

```Ruby:Vagrantfile
 config.vm.network :private_network, ip: "192.168.33.10"
```

もう一手間。knife-soloがVMにアクセスする際には、パスワード無くアクセス出来る必要があるらしいので、.ssh/configを作成しておく。
/Users/貴方のユーザ/.ssh以下に、configというファイルを作成。

```Python:config
Host 192.168.33.*
    Port            22
    IdentityFile    C:/Users/貴方のユーザ/.vagrant.d/insecure_private_key
```

試しに、puttyなどで192.168.33.10:22でssh接続してみて、パスワードを聞かれなければOK。

これでようやくVMを起動。

```
$ vagrant init
```

knife-soloよりVMにchefをインストールして貰う。

```
$ cd chef-repo
$ knife solo prepare vagrant@192.168.33.10
```

うまくいくと思ったのだが、上手くいかない。
どうやら、curlが接続先ホスト名を解決できないと言っている。
毎度おなじみ。proxyです。

似たような環境で構築している人がいたので、参考にしてみる。
[mas-lab.blog - Windows + Cygwin + Proxy環境でChefにトライ](http://mas0061.blogspot.jp/2013/04/windows-cygwin-proxychef.html)

この記事では、wgetでエラーが出るとある。version違い？
とにかくやってみる。

```:/etc/profile
...
export http_proxy=http://SERVERNAME:PORT/
export https_proxy=http://SERVERNAME:PORT/
```

```:/etc/wgetrc
https_proxy = https://SERVERNAME:PORT/
http_proxy = http://SERVERNAME:PORT/
```

が、上手く行かず。
すったもんだあって、結局`/etc/environment`にプロキシを登録して上手くいった。

```/etc/environment
...
http_proxy="https://SERVERNAME:PORT/"
https_proxy="https://SERVERNAME:PORT/"
```

何はともあれ、これでVMにchefがセッティングされた。
`vagrant halt`で一旦停止。

### Cookbooksを用意し、Recipeを書く
では、サーバをどう調理していくかを定義していく。
まずは`piyo`というCookbookを作成する。

```
$ cd chef-repo
$ knife cookbook create piyo -o cookbooks
```

`chef-repo/cookbooks`以下に`piyo`フォルダが出来ているはず。
その中の`recipes`フォルダ以下にdefault.rbという名前のファイルがある。
これが、chefがどう調理をするかの定義となる。

例えば、apacheをインストールするとする。
その場合、以下の様に記述し保存。

```Ruby:default.rb
package "apache2" do
  action :install
end

service "apache2" do
  action [ :enable, :start ]
end
```

次に、これをVagrantで読み込む様に指示をする。
そのためには、vagrantfileを編集する必要がある。
以下の部分をコメント除去・修正する。

```Ruby:vagrantfile
...
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = "./chef-repo/cookbooks"
    chef.add_recipe "piyo"
  end
...
```

最後に、`chef-repo\nodes\192.168.33.10.json`を編集する。
( vagrantfileで読み込むrecipeを定義しているのだが、こっちの定義は何のためにあるんだろう。。。まだまだ分からないことだらけだ。。。 )

```:192.168.33.10.json
{"run_list":[" recipe [ piyo ]"]}
```

これで準備完了。
`vagrant up`でVMを起動する。
起動時にRecipeが実行される様が見て取れると思う。
エラー無く起動すれば、調理完了。

### 料理の味見
さて、折角出来た料理なので、試しに味わってみる。
ブラウザで、以下にアクセス。

```
http://192.168.33.10/
```

`It works !`が出れば、apacheが動いている証拠。


これででひと通りの流れが完了した。
お疲れ様でした。


## 感想
Cookbooksが一度出来てしまえば後は完全オートでやってくれるのかと期待していたのですが、proxyがあるとそうも行かないようです。
knife-solo部分なので、別のchefフロントエンドを使用するとか、ちょっとknifeのソース弄ってみるとか、もう少しあがいてみようかと思います。