開発環境の構築・共有を簡単にするVagrant入門
Vagrantとは?
Vagrantは、開発環境の構築と共有を簡単に行うためのツールです。どこでも同じ環境を再現できるように仮想マシン環境を管理する機能と、Atlasを通して共有する仕組みが提供されています。
VagrantとAtlasの関係
Vagrantは、アプリケーションやシステム開発のバックエンドを簡単にパッケージ化し、共有するためのツールです。このパッケージ化された環境を、「box」と呼ばれる単位で管理します。このboxには、標準で対応しているVirtualBoxをはじめ、AWSなどの各種マシン・イメージに対応したプラグインを介してアクセスします。またboxを共有するための機能としてAtlasという名前のインターネット上のサービスが提供されています。なお、Atlasは以前VagrantCloudと呼ばれていたものですが、現在はHashiCorpの他のツール(Packer、Terraform、Consul)とも連携できるように拡張されています。
VirtualBoxとの違い
Vagrantは、yumやapt-getのようなコマンドの実行や、ChefやAnsible等のツールを使って自動的にアプリケーションやミドルウェアをセットアップするプロビジョニング機能を備えています。また、ネットワークの設定などVirtualBoxのGUIを通さず、VirtualBoxの設定ファイル上で管理することができます。そのため、自分の作業環境を別の場所で再現したり、あるいは、チームや社内で設定環境を共有したりする際に役立つでしょう。
Vagrantが管理できる仮想マシンは、VirtualBoxやVMwareのものだけでなく、AWS等のパブリック・クラウド上の仮想マシンも操作できます。Vagrantが各種の仮想マシンを操作するのに使うのが、プロバイダと呼ばれるものです。VirtualBox用のプロバイダが初めからインストールされていますが、それ以外にもVagrantのプラグイン機能を通して、様々なプロバイダを使い分けることができます。
今回は、Vagrantを使ってできることを具体的に見ていきます。
Vagrantのセットアップ
VagrantはMac OS X、Windows、Linuxに対応したパッケージが配付されています。自分の環境にあったものをダウンロードし、セットアップを行いましょう。またVagrantに加えて、VirtualBoxのダウンロードも必要です。
Vagrantのダウンロード
http://www.vagrantup.com/downloads.html
VirtualBoxのダウンロード
それぞれインストールが完了しますと、Vagrantが利用できるようになります。以降の操作では、Vagrantを使って仮想マシンの起動・停止を行いますが,その際にVirtualBoxの設定を行う必要はありません。
ここではVirtualBoxを使う前提で説明を進めますが、前述のようにVirtualBoxを使わずに、VMwareやパブリック・クラウドとの連携も可能です。
初めての仮想マシン起動と操作
それでは、実際に仮想マシンを起動し、ウェブサーバの自動設定や、SSHで仮想マシン内にログインしてみましょう。以下の手順で仮想マシンを起動します。
- 作業用ディレクトリでVagrantfileを作成し、仮想マシン・イメージ(box)を指定
- コマンドラインで「vagrant up」を実行
仮想マシンの環境設定
VagrantをインストールしたPC上の、任意のディレクトリで名称「Vagrantfile」という名前のファイルを作成します。ファイルにはリスト1のような内容を記述します。
1行目は、設定ファイルのバージョンが2であることを意味します。これは、将来の互換性を保持するためのものです。2行目の「config.vm.box」は、Vagrantが扱う「box」と呼ばれる仮想マシン・イメージの形式を指定します。ここでは「hashicorp/precise64」という名称のUbuntuが動作するboxを指定しています。
boxは、Atlas(旧VagrantCloud)で公開されているものや組織で共有しているものの他に、URLやファイル名のパスで指定することもできます。Atlasで公開されている boxイメージは、Vagrantfileで名前を指定するだけで自動的にダウンロードされます。その他のイメージ、例えばVagrantbox.esなどで配付されているboxは、「vagrant box add
Vagrantfileは新たに作成せずに、他の場所からコピーしてきても構いません。あるいは「vagrant init」コマンドの実行で、サンプルが記述されたVagrantfileが作成されますので、そちらを参考に設定を行うこともできます。
仮想マシンの起動
仮想マシンを起動するには、コマンドライン上で「vagrant up」コマンドを実行します(リスト2)。最初の実行時には、ローカルの環境にboxが存在しないのでAtlasからダウンロードが始まります。そのためネットワーク環境によっては、長い時間がかかるでしょう。しかし次回以降は、ローカルに保存しているboxを使って起動しますので、すぐに起動するようになります。
これで、仮想マシンが自動的に起動しました。先ほどの「vagrant up」を実行し、boxイメージのダウンロード後は、自動的にVirtualBoxを操作して仮想マシンが起動されていきます。VirtualBoxの画面を見ますと、自動的に仮想マシンが起動していることも確認できますが、通常はVirtualBoxを意識する必要はありません。
仮想マシンのログインと操作
仮想マシンにログインするには、「vagrant ssh」を実行します(リスト3)。成功するとvagrantアカウントでログインした状態となります。また、rootにスイッチするには「sudo su」と実行します。
この他にも、覚えておきたい基本的なコマンドがいくつかありますので、まとめて表にしておきます。
コマンド | 機能 |
---|---|
vagrant up | 仮想マシンを起動 |
vagrant ssh | 仮想マシンにログイン |
vagrant halt | 仮想マシンを停止 |
vagrant suspend | 仮想マシンを一時停止 |
vagrant status | 仮想マシンの起動状態を確認 |
vagrant destroy | 仮想マシンを破棄 |
このように、Vagrantがあれば単純な操作で開発環境を構築できて、すぐ開発に取り組むことができます。
プロビジョニング機能
Vagrantは、「vagrant up」で仮想マシンを起動したあと、自動的なコマンドの実行やアプリケーションの設定を行うプロビジョニング機能を備えています。この機能を活用することで、OSの初期設定や、アプリケーションのインストール作業を迅速かつ正確に行えるようになります。
プロビジョニング機能を使うには、Vagrantfile中で設定を記述します。リスト4の例は、dateコマンドの実行結果を出力するものです。
Vagrantfileにリスト4を追加した後に「vagrant up」を行いますと、OS起動時にdateコマンドが実行されます。既に仮想マシンが起動状態の場合は、コマンド「vagrant provision」でプロビジョニング部分だけを実行できます。反対に「vagrant up --no-provision」とオプションを追加することで、Vagrantfileに書かれたプロビジョニングを実行せずに起動することもできます。
さらにPC上にあるスクリプトの実行も可能です。例えばprovision.shを実行したい場合はリスト5のように記述します。
また、リモートにあるファイルの実行も可能です。リスト5の「provision.sh」の代わりに、GitHubなどウェブサーバのURLも指定できます(リスト6)。
そのほか、ChefやPuppetやAnsible等のプロビジョニング・ツールとも連携できます。詳細はドキュメントを参照してください。
Provisioning - Vagrant Documentation
http://docs.vagrantup.com/v2/provisioning/index.html
フォルダの共有機能
Vagrantは、開発をスムーズにするためのフォルダ共有機能を備えています。これはVagrantで仮想マシンを起動すると、開発用PCと仮想マシン内のディレクトリを自動的に同期してくれるものです。これにより、PCで使っている自分の好きなエディタを使って、仮想マシン上のソースコードを編集できるだけでなく、手元のツールでテストや任意の処理ができます。仮想サーバ上で何か処理する際に、いちいちログインする必要がありませんので、開発作業に集中することができます。
それでは実際に共有することを確かめて見ましょう。「vagrant up」で仮想マシンを起動すると、Vagrantfileを実行したフォルダと仮想マシン内の「/vagrant」ディレクトリがリアルタイムで同期します。リスト7のように、仮想マシン内でディレクトリを移動して、ファイルを作成すると、手元のPC上にも同様のファイルが作成されることが確認できます。
その逆に、作成されたhello.txtをPC上のエディタで編集・保存すると、その結果がサーバ内のファイルにも反映されていることが分かります。
共有するフォルダは変更可能で、例えばPC内の「./data」フォルダと仮想マシンの「/share/data」を同期したい場合は、Vagrantfileにリスト8のように記述します。
そのほか、共有機能ではNFS、rsync、SMBに対応しています。詳細はドキュメントをご覧ください。
Synced Folders - Vagrant Documentation
http://docs.vagrantup.com/v2/synced-folders/index.html
AtlasでHTTPとSSHの共有
開発環境をインターネットで共有するvagrant share
開発過程で、手元のPCの環境をリモートの開発者と共有したいとき、これを簡単に実現する機能がVagrantとAtlasを通して提供されています。開発環境で「vagrant share」コマンドを実行すると、実行した環境に対して「<ホスト名>.vagrantshare.com」のホスト名が自動的に割り当てられます。リモートの開発者はブラウザを通して開発環境にアクセスできるだけでなく、「vagrant connect 」コマンドを使って直接SSHログインすることもできます。また、ウェブだけの利用であれば、任意のホスト名・ドメイン名を指定することも可能ですので、開発環境だけでなく、デモ環境の提供やインターネット上のサービスとの連携にも活用できます。
Atlasにログイン
共有機能を使うには、まずAtlasにログインする必要があります。もしアカウントがなければ、登録から始めましょう。もしVagrantCloudのアカウントを持っていれば、アカウントは共通なので、そのままAtlasにもログインできます。
Atlas by HashiCorp
ログインするには「vagrant login」コマンドを実行し、Atlasのユーザ名(Username)とパスワードを入力します(リスト9)。
HTTP(S)を共有
それでは、実際に仮想マシン環境を共有してみましょう。HTTPとSSHを共有する環境を準備するために、リスト10のVagrantfileを準備します。この例では仮想マシンにUbuntuのboxを使い、Apacheのセットアップを行ったあと、ドキュメントルートを/vagrantに置き換えています。また、ホストマシンのポート4567番を仮想マシン内のポート80番にポート転送(Port Forward)する設定も行っています。HTTP(S)の環境を共有するためには、このようにホスト側にポートを割り当てる必要があります。
それから「vagrant up」を実行した後に、共有を開始するために「vagrant share」を実行します(リスト11)。すると自動的にホスト名が割り当てられ、画面に表示されるURLでアクセスできるようになります。終了したい場合は「Ctrl+C」を入力します。
ブラウザでこのURLにアクセスすると、Vagrantfileが見えます。このディレクトリでファイルの新規作成や編集をしますと、内容がブラウザにも反映することが確認できます。
SSHを共有
引き続きSSHを共有する方法を見ていきます。起動時のオプションで「vagrant share --ssh」を実行します(リスト12)。正常に処理が終われば、ホスト名とドメイン名が確認できます。
この環境にSSHでログインするには「vagrant connect」を実行します(リスト13)。SSHの共有を終了したい場合も「Ctrl+C」を入力します。
任意のドメイン名やホスト名を使う方法
共有時には、自動作成される*.vagrantup.comではなく、任意のドメイン名も利用できます。ここでは「<ホスト名>.vagrant.example.jp」でアクセスする方法を見ていきましょう。
まず始めに必要なのは、ゾーン情報の変更です。具体的には、share.vagrantcloud.comにCNAMEレコードを追加します。例えば、BINDを使って「<ホスト名>.vagrant.example.jp」というホスト名を使いたいとき、リスト14のようにレコードを記述します。
設定後「dig 任意の名称.vagrant.example.jp a」を実行し、share.vagrantcloud.comで名前解決ができていれば準備完了です。
次に、Atlas上にドメイン名を登録します。アカウントの設定画面で図5のように「ORGANIZATIONS」の欄に自分の名前が表示されていますので、そこをクリックします。さらにメニューで「Configuration」をクリックし、「Name」のフィールドに共有で使いたいドメイン名を記入し、「Add Domain」を入力します(この例では「vagrant.example.jp」と入力)。後ほど共有を解除したい場合にも、この画面から削除できます。
最後に開発環境上で「vagrant share」コマンドを使います。リスト15のようにオプション「--domain」でドメイン名を、「--name」でホスト名を指定すると、「http://test.vagrant.example.jp」として接続することができます。
注意点としては、SSHで共有する場合はホスト名の指定ができないことが挙げられます。また、ドメインを毎回オプションで設定せずに、常に特定のドメイン名を使うこともできます。アカウントの設定から、「Configuration」をクリックし、Vagrant Share Domainsに表示されているドメイン名の列にある「Set default」をクリックします。有効化したあとは、自動的に登録したドメイン名が毎回割り当てられます。
コードを簡単にデプロイするPush機能
開発が進むと、コードを別のサーバ環境に送り、テストやデプロイなど開発中のコードを共有したい場合が出てきます。そのような場面に便利なのがPush機能で、「vagrant push」コマンドで利用します(Vagrantバージョン1.7以降に対応)。コマンドを実行すると、Vagrantfileのあるディレクトリ以下を別のサーバにFTPで転送したり、rsyncやscpのようなコマンドを実行したり、あるいはAtlasやHerokuへ送信したりすることもできます。
Push機能を使うためには、どの手段でどの環境に送信するかをVagrantfileに記述します。この手段のことをVagrantでは「strategy」と呼びます。例えばFTPを使ってデプロイするには、「ftp」という名称のstrategyをリスト16のように指定します。
コードの共有には、Vagrantのboxを共有する方法もあります。しかし、boxは作成や転送に手間と時間を要するため、ある程度の完成形に近くなってからのアップロードに適しているでしょう。一方vagrant pushを使う方法であれば、既存の環境に対して手軽に送信できるという利点があります。以下では、ローカルのファイルをFTPかコマンドラインでデプロイする方法を見ていきます。
FTP・SFTPを使うには
リモートのサーバ上にFTP・SFTPでファイルを転送したい場合は、あらかじめVagrantfileにリスト17のように記述しておきます。
記述後は、任意のタイミングで「vagrant push」コマンドを実行すると、自動的にFTP・SFTPでファイルの転送が実行されます。
Vagrantfileで利用できるオプションは、以下の表の通りです。
オプション | 説明 | デフォルト値 |
---|---|---|
push.host | リモートのFTPサーバのホスト名 | |
push.username | サーバのログインに使用するユーザ名 | |
push.password | ログインユーザのパスワード | |
push.passive | FTP時にPassiveモードを使用 | true |
push.secure | SFTPを使用 | false |
push.destination | サーバ側の同期先ディレクトリ | / |
push.exclude | 除外するファイルやディレクトリのパターン(includeより優先) | |
push.include | アップロード対象とするファイルやディレクトリのパターン | |
push.dir | ファイルアップロード元のディレクトリ指定 | カレントディレクトリ |
任意のコマンドを実行するには(LOCAL EXEC)
FTPだけでなく、作業をしているPCやサーバ内でディレクトリのコピーをしたり、rsync・scpコマンドを使ったりするような応用も可能です。リスト17の「ftp」の箇所を「local-exec」に書き換えます。リスト18の例は、scpを使って複数のサーバに特定のディレクトリをコピーするものです。
なお、このようにscpを使う場合は、パスフレーズを使わずSSHログインできるような設定が必要です。またpush.inlineでコマンドを記述する代わりに、任意のスクリプトを「push.script = "<スクリプト名>"」で指定し、実行することもできます。コマンドやファイルに対するパスは、Vagrantfileのあるディレクトリが起点となります。
複数のデプロイ先を切り替えるには
用途に応じてデプロイ先を使い分けることもできます。例えば、ステージング環境(staging)にはftpを、本番環境(prod)にはlocal-execを用いてデプロイするには、リスト19のように記述します。
ステージング環境に送る場合は「vagrant push staging」、本番環境に送る際には「vagrant push prod」と入力することで、デプロイする環境を切り替えられます。
まとめ
開発環境の基盤としてのVagrantの役割と、Atlasとの連携方法を見てきました。今回紹介した機能の詳細については、Vagrant公式サイトのドキュメントも参照してください。
Vagrant Documentation
https://docs.vagrantup.com/v2/
今回は、VagrantとAtlasでbox環境を作成しました。次の課題は、このbox環境を他人と共有したり、クラウド上に展開したりするにはどうしたらよいかということになります。これを解決すべく、次回は手元のPCだけでなく、クラウド環境とVagrantの連携方法や、Packerを使ってマシン・イメージを管理する方法を見ていきます。
※本稿は、2015年3月現在のAtlasおよびVagrant 1.7.2に対して確認を行っています。
【参考文献】
Vagrant
VAGRANT DOCUMENTATION
https://docs.vagrantup.com/v2/
ATLAS Documentation
https://atlas.hashicorp.com/help/documentation/applications-and-dev-environments