今っぽい Vagrant + Chef Solo チュートリアル

  • 1083
    いいね
  • 4
    コメント
この記事は最終更新日から1年以上が経過しています。

Vagrant と Chef Solo ってとてもベンリそうに見えてたのですが、ネット上にあるのは断片的な情報が多かったり、そもそもいろんなやり方があって混乱してたので、サックリ始めるためのチュートリアルを書きました。これをきっかけにベンリな Vagrant ライフを堪能して頂ければ幸いです。

[追記10/10/2013]
Window 上の Vagrant でも問題なく動きました。ただ1点注意があって、UAC のポップアップに反応しないと、Vagrant か VirtualBox 側でタイムアウトになってしまうので、ポップアップを見張るか、放置したいなら一時的に無効にしておくとよいです。
[/追記終わり]

[追記 10/23/2013]
VirtualBox 4.3 だとまだうまく動かないようです(私も host-only adapter の作成で VirtualBox 側のエラーになりました)。https://github.com/mitchellh/vagrant/issues/2392
なので https://www.virtualbox.org/wiki/Download_Old_Builds から 4.2 系をインストールすると良いです。
[/追記終わり]

[追記 12/15/2013]
フォロワーさんに教えてもらったのですが、VirtualBox 4.3 のサポートきました! http://docs.vagrantup.com/v2/virtualbox/index.html
まだぼくは試してないのですが、ひとまず情報をアップデートしておきます。Thanks to @cosmo__ !!
[/追記終わり]

3行のまとめ

おすすめの進め方

もっとも良い進め方は "入門Chef Solo - Infrastructure as Code" を読んでからこのチュートリアルを始めるのが良いと思います。

ですが、いろいろと説明不足感ありますが簡単に試せるので、ひとまずこのチュートリアルを先に体験して、その後に Chef ってなんだろ?っていうのを解決する方法も悪くないようにも思えます。

わからないまま進めるのが嫌な人は Chef Solo のチュートリアルをしてから、とりあえず試してみたい人はこのチュートリアルから、という分け方になるやもしれないです。

あと今回のチュートリアルで使ったファイルを github に置いておきます。「これどこにかくんや!」ってなった時にどうぞ。

https://github.com/taiki45/vagrant-tutorial

では、チュートリアル本編です☆

チュートリアル〜

Vagrant

Virtual Box のような仮想化ソフトウェアを便利に扱うツールです。

どんなご利益があるのか興味あると思うのですけど、公式的には「自由に使えて、ポータブルで、持続的で安定した環境を開発者に提供する」という風になってます。サイコーですね!「僕の環境なら動くんだけど…」っていうバグとはオサラバです!

個人的にはさらに、設定ファイルが柔軟に書けたり、仮想化ソフトウェアを抽象化するインターフェイスを提供していて、プラグインを書くことでそれらを使えるので、便利なんだと思います。Vagrant が他のツールをうまくまとめてくれる感じです。

Vagrant は特に難しいことはないので1つ VM を起動してみて感じをつかんでみましょう。

インストール

vagrant -v が成功しました?さっそく VM を作りましょう!

初めての up

まずは設定ファイルを書かなくてはなりません。そのための便利なコマンドがほら!

vagrant init "Debian7" "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_debian-7.1.0_provisionerless.box"

カレントディレクトリに Vagrantfile が出力されたと思います。さっそく見てみましょう!

Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  #…
  #…
end

こんな感じに Ruby のブロックを使ってその中で設定を書くようになってます。Ruby で書くので独自に config.yml とかを作ってそれを読む込むとかもできますが、まあ最初はいらないと思います。

さっきの vagrant init コマンドに渡した引数はここに反映されています。

Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "Debian7"
  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_debian-7.1.0_provisionerless.box"
end

