読者です 読者をやめる 読者になる 読者になる

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

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

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

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無効にしろって話なのですが。。。

SSL - パスフレーズを入力しないでApacheを起動するには



Apacheの起動時に、鍵のパスフレーズを入力しないで起動する。

鍵のパスフレーズを設定していると、Apache起動時に鍵のパスフレーズ
入力が必要。ただし、OS起動時に自動起動できなくなってしまう。

パスフレーズを設定しない鍵を使うこともできるが、
外部スクリプトからパスフレーズを流し込むことでApache起動時に
パスフレーズを入力する必要がなくなる。

mod_ssl のディレクティブ SSLPassPhraseDialog を builtin から exec に変更する。
execで指定したスクリプトを実行した際の標準出力が、パスフレーズとして利用される。

httpd.conf ( または、extra/httpd-ssl.conf )
SSLPassPhraseDialog  exec:/some/dir/passphrase
スクリプト

上記で指定したパス(/some/dir/passphrase)のスクリプトを作成する

#!/bin/sh
echo "鍵のパスフレーズ"

パスフレーズは生で保存する必要があるので、
他のユーザから実行・アクセスできないようパーミッションの管理に注意する。