ZEALOTエンジニアブログ
Vagrant

Vagrant 起動時に1回だけ実行するスクリプトを設定する

Pocket

Vagrant

弊社ではサーバの構成管理に Chef を導入しています。最近いたるところで Chef の勉強会が開かれていたり、エンジニア系ブログでも目にしたりすることが増えてきましたが、まだ日本での事例が少ないように思います。

今回は Chef とセットで語られる Vagrant について書こうと思います。Chef の Recipe や Cookbook を試すときにはローカル環境や何かしらの VM 環境上で実行することになりますが、これを手助けしてくれるのが Vagrant です。Vagrant は VirtualBox の CUI ラッパーという位置づけになり、非常に簡単に VM を作成することができます。ここでは Vagrant の詳しい使い方に触れませんので、より知りたい方は Software Design (ソフトウェア デザイン) 2012年 10月号 や伊藤直也さんが出されている 入門Chef Solo – Infrastructure as Code を参考にするとよいと思います。

さて、この Vagrant は以下のコマンドでインストールすることができます。

インストールすることによって vagrant というコマンドが利用できるようになります。実際に使うときには vagrant init などサブコマンドを与えてやります。vagrant init したディレクトリには Vagrantfile という VM 起動に必要な設定ファイルが作成されるわけですが、このファイルに VM の細かな設定を入れてあげることができます。また Vagrant 自体が Chef Solo との連携を考えて作られているため、特定の Cookbook を実行することも容易です。

しかし、今回は「VM を Vagrant から起動したときに最初の1回だけスクリプトを実行する」ということを設定してみたいと思います。VM の起動は vagrant up コマンドを使うのですが、初回だけ◯◯するという設定は自分で頑張って書くしかないようです。私は Proxy 設定が必要な環境下ではその設定がなかなか自動化できずに困っていましたが、Vagrant でシェルスクリプトを実行できるということを知ったので、シェルスクリプト内で判断させようと思いました。

Vagrantfile ではこのように VM 起動時の実行するシェルスクリプトを指定してあげます。

次に、実際に呼ばれるシェルスクリプト bootstrap.sh を用意します。

Proxy 周りは意外と厄介で、いくつかの設定をしてあげる必要があります。この bootstrap.sh では、ひとまずわかっている範囲で設定しています。

  • グローバル環境変数
  • apt が利用する設定
  • vagrant ユーザが curl するときの設定

さらに VM が利用する Chef パッケージも予めセットアップするようにしています (ベースとする VM にもよると思いますが、ここ記述している precise64 では手動で Chef パッケージを入れる必要があったので書いています)

この bootstrap.sh は vagrant up するときに必ず呼ばれるようになりますが、スクリプトの先頭で

という分岐をしているため、2回目以降はスキップするようになります。

Pocket