ほわいとぼーど

ぷろぐらまのメモ帳

Vagrantでknife-solo+Serverspecなboxを作っていた話

6月くらいからVagrant+knife-solo+Serverspecを使っています。
これらのツールを使った記事は非常に多い昨今ですが、
自分の使い方を構築の仕方を簡単に書いてみようかと。

■自分の使い方
よく見る記事はだいたいmacでローカルにVagrantとknife+Chefを入れて
vagrant upしたVMに対してknife solo cookする例がおおいかと思います。
一方で自分の場合はWindowsです。
Windows上にLinux上で活躍するツール類を入れるのは出来なくはないけど結構苦労が伴います。
ここら辺をどうにかするのが面倒だったし、
Windowsは環境によって異なる部分が出て来やすいOSなので、
人に勧めたりするにも安定した環境を作れたほうが良いという事で
自分の場合全てをVagrant+VirtualBoxに押し込んで使ってます。
つまり、knife-solo+Serverspec用のBoxを作りました。
Box化すると配布して布教が楽だと思ったのも理由の一つですが出来ていません。
デプロイを試すには最低2回vagrant upが必要です。
ログインはTera TeramやputtyPoderosaみたいなTerminalソフトで。
自分はタブで複数ログインできるPoderosa使ってます。
Vagrantfileで内部IPを192.168.100.xxxな感じで付けて
node.jsonもIP名で作って、Serverspecのattributes.ymlもIPで
相手を指定できるようにして使っています。
http://a3no.hatenablog.com/entry/2013/09/07/041625


■作り方
一時期はRuby2.0.0を入れて作ったりしてたのですが、
そのRubyをServerspecが参照できてないことに後で気づいたりして、
結果的に以下の記事を参考にさせてもらうことで完成しました。

http://ch.nicovideo.jp/dwango-engineer/blomaga/ar322283

この記事最近やんけ!!と思った方そのとおりです(汗
まぁ、ServerspecはRuby1.8.7でも問題なく動いていたので特に問題なかった、、、かも。

今回使ったBoxは、
 Official Ubuntu 12.04 daily Cloud Image amd64 (No Guest Additions)
 http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-vagrant-amd64-disk1.box

vagrantは内部IPや外部IPを設定することが出来ますが、
そのままvagrant packageするとNICも覚えた状態のBoxになったので、
ココでは設定なしで127.0.0.1:2222でTerminalログインします。

$ sudo su -
# curl -L https://www.opscode.com/chef/install.sh | bash
# /opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc
# /opt/chef/embedded/bin/gem install rake --no-ri --no-rdoc
# /opt/chef/embedded/bin/gem install serverspec --no-ri --no-rdoc
# ln -s /opt/chef/embedded/bin/rake /usr/bin/rake                                          
# ln -s /opt/chef/embedded/bin/rspec /usr/bin/rspec  
# exit

ツールのインストールは以上。
他にtreeとかjqとか入れておくと幸せになれるかもしれない。

次に設定。
設定する際のユーザはデフォルトログインユーザである/home/vagrantでしてます。

$ cd ~
$ knife configure [設問を全てエンター]
$ echo "knife[:solo_path] = '/tmp/chef-solo'" >> .chef/knife.rb

ここで出来た~/.chef/knife.rbに何か追記するんだけど忘れた。
クライアント側でレシピをどこに置くかのパスだった気がする。

(追記)クライアント側でレシピを指定したパスに展開します。
指定しないとユーザホーム配下だった気がします。

$ mv /tmp/insecure_private_key ~/.ssh
$ vi ~/.ssh/config

Host    192.168.100.*
	Port    22
	IdentityFile ~/.ssh/insecure_private_key
	IdentitiesOnly yes
	StrictHostKeyChecking no
	PasswordAuthentication no

それからknife soloやrake spec時に毎回パスワード聞かれないように
Vagrant専用鍵を.ssh配下に設置して.ssh/configを作成します。
Vagrant専用鍵はWindowsではC:\Users\<ユーザ名>\.vagrant.d\insecure_private_keyです。
これについては既に過去に書いています。(http://a3no.hatenablog.com/entry/2013/06/22/002250
Hostは自分が使いたいサブネット等を適宜指定してください。
そして忘れずに権限を変えてください。

$ chmod 600 ~/.ssh/*

更に初めての人の場合、che-repo(Chefのレシピを置く場所)を作ったり、
serverspec-init(Serverspecの設定ファイルを作成)するわけですが、
自分は既にあるのでその作業はやらないし、
初めての人でもChefやServerspecのファイル一式を持ってくればいらないです。
自分の場合、~/chef-repoの中に以下のような感じ構成を作ります。
(なおやさんのをお借りしました:https://github.com/naoya/jenkins-vagrant-test
knife solo init chef-repoで出来たディレクトリの中に
ServerspecのRakefileとspecディレクトリを入れただけです。
そしてBox作るたびにレシピを入れるのは面倒なので実際にはココではリンクを張るだけにします。

$ ln -s /vagrant ~/chef-repo

Vagrantはデフォルトで/vagrantに起動ディレクトリがマウントされています。
なので、とりあえず必要なファイルがあったら起動ディレクトリに置けば
/vagrantから取り出すことが出来ます。
更にVagrantfileで以下の設定を追加すればマウント先を変えることが出来ます。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.define :host do |host|
    host.vm.box =  "chef-host"
    host.vm.synced_folder "/workspace/chef-repo", "/vagrant"
    host.vm.network :private_network, ip: "192.168.100.100"
  end
end

synced_folderの部分がそうです。
自分の場合、Eclipseのworkspace内にChefレシピ用のプロジェクトを作って、
そこにリンクして管理しています。

後は出来たBoxをvagrant packageすると起動ディレクトリにpackage.boxとして
パッケージングされるので適当な名前に変えて管理したりbox addしたりします。

■その他いろいろ

・boxは余計なものが少ないほど容量が少なく、容量が少ないほど起動が早いです。
 (もちろんOSにはよるでしょうが)
・ChefClient側(デプロイされる側)のBoxも既にChef-solo入れたものを用意してます。
 knife solo prepareでChef-soloインストールしてくれるのですが、
 ダウンロードするので毎回だとどうしても遅いです。
 先に入れておいたBox作っておけばknife solo prepareする必要なく、
 vagrant up→knife solo cookできます。
・普通にgem install knife-soloした場合、gemでche-soloが入ってしまい
 意図したRubyが使われないことになります注意。


とりあえずこんな感じでしょうか。
後は職場はプロキシを通す必要があってその辺は後で書こうかと。 書いた