開発環境の構築・共有を簡単にするVagrant入門
フォルダの共有機能
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