chef + vagrant - 仮想環境をラクにする
vagrant (べいぐらんと) を使って仮想環境をラクに使えるようだ。
chef のテストに便利。
設定ファイルを用意したり概念を理解したりで
敷居がちょっと高いが、慣れれば簡単だった。
vagrantの使い方を説明したものはQiita上などに数多あるようだが、
覚え書き程度にまとめておく。
今回は、
を使用している。
ホストOSは、WindowsやLinuxも使うことができる。
vagrant 環境の構築
- プロジェクト初期化 (vagrant init)
- Box の追加 (vagrant box add)
- 仮想マシン実行 (vagrant up)
- 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 を使う
- chef をゲストOS上に構築するプラグインのインストール
- Berkshelf をvagrantから使うプラグインをインストール
- レシピを用意(Berkshelf を使う or 自分で作成する)
- Vagrantfile を編集
- プロビジョンの実行 (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
MySQL - バージョンアップしたら起動できなくなった
Oracle にある RPM を使って MySQL を 5.6 にバージョンアップしてみた。
OSは CentOS 6.5。
起動してみると、エラーが。。。
# /sbin/service mysql start Starting MySQL.The server quit without updating PID file (/var/lib/mysql/xxxx.pid).
ログをみるとアクセス権でエラーがでているらしい。
2014-06-29 12:04:54 7ff0b67a6720 InnoDB: Operating system error number 13 in a file operation. InnoDB: The error means mysqld does not have the access rights to InnoDB: the directory. 2014-06-29 12:04:54 17628 [ERROR] InnoDB: os_file_get_status() failed on './ibda ta1'. Can't determine file permissions 2014-06-29 12:04:54 17628 [ERROR] InnoDB: The system tablespace must be writable ! 2014-06-29 12:04:54 17628 [ERROR] Plugin 'InnoDB' init function returned error. 2014-06-29 12:04:54 17628 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGI NE failed. 2014-06-29 12:04:54 17628 [ERROR] Unknown/unsupported storage engine: InnoDB 2014-06-29 12:04:54 17628 [ERROR] Aborting
といっても、アクセス権はあるし、mysqld_safe では起動するし。。。
で、調べてたら SELinux のでした。
# restorecon -R /var/lib/mysql
これで解決。
まぁ開発環境ならSELinux無効にしろって話なのですが。。。