フー、box ってなんのことだ?この box というのは(程度の違いがあるけれど)最低限の構成の VM のスケルトンのことです。ここでは Opscode という Chef を開発したりしている企業の box リポジトリからひとつを指定しています。この名前の box がローカルにある場合は新たにダウンロードせずにローカルの box を使いますし、なければ URL から引っ張ってくる、ってワケですね。ちなみにすでにダウンロードした box ファイルは vagrant box add コマンドで追加したりできます。

なが〜い説明もおわったことだし、いよいよ立ち上げてみましょう!

vagrant up

なが〜いなが〜いダウンロードは終わりましたか?おつかれさまです☆ では VM の中に入っていきましょう!

vagrant ssh

ヒュ~、クール。簡単でしたね。

Shared folders

Vagrant は標準で Shared folders が設定されています。デフォルトだと Vagrantfile があるディレクトリと VM 上の /vagrant が同期されています。試してみましょう。

# ホストマシン上で
touch created_on_host
vagrant ssh

# VM 上で
cd /vagrant
ls
touch created_on_vm
exit

# ホストマシン上で
ls

gitignore

Vagrant を使ったプロジェクトを VCS で管理する場合 .vagrant ディレクトリを ignore するようにするのが(たぶん)おすすめです。

Vagrant まとめ

Vagrant は基本的に仮想化ソフトウェアを便利に扱うツールです。そこから先の Provisioning といってサーバーに必要なものをいれたり設定するのは Chef とかシェルスクリプトとか別のツールの役割です。そのあたりをうまく統合してくれるから強力なツールになるのですね。

ということで Vagrant に関して最初に知ることはこれだけです。とってもシンプルです。これからこのまっさらな VM を調理していく方法を紹介しますよ!

Chef Solo

実際に使う Chef Solo についてお話する前に Chef についてお伝えしなければなりませんね。

Chef って?

Chef は複数台のサーバーの構成を管理するためのツールです。1台の Chef サーバーと呼ばれるマスターノードみたいなのがいて、他のサーバーはその Chef サーバーを定期的に見に行くことで最新のサーバー構成を知り自身に適用していきます。入門 Chef-solo によると Facebook は数万から数十万台規模のサーバーを Chef で管理しているようです。となると Chef サーバー(マスターノード)は1台以上でもいけるのかもしれませんね。

Chef を使う上でお世話になるのが knife コマンドです。この knife は実際にレシピのひな形をつくったりとか、レシピをあるサーバーに適用したりとか、Chef が実際に調理する時の道具です。Chef という仮想の調理師が knife を振り回すことで料理(サーバー)ができる、そんなイメージですね。

さて次にたくさんある Chef の要素を必要なものだけ見ていきます。まずは構築手順のパッケージとして Cookbook というのがあります。概念としては RubyGems での gem とかと似てます。この Cookbook の中に実際に実行される Recipe が1個以上入っています。覚えるものはまずはこの2つで大丈夫です。実際には実行手順の汎用性を高めるために様々な要素が Chef にはあるのですが、全てハードコーディングして書けば最初はこれ以上いりません。

  • Chef はサーバー/クライアントモデルで複数台のサーバーを管理する
  • 実際に使うコマンドは knife
  • 同じ領域の実行手順をまとめたものを Cookbook と呼ぶパッケージにまとめる。実際に実行されるのはその中の Recipe

Chef Solo

このように本来は複数台のマシンでサーバー・クライアントモデルで使う Chef ですが、1台でも使えるように Chef Solo というコマンドがついてきてます。この Chef Solo は自分自身に対して Cookbook と呼ばれる構築手順を実行することができます。

  • Chef Solo は自分自身に対してのみサーバー構築手順を実行する Chef のサブセット

Vagrant + Chef Solo

Vagrant はプロビジョニングツールとしていくつか選べるのですが、Vagrant + Chef Solo の場合、

  1. Vagrant が VM を立ち上げる
  2. Cookbook を VM に転送する
  3. VM 上で Chef Solo を実行する

という手順になっています。

