そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

chef + vagrant - 仮想環境をラクにする


vagrant (べいぐらんと) を使って仮想環境をラクに使えるようだ。
chef のテストに便利。

設定ファイルを用意したり概念を理解したりで
敷居がちょっと高いが、慣れれば簡単だった。

vagrantの使い方を説明したものはQiita上などに数多あるようだが、
覚え書き程度にまとめておく。

今回は、

を使用している。

ホストOSは、WindowsLinuxも使うことができる。

用意するもの

それぞれをインストールしておく。

vagrant 環境の構築

  1. プロジェクト初期化 (vagrant init)
  2. Box の追加 (vagrant box add)
  3. 仮想マシン実行 (vagrant up)
  4. ssh仮想マシンにログイン (vagrant ssh)

が基本の流れ。

プロジェクト初期化

vgtest というプロジェクトを作成する。
ディレクトリはどこに作ってもよい。

$ mkdir vgtest
$ vagrant init

Vagrantfile が作成される。

Boxの追加

Box は Vagrant 向けにカスタマイズされた公開されているOS毎のテンプレートのようなもの。
各プロジェクトは、Box を複製してそれぞれ別の仮想マシンが起動される。

利用可能な Box はDiscover Featured Vagrant Boxesから取得できる。OSおよび仮想ソフトウェア毎に用意されている。

$ vagrant box add "chef/centos-6.5"

実行すると次のようなメッセージが表示されるので VirtualBox を選択。

This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) virtualbox
2) vmware_desktop

Enter your choice: 
仮想マシン実行

はじめに使用するBoxを指定する。config.vm.box パラメータで指定する。
Vagrantfile は Ruby の文法で記載されているのでパラメータの意味だけ覚えればよい。

$ cd vgtest
$ vi Vagrantfile

Vagrantfile は以下の通り。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.5"      # 使用する Box名を指定

  # メモリを 1GBにする場合は以下を指定。指定しない場合は 384MB。
  config.vm.provider "virtualbox" do |vb|
     vb.customize ["modifyvm", :id, "--memory", "1024"]
   end
end

ようやく仮想マシンを実行する。

$ vagrant up

いろいろ表示されてプロンプトが戻ってきたら起動完了(しているはず)。
エラーが発生したら赤色で表示される。

ssh 接続
$ vagrant ssh
[vagrant@localhost ~]$

vagrant ユーザで接続される。鍵認証でパスフレーズなし。
ゲストOSへ接続後は sudo でパスワードなしでログインできる。
ホストOS上のプロジェクトディレクトリは、ゲストOS上で /vagrant にマウントされている。

※ kernel を更新した場合などではゲストOS上で以下のコマンドを実行する。
gccやkernel-develなどが必要だが、chef/centos-6.5 には含まれていない。
要注意。

[vagrant@localhost ~]$ /etc/init.d/vboxadd setup

vagrant から chef を使う

  1. chef をゲストOS上に構築するプラグインのインストール
  2. Berkshelf をvagrantから使うプラグインをインストール
  3. レシピを用意(Berkshelf を使う or 自分で作成する)
  4. Vagrantfile を編集
  5. プロビジョンの実行 (vagrant provision)
プラグインのインストール

chef をゲスト OS上に構築するプラグイン
schisamo/vagrant-omnibus · GitHub

Berkshelf をvagrantから使うプラグイン
berkshelf/vagrant-berkshelf · GitHub
をインストールする。

$ vagrant plugin install vagrant-omnibus
$ vagrant plugin install vagrant-berkshelf --plugin-version 2.0.1

vagrant-berkshelf は --plugin-version 2.0.1 を指定しないと動かなかった

レシピを用意

今回は Berkshelf を使って公開されているレシピを使う。
berkfile を gem でインストールしておくと便利。

$ cd vgtest
$ bundle init --path vendor/lib  # --path 以下は必要ならば
$ vi Gemfile
gem "berkshelf" # ←を追加
$ bundle install

berks init で Berksfileを作成する。必要なレシピをダウンロードする。

今回は git レシピを使う。

$ berks init  # ※参照
$ vi Berksfile
source: "https://api.berkshelf.com"
cookbook "git"   # ←を追加 

※ berks をホストOS上に入れたくない場合は、vi で Berksfile を作成する
※ gem(berksなど) を bundle の--path を使ってインストールした場合、 適宜 bundle exec berks を補う。

自分で書いたレシピを使う場合は site-cookbooks 以下に用意して、Berksfile で 以下のように指定する。

cookbook "myrecipe", path: "site-cookbooks/myrecipe"

Vagrantfile を編集する
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  # Berkshelf を用意する
  config.berkshelf.enabled = true
  # chef をインストールするバージョンを設定する
  config.omnibus.chef_version = :latest

  # chef の設定。 run_list はレシピ名を列挙する
  config.vm.provision "chef_solo" do |chef|
    chef.run_list = [
      "git"
    ]
  end
end
プロビジョンする
$ vagrant provision