フロントエンド開発Blog

オレには鈍器がある

このエントリーをはてなブックマークに追加

centos , chef , gem , knife , linux , ruby , sandbox , vagrant

今までwindowsでWEBを作るときはXAMPPを使ってローカル環境を作っていました。ですがサーバサイドが絡む事案が発生すると途端に本番とローカルの環境差にやられて「あああああ!やりにくい!!」となること必至でした。

更に、昨今nodejsやらrubyやらでフロントエンド開発を効率良くしてくれるツールなんかも「windowsだとうまくうごかないかもね(てへぺろ」とされて悲しい思いをすることが少なくありませんでした。

ということでそういうときはスポットでvirtualboxにcentosを入れて使ってましたが、最近はvagrantが熱いよ、ということでvagrantを導入してみることにしました。

やりたいこと

  • Vagrant + VirtualBoxでヘッドレスな仮想環境(GUIいらない)
  • メインPCとサブPCで同一の仮想環境を簡単に作りたい
  • chef soloとか使ってみたい(やってみたいだけ)

最後のは完全に興味本位です。はい。

諸々インストール

VirtualBoxインストール

windows用のインストーラがありますので簡単インストールですね。

Vagrant

こちらもインストーラがありますね。

rubyをインストール

windowsにrubyを入れます。chef soloをwindowsから実行(knife solo)してみようと思ったので。

rubyのDEVELOPMENT KITも導入しときます。ダウンロードしたら

ruby dk.rb init
ruby dk.rb install

なお、initの段階でconfigのyamlが生成されますが、エディタで開いてrubyのパスがちゃんと記述されているか確認し、書かれていないないしパスが違うようなら訂正してからinstallします。

gemでchefを入れてみる

gem install chef

なお、私の環境だけかもしれませんがネット回線によってはgem installができないという現象にぶつかりました。別回線を試したところOKでした。デザリングオプション万歳!

chef dkも必要・・・?

ネットで調べると必要!という方と言及していないかたといらっしゃるのでとりあえず入れてみました。

gemでknife-solo

あ、そうだwindowsから仮想環境に向けてchef-soloを実行するならknife-soloを使え、ということらしいのでこれも入れておきます。

gem install knife-solo
knife configure

コンフィグは全部Enterでも大丈夫、との情報があった(気がする・・・うろおぼえ)のでとりあえずそのままにしちゃいますね。

cygwinを入れてコマンドプロンプトからsshが使えるようにする

cygwinに関してはいろんな方法が情報掲載されているので割愛。というか今思ったけどcygwinにknife-solo入れればよかった・・・?

ま、まあ元気出していきましょう!このままいっちゃいます!インストール諸々の次はいよいよVagrant起動です。


Vagrantをとりあえず使ってみる

vagrantパッケージ選定

Vagrant実行ディレクトリはc:\vmにします。cloudにアップされているvagrant box packageをインポートして使おうと思います。

今回はcentos6を提供している「scalefactory/centos6 」を使わせていただきました。使い方は簡単。

cd c:\vm
vagrant init scalefactory/centos6
vagrant up --provider virtualbox

これでひとまず起動しました。まだ空っぽの状態ですね。

Vagrant plugins

今回、chef-soloを使いたいのと、念のためsandbox機能を入れたいということで以下を入れました。

vagrant plugin install vagrant-omnibus
vagrant plugin install sahara
vagrant plugin list

omnibusを使うため、Vagrantfileに以下を追記

config.omnibus.chef_version = :latest

vagrant-omnibusは、vm側にchefが入ってない場合でも自動でインストールしてくれるプラグインです。自分の手元にchefのレシピがあってそれを使いたい、だけど元のパッケージにはchefが入ってない場合はそれを検知していいようにインストールしてくれます。

vagrant-saharaはsandbox機能を追加します。sandbox機能をonにしたときの状態を保存し、rollbackするとその時点に巻き戻せます。commitとするとrollbackする地点を現在の状態に進めることができます。


# sandboxモード開始
$ vagrant sandbox on

# 変更を決定する
$ vagrant sandbox commit

# 変更を破棄し、ロールバックする
$ vagrant sandbox rollback

# sandboxモード終了(commitしていないものは破棄される)
$ vagrant sandbox off

# 現在sandboxモードかどうかの確認
$ vagrant sandbox status

windowsからknife-soloしてみるが・・・だめだ!

knife初期設定

cd c:\vm
knife solo init chef_repo
knife cookbook create setampenv -o chef_repo/cookbooks

# vagrantファイル追記
config.vm.provision :chef_solo do |chef|
  chef.cookbooks_path = "chef_repo/cookbooks"
  chef.roles_path = "chef_repo/roles"
  chef.data_bags_path = "chef_repo/data_bags"
  chef.run_list = "setampenv"
end

レシピを書く

他の方が公開されているものをベースに自分なりに書き換えてみることをおすすめします。割愛!!

knife-solo実行

ここでvm側にchefが入ってないなら「knife solo prepare vagrant@localhost -p 2222」とするとvm側(というかknife-soloの向き先というほうが正しい・・?)にchef soloをインストールしてくれます。あ、ちなみport:2222というのはVagrantがホストマシンとゲストマシンとでポートフォワーディングを設定してくれてて、localhost:2222がゲストの22番ポートに到達する仕組みになってます。(httpdは8080だったかな?http://localhost:8080/でアクセスするとゲストの80ポートを読みにいく)さて、実際にknife soloを実行してみます。

knife solo cook vagrant@localhost -p 2222

・・・あるぇー!?エラーです。SSH接続できないとな・・・どうやら調べてみるといろんな方がこの現象にあってて「windowsで革新的なことはできねえやチキショー!」と涙を流していらっしゃる方がたくさんいるようで・・・今回は私も現行のsshとgemで入れたchefやknifeとの相性か何かが悪かったようでどんだけやってもだめでした。うーんrubyのインストールからまたやり直せばいいのかも知れないけど。。。今回は時間の関係上、見送ります。


linuxでchef soloすることに

Vagrantのプロビジョニングとchef soloを組み合わせてウハウハ環境自動化、といううまみは半減してしまいますが

  1. 仮想環境の管理はVagrant+sandbox
  2. 仮想環境のセットアップは仮想環境下でchef solo

というように分けてしまいました。これならレシピ作ったのが無駄になりませんから。。。レシピ自体はlinuxからは「/vagrant」にマウントされる「c:\vm」配下においてありますのでそのまま行きます。

centos6 rubyをアップグレード

rubyのバージョンが古くてchefがちゃんと動作しない・・・?みたいなのでrubyをアップグレードしました。あ、今思うともしかしてwindowsからのknife soloがうまくいかなかったのって、このゲスト側のOSネイティブなrubyのバージョンが古かったことが関係してたのかな・・・次回検証ということで・・・

rubyのアップグレードは以下のサイトを参照しました。

//windowsからssh接続 cmd.exeから
vagrant ssh

$ su
>pw: vagrant
//後はserver world様の御指示通り・・

元のパッケージの仕様なのでしょうか、vagrantユーザにpasswordがvagrant、rootのpasswordもvagrantとなっていました。

ゲストマシンにknife-solo

# gem install knife-solo

うーん今思えばここはchef-soloでよかったか。。。でも一回knife solo使って見たかったんです。


問題発生:chefが二人いる!?

こちらの方と同じ現象に遭いました。。。vagrant up したとき、pluginのomnibusがchefをインストールしたようです。それでchefが二人いて旨く動かない。

gemで入れた方を正とし、以下のようにシンボリックリンクを張りなおしました。

gem which chef
	/usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/lib/chef.rb

ls -la /usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/bin
ln -sf /usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/bin/chef-apply /usr/bin/chef-apply
ln -sf /usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/bin/chef-client /usr/bin/chef-client
ln -sf /usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/bin/chef-shell /usr/bin/chef-shell
ln -sf /usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/bin/chef-solo /usr/bin/chef-solo
ln -sf /usr/lib64/ruby/gems/2.2.0/gems/chef-12.4.1/bin/knife /usr/bin/knife

やっとうごいた!

knife solo cook vagrant@localhost でやっとこさ自動設定が始まりました。いやー長かった!

正直、一人で使うだけの開発環境であればvagrantもchef soloもあまり「すげええ!」というような恩恵はないかなと思いました(いや、もちろん便利ですよ?そこは誤解のないように言っておきます)。Vagrantの利点は「Vagrantfileによる設定のテキストファイル化と、virtualboxの優秀なラッパー、後述するvagrant特有のサービスが使える」ことかと思います。chef soloも「設定のテキストファイル化」ですかな。chef自体は「1度に大量の、同じ構成のサーバを作る」という強力な使い方がありますが、今回の私の目的「自分の環境を作る」という完全soloユースの場合は正直shellでできますしね。

vagrantのプロビジョニングとchef soloを組み合わせたら「オレオレな環境をanytime, anywhere, すぐさま構築できるぜ」というシチュエーションを作っておいておける点は良いと思うし(設定ファイルだけdropboxとかbitbucketのプライベートリポジトリにpushしておけばOK)、万が一「ああああああゲストマシンぶっこわしたーーー」となってもvagrant sandbox rollbackをしたり、また1からvagrant destroyしてvagrant upしても良し。

真価を発揮するのは「人に自分の開発環境を委譲する」時とか、「皆、この環境で開発してくれ」というときに良さげです。vagrantfileとchefレシピを配布して「あとは各自vagrant upしてねー」ということが出来る。

まぁ僕のようにwindowsでうまくうごかないーという人もいるのでchefに依存するのはちょと危険かもです。そんなときはpackageを作ってそれごと渡しちゃいましょう。


配布用packageを作る

packageとは

最初のほうでvagrant init XXXXXXXとやったと思いますが、あれはcloudからboxファイルというパッケージを落として初期化しているんですが、そのパッケージを自分でも作れちゃいます。そのパッケージを使って他のマシンに展開することが可能。

package作る前にやること

これはvirtualboxの仮想環境を別のマシンに移動するときなんかも同じですが、以下のようにしてdhcpで割り振られたIPとmacアドレスの紐付け情報をストアしているファイルをごっそり初期化しておく必要があります。これをしないと、仮想環境を移動したときにmacアドレスが変わるんですが、そうするとネットワークに接続できなくなり、他の人に渡しても「つかえないよー」と怒られます。

sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules

packageを作る

Vagrantfileのあるところで

vagrant package

すると仮想マシンを起動していたら自動でシャットダウンしてpackageを作ってくれます。後は、他の人のマシンとかで

vagrant box add boxname /path/to/package.box

とやれば移行できます。


Vagrantあるある

ここではぶつかった問題を。。。

apacheが自動起動しない

chkconfigでonにしてるのに・・・立ち上がりません。これは/vagrantなど、vagrantの共有フォルダをDocumentRootにしたとき起きます。どうやらこの共有フォルダというのはマシンが立ち上がった「後」にマウントされるようです。順序が逆だーということで以下のように起動スクリプト自身を変えて対応しました。

# vim /usr/local/bin/vagrant-mount-checker

```
#!/bin/sh
check_vagrant_mount() {
  local prog=$1;
  for ((i = 1; i <= 6; i++))
  do
      [ -f /vagrant/Vagrantfile ] && return 0
      sleep 5
  done
  /usr/bin/logger -t vagrant-mount-checker "$prog couldn't start, because the vagrant shared directory didn't mount."
  return 1
}
```

# vim /etc/init.d/httpd

```
#最初に
. /usr/local/bin/vagrant-mount-checker
check_vagrant_mount `basename $0`|| exit 1
```

apacheでhtmlやcss変えたのにぜんっぜん反映されない

キャッシュか!?と思いきや違う。。。CSSを変更しても変更しても反映されずに困りました。調べると、

<Directory "/path-to-nfs-files">
EnableSendfile Off
</Directory>

というのが必要だというのです。

これで# service httpd graceful してみてだめだったら


EnableMMAP Off
EnableSendfile Off

にしてみるといいかと思われます。


より便利に

まじっすか!!というのが正直な印象。こりゃいいですね。お仕事ではちょっと情報が漏れちゃったりしないか心配ですけど自分の趣味とか個人活動の範囲であればこれを使ってみたい。「こういうのオレつくってんだけどどうよ?」とドヤ顔し放題ですねわかります。


とまあこんな具合につらつらとVagrantについて書きましたけどいかがでしょうか。windowsをこよなく愛するけどWEB開発がしんどいなーXAMPPに限界を感じてるわーという方、是非お試しいただけたらと思います。

ページトップへ

関連ページ

ページトップへ