Vagrant Fabricで簡単プロビジョニング
全国1億2000万人のVagrantユーザーのみなさんこんばんは。 最近Vagrantの話を書こうとしても、みんな先にかかれてしまうので困っていたのですが、今日はPython製のデプロイツールであるFabricとVagrantを組み合わせて簡単にプロビジョニングする方法を紹介します。
インストール
前述の通り、FabricはPython製のデプロイツールで、SSHで対象先に接続してコマンドを発行したりSFTPしてファイルを配置したりといったことが簡単にできるツールです。Rubyでよく使われるCapistranoと同系統のツールです。 インストールは接続先のマシンではなく、接続元のマシンに行います。環境によって様々な方法がありますが、おおよそ以下のどれかでインストールできます。Ubuntuを使っている場合
sudo apt-get install fabric
既にpythonがインストールされている環境全般
sudo easy_install fabric
もしパッケージ管理にpipを使って入れば
sudo pip install fabric
今回はさらにVagrantと連携させるために、Vagrant Fabric Pluginをインストールします。
vagrant plugin install vagrant-fabric
インストールはこれで完了です。
使い方
使い方も簡単です。まずは、適当な場所(今回はVagrantfileと同じ場所)にプロビジョニング用のpythonスクリプトを作成します(名前も自由で構いません。今回はfabfile.pyにしました)。 今回はVagrantでCentOSを起動して、そのOSの情報を参照して、apacheやphpをインストールしてみることにします。 内容は以下のような感じになります。from fabric.api import run
from fabric.api import sudo
def kernel_name():
run('uname -a')
def install_pp():
sudo('yum -y install httpd php php-mbstring')
sudo('/sbin/chkconfig --level 23454 httpd on')↲
sudo('/etc/rc.d/init.d/httpd start')↲
次にVagrantfileを用意します。内容は以下のようになります。boxの名前は自分の環境にあわせてください。 fabfile_pathに先ほど作ったスクリプトのパスを指定します。またtasksの配列には実行するタスクを指定します。
# -*- 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 = "CentOS-6.4-x86_64-ja"
config.vm.provision :fabric do |fabric|
fabric.fabfile_path = "./fabfile.py"
fabric.tasks = ["kernel_name", "install_pp" ]
end
end
ここまでできれば準備完了です。Vagrantを以下のようにして起動しましょう。
vagrant up --provision
※Vagrant 1.3系からデフォルトでは起動時にプロビジョニングしないように変更されました。したがって–provisionオプションを指定するか、一旦起動したあとにvagrant provisionコマンドを実行する必要があります。
実行するとVagrantが起動し、プロビジョニングが実行されます。以下のような感じで出力されるはずです。
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'CentOS-6.4-x86_64-ja'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] Running provisioner: fabric...
[127.0.0.1] Executing task 'kernel_name'
[127.0.0.1] run: uname -a
[127.0.0.1] out: Linux localhost.localdomain 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
(略)
[127.0.0.1] out: httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[127.0.0.1] out: [ OK ]
Done.
Disconnecting from 127.0.0.1:2222... done.
以前こちらでシェルスクリプトを使ったプロビジョニングの方法も紹介しましたが、やはりシェルよりはツールを使って見通しのよい形でプロビジョニングしたいところですので、Fabricを使うという選択肢は結構有力だと思います。 もちろんもっと大規模の環境になってくればChefを使ったり、普段からRubyを使っていればChef Soloを使ったりと色々な選択肢があるので、自分にあうものを選んでください。 今回のサンプルコードはこちらです。
Happy provisioning!!