もっと便利に、Berkshelf + Chef Solo + Vagrant

Chef にはいくつかの抽象化するための要素があり、構築手順の汎用性を高めることができます。つまり1つの Cookbook をいろいろな OS、いろいろな設定に使いまわすことができるのです。

そこで、いろんな人が作った Cookbook を使いまわすために RubyGems に対する Bundler のような Cookbook 管理ツールがあります。それが Berkshelf です。

http://berkshelf.com/

この Berkshelf は Vagrant Plugin も開発されていて Vagrant 連携もバッチリです☆ Vagrant にプロビジョニングツールとして Chef Solo を使う場合いくつかやり方があるのですが、おすすめするのが Berkshelf を足したやり方です。

vagrant-omnibus

他の人が作った Box に chef が入っていなくて Chef Solo が走らない!っていうのはよくあることです。これを回避するために vagrant up 時に Chef が入っているか確認してインストールしてくれる Vagrant プラグインが vagrant-omnibus です。

https://github.com/schisamo/vagrant-omnibus

README 通りにインストールして

Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...
  config.omnibus.chef_version = :latest
  # ...
end

と書き加えればすぐに動きます。ベンリ!

Berkshelf + Chef Solo とチュートリアル再開

さてこれで道具の紹介は終わったので実際にレシピを書いていきましょう。まずはインストールですね☆

vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-berkshelf
gem i berkshelf

とっても簡単ですね。 では Helloworld をしましょう!

Berkshelf を使うには Berksfile というファイルが必要です。Gemfile のようなものです。さきほどの Vagrantfile と同じディレクトリに配置しましょう。

Berksfile
site :opscode

これは Gemfile でいうところの source "https://rubygems.org" と同じようなもので特にソースを指定しない場合は opscode からダウンロードします〜という意味です。

さて次に Cookbook を置くためのディレクトリの説明です。

詳しい作法をぼくはまだ良くわかってないのですが、汎用的な Cookbook を置く場所が cookbooks で、その環境構築固有の Cookbook を site-cookbooks に置くことが多いようです。berks init をしてみても cookbooks は git ignore の対象になったりしています。なのでその作法に従います。

ということで site-cookbooks というディレクトリをつくりましょう。おつぎに hello という Cookbook をつくります。

cd site-cookbooks
berks cookbook hello
cd -

なにやら hello/ 以下にいろいろ出力されたと思いますが、重要なのは hello/recipes/default.rb だけです。編集しましょう。

hello/recipes/default.rb
log "Hello World!!!!!!!!!!!!!"

次に VagrantfileBerksfile に Berkshelf と vagrant-berkshelf プラグインのための設定を書いていきます。

Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...
  config.omnibus.chef_version = :latest
  config.berkshelf.enabled = true
  # ...
end
Berksfile
site :opscode
cookbook "hello", path: "site-cookbooks/hello"

最後に Chef Solo の設定を Vagrantfile に書き足します。

Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...
  config.vm.provision :chef_solo do |chef|
    chef.run_list = ["hello"]
  end
end

最終的に Vagrantfile は次のようになります。

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "Debian7"
  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_debian-7.1.0_provisionerless.box"
  config.vm.network :private_network, ip: "192.168.33.10"

  config.vm.provider :virtualbox do |vb|
    vb.gui = false
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end

  config.berkshelf.enabled = true
  config.omnibus.chef_version = :latest

  config.vm.provision :chef_solo do |chef|
    chef.run_list = ["hello"]
  end

end

それではお待ちかねの vagrant up をしましょう!

まずは最初に立ち上げた VM を捨てて新しく up します。

vagrant destroy

y と答えて無事デストロイされればお次は up です。

vagrant up

おそらく Chef のインストールにそれなりに時間がかかることと思います。VM の起動 -> Chef のインストール -> Chef Solo の実行、とうまく動けば成功です。ログに Hello World!!!! って表示されましたか?うんうん、表示された?やりましたね!

