Vagrantとは

VitualBoxのフロントエンドに相当するツール。
vagrantコマンドなどを使ってコマンドラインから簡単に新しいVMを作れる。

下記の投稿を見て、便利に思えたのでWindows8にインストールしてみた。

naoyaのはてなダイアリー Vagrant”

試す環境はWindows8 64bit。

Rubyをインストールする

下記から最新版のRubyをダウンロードする。

rubyinstaller.org

ここでは、1.9.3-p385をダウンロードし、インストールする。
念のため、DEVELOPMENT KITも合わせてインストールしておこう。(任意)
ダウンロードしたexeを実行すると、中身が解凍される。

インストールしたRubyのRubyコマンドプロンプトを起動し、下記を実行する。

以降もRubyコマンドプロンプトを使うとする。

VirtualBoxをインストールする

Vagrantの実行にはVirtualBoxのインストールが必要。
下記より、ダウンロードしてきてインストール。
バージョンは4.2.6だった。

virtualbox.org

その後、VBoxManage.exeのあるフォルダへのパスを環境変数PATHに通す。
私の場合、下記にインストール。

D:\Program Files\Oracle\VirtualBox

Vagrantをインストールする

下記のコマンドでインストール。

バージョンは1.0.6だった。
— 2014/4/16追記 —
WindowsにVagrantをインストールする場合は、下記のサイトからインストーラーを用いてインストールした方がいいと思います。

http://www.vagrantup.com/downloads.html

Windowsのsshを別途インストールしなくてもvagrant sshが実行できます。

VMを追加し、起動する

Vagrantは任意のVirtualBox形式のVMを使って環境構築できるよう。
もちろん、VMのTemplateも用意されている見たい。ここでは下記から追加したいVMを確認する。

vagrantbox.es

ここからboxへのURLを取ってきて入力。

なお、VMはD:\Users\[User名]\.vagrant.d\boxesに保存されていた。

ここで、VMのTemplateを元に、新しく、仮想マシンを作成する場合は下記のようにやる。
まず、TemplateとなるBoxを追加。

次に、適当なディレクトリを作成し、下記のコマンドを実行。

すると、Vagrantfileという設定ファルが作成される。下記のように記述。

— 2014/4/16追記 —
上記はAPI VERIONが1の場合の設定。最新の場合、下記のように設定する。

下記のコマンドで起動。

VMにアクセスする

通常は下記のコマンドでゲストOSにログインできる。

しかし、Windowsでは使えないらしい。そのため、Windows用のsshクライアントを使用する。
— 2014/4/16追記 —
これをやらなくてもインストーラーからインストールすれば、vagrant sshは実行できる。
ただし、knife-soloを実行する場合は必要。

接続情報は下記。私は、Poderosaを使用してアクセスできることを確認した。

Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: D:/Users/[ユーザー名]/.vagrant.d/insecure_private_key

ソフトウェアの環境構築を自動化する

chef-soloを使う。
フロントエンドのツールはいくつかあるらしい。
ネットで探すとknife-soloの話題ばかりだったので、これを使うことにした。
— 2014/6/28追記 —
Vagrantとchefを合わせて使う場合は、knife-soloではなくvagrant provisionを使うのが簡単。
Vagrant provisionでchefを実行する(Windows8.1)

knife-soloを使う

インストール

下記のコマンドでインストール。

バージョンは0.2.0.
また、いっしょにインストールされたchefのバージョンは11.4.0だった。

レシピの準備

下記で、レシピのテンプレートが作られる。このchef-repoというディレクトリにレシピを作成する。

次に、下記を実行する。

knife solo prepare を実行すると、VMにchefをインストールしてくれているみたい。

ちなみに、事前に ssh が通るように ~/.ssh/config にどのキーを使うかを書いておいたほうが、毎回-iオプションを入力せずにすむ。

rsyncとsshのパスを通す

Windowsの場合rsyncがないので、インストールする必要がある。
knife-soloのREADME.rdocのページを見てみる。

すると、下記のサイトを見てrsyncをインストールせよ、と書かれていた。

https://github.com/thbar/rsync-windows

cygwinをインストールして、下記のファイルを取り出し、cygwinをアンインストールしろ、とのこと。
そのため、私はまずcygwinをインストールした。
その後、[インストールフォルダ]\binの下記のファイルを探す。

  • rsync.exe
  • cygwin1.dll
  • cygiconv-2.dll

そのあと、それらを一つのフォルダにまとめて、そのフォルダのパスをユーザー環境変数PATHに通す。

しかし、結局ssh.exeが見つからないのでエラーになった。

私は結局、cygwinから下記のファイルを取り出し、rsyncと同様に、PATHの通っているフォルダに保存した。

  • ssh.exe
  • cygwin1.dll
  • cygcrypto-0.9.8.dll
  • cyggcc_s-1.dll
  • cygssp-0.dll
  • cygz.dll

Cygwinのバージョンによっては必要とするdllが異なるかもしれない。
そのときはDependency Walkerの32bit版をインストールして、rsync.exeやssh.exeを調べれば依存するdllがわかる。
また、コマンドプロンプトでsshやrsyncを実行した時のエラーメッセージで必要としているDLLを判断できる。

レシピの実行

jsonファイルやレシピの編集を行なって下記を実行する。

下記のようなホームディレクトリのマークはなぜか使えず。
-i “~/.vagrant.d/insecure_private_key”

レシピの編集

initで作ったフォルダ構成は下記のようになっている。

  • cookbooks
    • [サービス名]/recipes/default.rb
      → レシピの内容
  • data_bags
  • nodes
    • xx.xx.xx.xx.json
      → レシピを実行するノードに対して、実行するレシピが書かれたファイル。
  • roles
  • site-cookbooks
  • solo.rb

レシピのひな形は下記のコマンドで作成する。

このコマンドでcookbooks/ntpが作られる。

たとえば、VMにapache2をインストールするというレシピの場合、まず下記でapache2という名前のcookbookを作る。

そしてcookbooks/ntp/recipes/default.rbを編集する。
下記は、インストール、サービスの有効化と起動を行うレシピ。

nodes/xx.xx.xx.xx.jsonを下記のように編集する。

これで実行できるはず。

ゲストOSを終了・削除する

下記で、起動終了。

下記で削除。

再起動。

Q&A

プロキシ環境下で実行したいのだけれど

Rubyのプロキシは環境変数http_proxyに設定。
* 変数名
http_proxy
* 値の例
http:/[プロキシのドメイン]:[ポート番号]

レシピ実行時にWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!が出る

下記のエラーが出て、レシピの実行に失敗する。

127.0.0.1のようなIPを複数のVMで使いまわすと出る。
これはknown_hostsを削除すればOK。

CookBookのサンプルが欲しい

下記から好きなcookbookをcookbooksディレクトリないでgit cloneすればOK.
https://github.com/opscode-cookbooks
自分で作らなくてすむ。

複数のレシピを実行するには

nodes/xx.xx.xx.xx.jsonに下記のように書く。

あとでやろうと思っていること

  • VirtualBoxのBase Box作成
  • NT Emacsのshellとの統合
  • PoderosaのCygwinが立ち上がらなくなった件の解決