このチュートリアルは初めて Vagrant のプロジェクトを作るためのものです。
普通の Ubuntu VM を作るところから始めて、プロヴィジョニングツールとして Chef を使って次のような操作を行います。
- パッケージマネージャによる vim と git のインストール
- JSON 設定ファイルを使ったユーザアカウントの作成
- 特定のユーザのためのドットファイル (.bashrc、.vimrc など) を git リポジトリに作成
最後に、構築した VM 環境を新しい "Vagrant box" として簡単にパッケージングできることを説明します。 すぐにあなたのプロジェクトに配備できるし、他の人々とも共有できるものです。
Vagrant の基本的な知識については次のリンクを参照してください。
- http://vagrantup.com/v1/docs/getting-started/index.html
- http://vagrantup.com/v1/docs/provisioners/chef_solo.html
VirtualBox のダウンロードとインストールは https://www.virtualbox.org/wiki/Downloads からどうぞ。 Vagrant のダウンロードとインストールは http://downloads.vagrantup.com からどうぞ。
Precise Pangolin Ubuntu 12.04 の vagrant box を使います。 http://vagrantbox.es/ を参照してください。
vagrant box add precise64 http://files.vagrantup.com/precise64.box # 323MB, ダウンロードが早いもので
新しい Vagrant プロジェクトは ~/code/vagrant-tutorial で作ります。 今インストールしたばかりの precise64 box を雛形にします。
mkdir -p ~/code/vagrant-tutorial/ & cd ~/code/vagrant-tutorial/
vagrant init precise64 # Vagrantfile の雛形がカレントディレクトリに作成されます
Vagrant で VM を起動します。デフォルトの Vagrantfile によって設定されたものです。
vagrant up
VM は VirtualBox で実行しています。パスワード無しの ssh でログインできます。
vagrant ssh # ssh in to the VM
作成した VM 上の /vagrant ディレクトリは、~/code/vagrant-tutorial と共有されていることを覚えておきましょう。
ls /vagrant # プロジェクトのルートディレクトリが共有フォルダとしてマウントされています
それでは Vagrantfile を編集していきましょう。Vagrant に VM を再構築させる 3 つの方法があります。
# 一番高速です。VM を止めずに provisioner (例: chef-solo) を再実行します
vagrant provision
# VM を再起動してから provijion を実行します。virtualbox の設定 (共有フォルダ等) を変更した場合はこれを実行してください
vagrant reload
# VM を破棄して雛形から作り直します
# 遅いけど安全です
vagrant destroy --force && vagrant up # deletes the VM and rebuilds
Vagrant のいいところは変更した設定を VM に適用するのが簡単なところです。 次のようなことができます。
- パッケージのインストール (
apt-get install vim
) - 設定ファイルの更新 (
/etc/apache2/httpd.conf
) - ユーザアカウントの準備
- スクリプトの実行
Vagrant ではこのプロセスを "provisioning" と呼びます。Puppet は Chef といったメジャーなツールをサポートしています。
このチュートリアルでは Chef-solo を使います。これは単体サーバで使う Chef です。Chef ではサーバをセットアップするスクリプトを "recipes" と呼び、関連する recipes をグループにしたものを "cookbooks" と呼びます。 (雰囲気は掴めますか?)
このチュートリアルでは chef-solo を使って次のような cookbooks を適用します。
- vim: 基本的に
sudo apt-get install vim
を実行します - git: 基本的に
sudo apt-get install git
を実行します - users: JSON 設定ファイルからユーザアカウントを作成します
- homesick: 公開 git リポジトリからユーザごとのドットファイル (例:.vimrc、.bashrc) をインストールします
次の cookbooks はおまけですが、ssh の公開鍵認証の必要なドットファイルリポジトリをサポートするために必要です (エージェント転送します) 。
- homesick_agent
- extend_lwrp
- root_ssh_agent
- ssh_known_hosts
カスタム cookbooks がどんな風に実行されるのかもっと知りたければ (そして私が Chef を勉強するために参考にしたのは) 次のサイトを参照してください。
- https://github.com/dergachev/chef_homesick_agent#readme
- https://github.com/dergachev/chef_users#readme
- https://github.com/dergachev/chef_root_ssh_agent#readme
- https://github.com/dergachev/chef_extend_lwrp#readme
cookbooks (chef のデプロイメントスクリプト) と databags (JSON 設定ファイル) のサブディレクトリを作ります。
mkdir ~/code/vagrant-tutorial/site-cookbooks
mkdir ~/code/vagrant-tutorial/cookbooks
mkdir ~/code/vagrant-tutorial/databags
コミュニティでメンテンンスしている cookbooks を cookbooks
に配置します。
cd ~/code/vagrant-tutorial/cookbooks
git clone git://github.com/fnichol/chef-homesick.git homesick
git clone git://github.com/opscode-cookbooks/ssh_known_hosts.git
git clone git://github.com/opscode-cookbooks/vim.git
git clone git://github.com/opscode-cookbooks/git.git
このチュートリアルのためにカスタム cookbooks を作ったので site-cookbooks
に配置します。
cd ~/code/vagrant-tutorial/site-cookbooks
git clone git://github.com/dergachev/chef_homesick_agent.git homesick_agent
git clone git://github.com/dergachev/chef_root_ssh_agent.git root_ssh_agent
git clone git://github.com/dergachev/chef_users.git users
git clone git://github.com/dergachev/chef_extend_lwrp.git extend_lwrp
cookbooks を配置したら cookbooks のディレクトリ名と cookbook の名前が一致しているかよく確かめてください。
- 間違い:
git clone git://github.com/dergachev/chef_users.git
- 正解:
clone git://github.com/dergachev/chef_users.git users
users
、homesick
、ssh_known_hosts
の cookbooks には、次のサブディレクトリに配置された JSON 設定ファイルが必要になります。
mkdir -p ~/code/vagrant-tutorial/databags/users
mkdir -p ~/code/vagrant-tutorial/databags/ssh_known_hosts
作成するユーザごとに、databags/users/USERNAME.json
という形式で配置した設定ファイルが必要です。ユーザにドットファイル用のディレクトリがある場合はそれも配置しなければなりません (homesick ではそれを calstels と呼びます) 。後で 'homesick_castles` プロパティを追加することになります。
例として次の内容を databags/users/testuser.json
に保存してください。次のフィールドの値を変えないといけないので注意してください。
id
: ユーザ名。json ファイル名と同じでなければなりません。password
: パスワードハッシュ。openssl passwd -1 "password123"
で生成してください- セキュリティを気にしているなら
openssl passwd -1
を実行してからパスワードをタイプしてください
- セキュリティを気にしているなら
ssh_keys
: SSH 公開鍵の中身です- もう鍵があるなら
cat ~/.ssh/id_rsa.pub
とでもすればいいでしょう - 設定の仕方が分からなければ https://help.github.com/articles/generating-ssh-keys を参照してください
- SSH のエージェント転送が分からなければ https://help.github.com/articles/using-ssh-agent-forwarding を参照してください
- もう鍵があるなら
homesick_castles
: git clone することになるドットファイルのための git リポジトリです- ドットファイルリポジトリは homesick と互換性が無ければなりません。https://github.com/technicalpickles/homesick#readme を参照してください
- 読み込み専用 (HTTP) の clone をするなら "git://github.com/technicalpickles/dotpickles.git" としてください
- 読み書き可能 (SSH) の clone をするなら "[email protected]:technicalpickles/dotpickles.git" としてください
{
"groups": [
"sysadmin"
],
"comment": "Test User Name",
"password": "$6$BcvQ4/W1iMlP9S33$k4RmfftqRi1I5T.z113L1VrXX0K78Uwii8Ot4WC1p74m2agZHYqfp9eNYG10B6adrQIEJ4jQyagJiMt7q9MiF.",
"ssh_keys": [
"ssh-rsa AAA456...uvw== [email protected]"
],
"id": "alex",
"homesick_castles": [
{
"name": "dotfiles",
"source": "git://github.com/technicalpickles/dotpickles.git"
}
],
"shell": "/bin/bash",
"email": "[email protected]"
}
それぞれの databag の書式については次の URL を参照してください。
いずれかの homesick_castle
プロパティに SSH 形式の git URL (読み書き可能にするためのもので、普通は [email protected]:technicalpickles/dotpickles.git
のような形式) が含まれるなら、databags/ssh_known_hosts/hostname.json
プロパティにホストキー書名を追加しなければなりません。
もし github を使っているなら databags/ssh_known_hosts/github.json
を次のようにしてください。
{
"id": "github",
"fqdn": "github.com",
"rsa": "AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==",
"ipaddress": "207.97.227.239"
}
git サーバが git.mycompany.com
とかだったら、git-mycompany.json
に cat ~/.ssh/known_hosts | grep git.mycompany.com
の出力を書きこんでください。詳細は https://github.com/dergachev/chef_homesick_agent#install-ssh_known_hosts-cookbook を参照してください。
ここまでできたら、Vagrant が chef-solo provisioner を介してどの cookbooks や recipes を配置するのか教えてあげましょう。雛形ファイルを次のように編集します。
Vagrant::Config.run do |config|
config.vm.box = "precise64"
# Necessary for homesick_agent::data_bag
config.ssh.forward_agent = true
config.vm.provision :chef_solo do |chef|
# contains "users" and "ssh_known_hosts" databags
chef.data_bags_path = "databags"
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
# stuff that should be in base box
chef.add_recipe "vim"
chef.add_recipe "git"
# setup users (from data_bags/users/*.json)
chef.add_recipe "users::ruby_shadow" # necessary for password shadow support
chef.add_recipe "users::sysadmins" # creates users and sysadmin group
chef.add_recipe "users::sysadmin_sudo" # adds %sysadmin group to sudoers
# homesick_agent and its dependencies
chef.add_recipe "root_ssh_agent::ppid" # maintains agent during 'sudo su root'
chef.add_recipe "ssh_known_hosts" # populates /etc/ssh/ssh_known_hosts from data_bags/ssh_known_hosts/*.json
chef.add_recipe "homesick_agent::data_bag" # includes homesick::data_bag
# instruct "homesick::data_bag" to install dotfiles for the user 'testuser'
chef.json = {
:users => ['testuser']
}
# chef.log_level = :debug
end
end
あなたが書いた databags のユーザと合うよう、chef.json[:users]
を適切に編集してください。
全部できたら VM を起動する準備は完了です!
vagrant destroy --force && vagrant up
VM の起動には少し時間がかかりますが、Vagrantfile
に書いた cookbooks や recipes を chef-solo で配置するのにはそれよりも時間がかかります。
何かが間違っているかもしれません。chef の吐き出すエラーに注意しましょう。どの段階で間違えたのかを見極めるためです。行き詰まってしまったら、Vagrantfile の次の行をコメントアウトすることも検討してみてください。
chef.log_level = :debug
普通は何かいじるたびにエラーが解消されたことを確認するため vagrant provision
を再実行しなければならないでしょう。chef は最初にエラーを検出した段階で停止するということを覚えておいてください。つまり、1 つエラーを直したとしてもその次のエラーが起きるだけなのかもしれないのです。ほとんどの場合完全に最初からやり直すには vagrant destroy --force ; vagrant up
しなければならないのです。
Good luck!
chef のエラーを解決できたなら、新しく作ったユーザとして ssh で VM にログインしましょう。
vagrant ssh -p -- -l testuser # 'testuser' はあなたが作ったユーザ名で置き換えてください
ls -al ~ # ドットファイルが .homesick へのシンボリックリンクになっていなければなりません
vagrant が localhost:8080
を vagrant:80
にポート転送することは覚えておきましょう。VM 上に web サーバを構築したなら http://127.0.0.1:8080
からアクセスできます。
ここまでくれば雛形 Vagrant box の precise64
をカスタマイズした結果を precise64-customized
としてパッケージングできます。これは雛形として今後別のプロジェクトで利用できます。
次のステップは Vagrant のパッケージングチュートリアルをなぞっています。
http://vagrantup.com/v1/docs/getting-started/packaging.html
注:次回にこれを試す前に、次のコマンドで前回作成した boxes を削除しなければなりません
cd ~/code/vagrant-tutorial
rm ~/code/vagrant-tutorial/package.box
vagrant box remove precise64-customized
最初に ~/code/vagrant-tutorial/Vagrantfile.pkg
を作りましょう。
Vagrant::Config.run do |config|
config.vm.forward_port 80, 8080
config.ssh.forward_agent = true # important for recipe[homesick_agent::data_bag]
end
それから現在実行している VM を Vagrantfile.pkg に従ってエクスポートします。
vagrant package --vagrantfile Vagrantfile.pkg #creates ~/code/vagrant-tutorial/package.box
そして利用可能な雛形セット (~/.vagrant.d/boxes/
に格納されています) に precise64-customized
を追加します。
vagrant box add precise64-customized ~/code/vagrant-tutorial/package.box
うまくいったら新しいプロジェクトでテストできます。
mkdir -p ~/code/new-vagrant-project ; cd ~/code/new-vagrant-project
# generate a Vagrantfile that includes config.vm.box="precise64-customized"
vagrant init precise64-customized
vagrant up
ユーザアカウントの作成も含めて全てうまくいきます。
cd ~/code/new-vagrant-project
vagrant ssh -p -- -l testuser # replace 'testuser' with your username
ls -al ~ # various dotfiles should be symlinked to ~/.homesick
やりましたね! (運が良ければ)
Vagrantfiles のバンドル化と Vagrantfile の上書きについて詳しくは次の URL を参照してください。 http://vagrantup.com/v1/docs/vagrantfile.html#vagrantfile_load_order
雛形 box を新規に構築したかったら次の URL を参照してください。
- http://vagrantup.com/v1/docs/base_boxes.html
- https://github.com/fespinoza/checklist_and_guides/wiki/Creating-a-vagrant-base-box-for-ubuntu-12.04-32bit-server
- http://briceno.mx/2012/10/easy-guide-to-create-a-vagrant-box-from-virtualbox/
もしくは VeeWee (ディストリビューションの ISO イメージから Vagrant の雛形 box を作成するツール) をチェックアウトしてください。