MySQL をインストール☆

最後にコミュニティの Cookbook を使ってみましょう。

https://github.com/opscode-cookbooks/mysql

他の人が作った Cookbook を使う時のコツは README を読んで、そのあと attributes/recipes/ 以下を読むことです。この2つが Chef Solo では大きなキーです。

まずは README の Attributes の欄を読んでみます。大体ここは Chef 実行時に自分用に書き換えれる設定の一覧になってます。もし README に情報がなければ attributes 以下のファイルを直接読みましょう。OS 毎に設定を振り分けてるくらいであんまり難しくないです。

なんとなく設定項目がわかったら Usage を読みます。Opscode の MySQL Cookbook は親切にも Chef Solo の時のメモを書いてくれています!

さて大体のことはわかったと思いますので実践してみましょう。

設定ファイルカキカキ

まずは Berkshelf に MySQL Cookbook を使うってことを教えましょう。Berksfile にこう書き加えます。

Berksfile
cookbook "mysql"

これだけで Opscode のサービスから Cookbook をインストールしてくれます。インストール先はデフォルトだと ~/.berkshelf になるようです。

ではおつぎに Attributes の指定をします。この Attributes は Chef 本来のサーバー/クライアント運用であれば JSON 形式でサーバーからクライアントに渡されるものなので Vagrant-Chef でも chef.json という名前になっているようです。Hash で Attrubutes を設定していきます。

Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.run_list = [
      "hello",
      "mysql::client",
      "mysql::server"
    ]

    chef.json = {
      mysql: {
        server_root_password: "iloverandompasswordsbutthiswilldo",
        server_repl_password: "iloverandompasswordsbutthiswilldo",
        server_debian_password: "iloverandompasswordsbutthiswilldo",
        bind_address: "127.0.0.1"
      }
    }
  end

ついでに Chef の run_list にも実行するレシピとして mysql レシピを追加しています。これは Opscode の MySQL Cookbooks の recipes/ 以下を見てもらえるとわかるのですが、このように run_list を設定すると recipes 以下の対応する名前のレシピが実行されます。Cookbook の名前のみを指定した場合(ここでは hello がそれ)、その Cookbook の recipes/default.rb が実行されます。

では VM を調理しましょう。えいや!

vagrant provision

オオー、上手に焼けました!さてさてうまくインストールされたか確認しましょう。

vagrant ssh

# VM 上で
mysql -uroot -piloverandompasswordsbutthiswilldo

MySQL サーバーにつなげたでしょうか?このようにして、コミュニティの Cookbook を有効活用できれば VM 構築がもっと楽になりますよ!

ボクタチのこれから

くぅ~疲れましたw これにて完結です!

たぶん、この分量だといろいろ足りなかったとおもいます。なので学習のポインタをカキカキさせて頂いておわりにします。

Vagrant について
* 公式サイトが良いです。 http://docs.vagrantup.com/v2/
* ベンリ Vagrant プラグイン https://github.com/jedi4ever/sahara

Chef について
* Docs http://docs.opscode.com/ の Cookbooks あたりを読むと必要な情報が手に入ります。
* まずは Resources を覚えるところからがいいと思います。 http://docs.opscode.com/resource.html

Berkshelf について
* 公式サイトが良いです。 http://berkshelf.com/
* :path 指定してローカルの Cookbook を参照できたように :git とか :github とかのオプションを渡すとそこの Cookbook を参照できます。ベンリ!

Ruby のリテラルについて
* たぶん Ruby を知らない人は%記法にびっくりすると思うので http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2fliteral.html#percent

Cookbook について
* https://github.com/opscode-cookbooks にベンリ Cookbook がある。
* なにかしたいことがあれば "したいこと cookbook" とかでググればわりと出やすい。その場合 github に置かれていることが多いので Berkshelf の :github オプションが役に立ちます。

それでは楽しい Vagrant ライフを!