vagrant
knife-solo

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

More than 5 years have passed since last update.

こんにちは。

今回は、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で簡単仮想マシン構築
naoyaのはてなダイアリー - Vagrant
僕の車輪の再発明 - Window 7 でVagrantでCent OS 6.3入れてみた
時の回廊 - Windows 8 に Vagrant と chef-solo をインストールしてみた
メモ的な思考的な - Windows7上で Vagrant + Chef solo + knife-soloを使い、Ubuntu + ubuntu-desktopの環境を構築してみた

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

構築手順

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

VirtualBoxのインストール

普通に公式から最新を取ってきてインストール

Vagrantのインストール

普通に公式から最新を取ってきてインストール

完了。実にシンプル。

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

Boxの追加

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

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

今回は、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を編集する。

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

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

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にトライ

この記事では、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にプロキシを登録して上手くいった。

...
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をインストールするとする。
その場合、以下の様に記述し保存。

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

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

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

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のソース弄ってみるとか、もう少しあがいてみようかと思います。