ブログ

ryuzeeによるブログ記事。不定期更新

Vagrant + シェルスクリプトで簡単プロビジョニング

Vagrantでプロビジョニングというと、Chef SoloとかChefとかPuppetを使うという印象がありますが(Vagrant initしてできるVagrantfileにもそれらだけが入っている)、シェルスクリプトでも簡単にプロビジョニングできます。 マニュアルに書いてあるわりに意外と知らない人が多くてびっくりしたので、簡単に紹介しておきます。

インラインでシェルを使う方法

これはVagrantfileの中に直接コマンドを書いておく方法です。コマンドの数が少ない場合はこれで十分です。

# 以下にコマンドを書く
script = < <SCRIPT
yum install -y httpd php php-mbstring php-pdo php-mysql mysql-server
/sbin/chkconfig --level 2345 mysqld on
/sbin/chkconfig --level 2345 httpd on
/etc/rc.d/init.d/httpd start
/etc/rc.d/init.d/mysqld start
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "CentOS-6.4-x86_64-ja"  
  config.vm.provision :shell, :inline => script
end

外部のシェルスクリプトを呼び出す方法

上記の方法だとVagrantfileがぐちゃぐちゃになりやすく、デバッグもしづらいです。そこで外部スクリプトを呼び出す方法を利用します。 変更箇所は、:inlineの指定から:pathの指定に変わって、スクリプトの場所を指定するようになっている点です。スクリプトのパスはホストOS側のパスです。
Vagrant.configure("2") do |config|
  config.vm.box = "CentOS-6.4-x86_64-ja"
  config.vm.provision :shell, :path => "script.sh"
end

そしてスクリプトは以下のような感じです。さきほどの例と比べて分かりやすくなるようにちょっとだけ処理を複雑化してみました。

#!/bin/sh
yum install -y httpd php php-mbstring php-pdo php-mysql mysql-server
/sbin/chkconfig --level 2345 mysqld on
/sbin/chkconfig --level 2345 httpd on
/etc/rc.d/init.d/httpd start
/etc/rc.d/init.d/mysqld start

cat < < END > /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
END

/etc/rc.d/init.d/iptables restart

まとめ

ということで、ChefやPuppetを使わなくても簡単にプロビジョニングできます。 Vagrantfileとスクリプトをレポジトリに入れておけば、このような方法でも簡単に開発者同士で環境を揃えることも可能です。 ChefのCookbookを本気で書くとそれなりに時間もかかるので、使い捨てに近いような処理をする場合にも有効かもしれません。

アジャイルコーチングやトレーニングを提供しています

株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。

詳細はこちら