talesleaves-dev

諸々の開発のメモ。画像は面倒

Vagrantの仮想環境を設定する

Vagrantの設定について

Vagrantは設定を柔軟に変更できるようにデザインされています。
それだけに設定項目も多いのですが、ここでは仮想マシン自体の設定について、必要と思われる項目を調べます。

設定ファイル-Vagrantfile

Vagrantで管理される仮想環境の設定はvagrant init box-nameでプロジェクトフォルダ内に作成されるVagrantfileに記述されます。
initで生成されるファイルはそれなりの行数がありますが、実際に有効になっている設定は仮想マシンのベースにするboxの指定だけです。
これだけの状態でも、起動させて仮想マシンのOSにSSH接続することが可能です。
コメントアウトされている設定項目についても簡単に説明が付記されていますので、一度目を通すのが良いかと思います。
また、Ruby言語で記述されていますので、そちらに詳しい方はわかりやすいのかもしれません。

Vagrantへのローカルな設定

Vagrantのローカル環境での動作の設定の一部は、ホスト側の環境変数を使います。
例えばVagrantが内部的に利用しているboxの実体データなどはVAGRANT_HOMEで指定されたフォルダに保存されます。
デフォルトではホストOSのユーザーフォルダの.vagrant.dという隠しフォルダが指定されています。
環境変数について詳しくはEnvironmental Variables - Vagrant by HashiCorpを参照してください。

Vagrantfileの構成

Vagrantfileはいくつかのパート*1に分かれています。
基本的にはconfig.vmのパートで仮想マシンへの設定を行います。
このほかに、config.ssh、config.vagrantと言った、仮想マシンそのものではなく、ホスト側の環境を設定する部分もあります。
詳細は公式のVagrantfileページに譲るとして、config.vmの中から、覚えておきたい設定項目を見ていきます。

config.vm.box

仮想マシンのベースになるOSのイメージを指定します。
利用出来るBoxは
Discover Vagrant Boxes - Vagrant Cloudで探すことが出来ます。

config.vm.network

ネットワーク周りの設定です。
Providerによって利用可能な設定が異なってくるため、公式サイトでも別章
Networking - Vagrant by HashiCorp
を設けて説明しています。
通常はport_fowordを利用して、ホスト側の特定のポートからゲスト側の特定のポートに接続できるように設定します。

config.vm.provider

仮想マシンのProviderを指定します。
デフォルトではVirtualBoxが指定されており、そのまま使用しても問題ありません。
また、使用するProviderをvagrant upのオプションとして指定して、このパートで処理を切り替えるなども可能です。
これもかなりボリュームのある項目となり、
Providers - Vagrant by HashiCorpで設定を含めた諸情報を確認できます。

config.vm.synced_folder

ホストOSとゲストOSの間でフォルダを共有するための設定項目です。
デフォルトで使用するとVagrantのプロジェクトフォルダ全体が共有されます。個人的にこれは好みではないので、以下のようにデフォルトの設定を無効にしています。

config.vm.synced_folder ".", "/vagrant", disabled: true

また、ProviderにVirtualBoxを使用している場合、ゲストOSにVirtualBox Guest Additionsをインストールしていない状態でデフォルト以外の設定を追加すると、エラーが発生します。
VirtualBoxを使用するときにはvagrant-vbguestプラグインをインストールしておくとよいでしょう。

設定の基本方針

Vagrantは非常に柔軟に設定を行うことが出来ますが、それらをすべて1度に完全な状態に持っていくことは非常に難易度が高いです。
幸い、Vagrantは自動化により試行錯誤が簡単に行えるツールです。その利点を最大限に生かすためには、恐れずトライ&エラーすることだと思います。
目標を定めて、項目を一つ変更したらvagrant upしてみて結果を確認する、そして失敗したらdestroyして修正する、を繰り返すようにしましょう。

*1:正確にはnamespase

VagrantのPluginについて

Vagrantの機能の拡張

Vagrantは標準でも便利な機能が多数搭載されていますが、実際に使用するにあたって複雑な設定が必要になったり、ProviderやBox内へインストールするツール、ライブラリのバージョン管理が必要になってきます。
これらについて、VagrantではPlugin(以下プラグイン)を利用することで機能を追加したり、設定の負担を軽減することが出来ます。

Vagrantで利用できるプラグインGitHubVagrantwikiに集約されています。
Available Vagrant Plugins · hashicorp/vagrant Wiki · GitHub

プラグインサードパーティー

これらのプラグインについては、Vagrantの開発元であるHashiCorpの公式なリリースではなく、コミュニティからの提供です。
不具合の解消や長期的な提供が保証されているわけではないことには注意が必要です。*1
また、使用法や設定、既知の問題などの情報は各プラグインwikiページで十分に調べておきましょう。

プラグインのインストール、アンインストール

プラグインのインストール、アンインストールは非常にシンプルです。

#インストール
$ vagrant plugin install plugin-name

#アンインストール
$ vagrant plugin uninstall plugin-name

プラグインに関するコマンドは下記に集約されていますので参照してください。
vagrant plugin - Command-Line Interface - Vagrant by HashiCorp

プラグインの一部の紹介

vargrant-vbguestプラグインVirtualBox必須)

VirtualBoxを使用する場合、仮想マシンのOSにVirtualBox Guest Additionsというツールをインストールする必要があります。
この作業がインストールディスクのイメージをダウンロードして仮想マシンにインストールをするという手順であり、かなりの手間となります。
vagrant-vbguestプラグインはこの作業を肩代わりしてくれます。
その分初回のvagrant upに時間がかかるようになりますが、バージョンの管理やイメージのダウンロードを肩代わりしてくれるのは非常に便利です。
是非インストールしておきましょう。

各種Provider用プラグイン

VagrantのデフォルトではProviderはVirtualBoxとなっていますが、プラグインで対応できるものも含めるとかなり広範囲の環境を構築できます。
AWSのEC2や、Microsoft Azureなどのクラウド環境も対応できますので、目的に合わせてインストールしておくとよいかと思います。

Provisioner

Vagrant仮想マシンを起動させた後、OS内へツールやライブラリーをインストールする作業を行うのがProvisioningです。
これらのProvisioningの設定や作業を肩代わりしてくれるプラグインも提供されています。
標準でもChefやDockerが存在していますが、Docker ComposeやAnsibleなども利用できます。

プラグインのまとめ

Vagrantでは環境の構築をVagrantfileで管理します。
このVagrantfileへの記述を減らす、肩代わりしてくれるものがプラグインと言ってよいでしょう。
プラグインへの設定のカスタマイズなどにはVagrantfileの知識が必要になってきますので、最初はプラグインなしでVagrantfileを記述してみるのがいいかもしれません。*2

*1:逆にVagrantの標準機能に取り込まれたプラグインも多い

*2:私もDockerをシェルからインストールしてました