Windows上にVagrant+VirtualBox+Gitで開発環境を構築しチームで環境を統一する

    プログラム開発を行う際にとても面倒なのが「環境構築」ですよね。

    特にチームで開発している場合、WindowsやMac・Linuxなど、使っているPCのOSがバラバラだったり、OSレベルで同一であっても、細かな環境差異で何かしら問題が起きたりします。

    大抵はインストールするソフトウェアのバージョン相違や、設定ファイルの記述ミスとか、環境変数の設定ミスなどの些細なモノですが、それらが積み重なってくると対処に時間がかかることもあり、ツールを使って無駄を極力減らしたいですよね。

    今回は、「環境差異が発生しやすいWindows環境において、チーム全員が統一された開発環境(仮想Linux)を使えるようにする」ことを目的にしています。

    スポンサーリンク

    今回使うツールの紹介

    VirtualBox

    仮想化ソフトウェアの1つ。VMwareと並んでよく利用されます。

    VMwareは企業のサーバ用途、VirtualBoxは個人の勉強用途で多く使われます。

    これを使うとWindows上に仮想的なLinuxを構築したり出来ます。

    仮想化ソフトウェアを実行するOS(今回はWindows)をホストOS、仮想化ソフトウェア上で実行されるOS(今回はLinux)をゲストOSと呼びます。

    Vagrant

    VirtualBoxやVMwareなどの仮想化ソフトウェアを操作して、設定ファイル(Vagrantfileと言います)に基づいた仮想マシンを自動で構築してくれます。

    つまり、Vagrantfileさえ用意すれば、いちいちVirtualBoxを手動で操作して環境を1から構築する必要がなくなります。そして、Vagrantfileを共有すればチームで仮想環境を完全に統一できます。

    今回の主役ツールです。

    Git

    ソースコードや設定ファイルなどをバージョン毎に保存する仕組みを提供してくれます。

    バージョン管理システムとも呼ばれます。

    今回はVagrantfileの管理に加え、チーム内に最新のVagrantfileを配布するために使います。

    やりたいこと

    ・Vagrantfileを作成し、Vagrant + VirtualBoxで仮想Linux環境を構築する。

    ・GitでVagrantfileのバージョンを管理し、チームメンバに最新のVagrantfileを配布する。

    作業手順

    VirtualBoxをインストールする

    まず、VirtualBoxの公式にアクセスします。

    画面中央にある「Download VirtualBox」ボタンをクリックします。最新バージョンのダウンロードページへ飛びます。(2017年4月16日現在、最新は5.1)

    VirtualBox binariesの中にある「Windows hosts」リンクをクリックし、exeファイルをダウンロード、起動します。

    「Next」ボタンをクリック。

    そのまま「Next」ボタンをクリック。

    そのまま「Next」ボタンをクリック。

    「Yes」ボタンをクリック。(ネットワークインタフェースを追加するから、一時的にネットワークが切断されるかもね、という内容の警告です)

    「Install」ボタンをクリック。

    Windows セキュリティの警告ウインドウが出てきたら、「インストール」ボタンをクリックします。これは仮想マシン用のUSBコントローラです。

    「インストール」ボタンをクリック。これはネットワークアダプターです。

    「インストール」ボタンをクリック。これはネットワークサービスです。

    インストールが完了したら、そのまま「Finish」ボタンをクリックします。

    VirtualBoxが起動します。

    Vagrantをインストールする

    Vagrantの公式ダウンロードページにアクセスします。

    Windowsの中にある「Universal (32 and 64-bit)」リンクをクリックし、msiファイルをダウンロード、起動します。

    「Next」ボタンをクリック。

    「I accept the terms in the License Agreement」にチェックを入れ、「Next」ボタンをクリック。(使用許諾契約の条項に同意するかの確認です)

    そのまま「Next」ボタンをクリック。(デフォルトのインストール先が何故かCドライブ直下になっているため、気になる人はProgram Filesを指定する必要があるかもしれません)

    「Install」ボタンをクリック。

    インストールが完了したら、「Finish」ボタンをクリックします。

    システムの再起動を求められるため、「Yes」ボタンをクリックし、Windowsを再起動します。

    再起動後、Windowsキー + Rを押して「cmd」と入力し、コマンドプロンプトを立ち上げます。

    「vagrant -v」と入力し、バージョン情報が表示されればインストール完了です。

    Gitをインストールする

    Git for Windowsの公式にアクセスします。

    画面上部にある「Download」ボタンをクリックし、exeファイルをダウンロード、起動します。

    「Next」ボタンをクリック。

    そのまま「Next」ボタンをクリック。

    そのまま「Next」ボタンをクリック。(デスクトップにアイコンを追加したい場合、On the Desktopにチェックを入れて下さい)

    そのまま「Next」ボタンをクリック。

    そのまま「Next」ボタンをクリック。(ここで選択した内容は、環境変数へのパスの追加有無に関わってきます。その他、Gitのインストールに関する詳細は石坂忠広さんの記事が詳しいので、そちらを参照して下さい。)

    そのまま「Next」ボタンをクリック。(ここで選択した内容は、OpenSSLライブラリの利用有無に関わってきます)

    「Checkout as-is, commit as-is」を選択し、「Next」ボタンをクリック。(ここで選択した内容は、改行コードの変換処理に関わってきます)

    そのまま「Next」ボタンをクリック。(ここで選択した内容は、MinTTYコンソールの利用有無に関わってきます)

     そのまま「Next」ボタンをクリック。

    インストールが完了したら「View Release Notes」のチェックを外し(リリースノート見る必要もないので)、「Launch Git Bash」にチェックを入れ、「Finish」ボタンをクリック。

    Git Bashのコンソール画面が立ち上がります。

    仮想環境を構築する

    Vagrant + VirtualBoxで仮想Linux環境を構築する

    まず、Cドライブ直下やデスクトップなど、好きなところに作業用ディレクトリを作成します。

    今回私はDドライブ直下に、ディレクトリ名を「Vagrant」で作成しました。

    次にVagrantディレクトリを開いた状態で、VirtualBoxを起動します。

    仮想マシンが作成されると画面左側に表示されますが、もちろんまだ何も存在しません。

    次に、Vagrantディレクトリ内で右クリックし、「Git Bash Here」をクリックします。

    Git Bashのコンソールが立ち上がります。pwdコマンドで、カレントディレクトリがVagrantディレクトリになっていることを確認します。

    ここまで完了したら、一旦Vagrantの使い方を説明します。

    Vagrantでは、仮想マシンの構築にBoxファイルというテンプレートを利用します。

    Boxファイルとは仮想マシンのイメージファイルであり、インターネット上で様々なLinuxディストリビューションのBoxファイルが配布されています。

    最小構成のOSだけインストールされたBoxファイルや、プロビジョニングツールが追加でインストールされたBoxファイルなど色々あります。

    これにより、あなたはLinuxディストリビューションのISOファイルを用いて、1から仮想マシンを構築するストレスから解放されます。

    実際にbentoでBoxファイルを探してみましょう。bentoはchef社が公開しているBoxファイルのリポジトリなのでとても安全です。

    今回はCentOS7.3のBoxファイルを使うことにします。まずリンクにアクセスします。

    プロバイダー(仮想化ソフトウェア)毎に使い方が書いてあります。VagrantはVirtualBoxの他にVMware、Parallels Desktopなどもサポートしています。

    今回使うのはVirtualBoxであるため、その欄を確認します。Boxファイルのサイズに加え、「vagrant init bento/centos-7.3; vagrant up –provider virtualbox」といったコマンドが書いてあります。

    前半の「vagrant init bento/centos-7.3」はイニシャライズ(初期化)処理をvagrantに指示します。vagrantはinitコマンドを受け付けるとVagrantfileを作成し、マシン設定の記述をユーザに促します。bento/centos-7.3は、このBoxファイルを利用して仮想マシンを構築せよという意味を持っています。

    後半の「vagrant up –provider virtualbox」は実際に仮想マシンの作成・構築をvagrantに指示します。upコマンドによりBoxファイルのダウンロード・展開・仮想マシンの構築が行われます。–provider virtualboxでは、プロバイダーがVirtualBoxであることを指定しています。

    では上記コマンドを実行してみましょう。まずls -aコマンドを発行し、カレントディレクトリにファイルが何もないことを確認します。

    次に、「vagrant init bento/centos-7.3」を入力し、lsコマンドでVagrantfileが作成されたことを確認します。

    エディタでVagrantfileの内容を確認します。

    Vagrantfileの中に、「config.vm.box = “bento/centos-7.3″」と書いてあるのが確認できます。これは、先程のinitコマンドによるものです。

    例えば先程のコマンドを「vagrant init bento/centos-7.2」と間違えて入力した場合は「config.vm.box = “bento/centos-7.2″」としてVagrantfileが作成されますが、ここを書き換えることで使用するBoxファイルを訂正することができます。つまりinitコマンドは、Vagrantfileを作成するだけであり、仮想マシンの生成に直接関わることはありません。

    initの仕組みを理解したところで、「vagrant up –provider virtualbox」を実行します。

    config.vm.boxの値を参照してBoxファイルのダウンロード・展開・仮想マシンの構築が行われます。ダウンロードには時間がかかるため、けものフレンズ1話を観て待つことをオススメします。たのしー!

    様々なメッセージが出力され、プロンプトが戻ってきました。ここで、VirtualBoxの管理画面を見てみましょう。

    仮想マシンが1つ作成され、実行中のステータスになっています。VagrantによってCentOS 7.3の環境が構築された証拠です。

    ここで、vagrant upコマンドにて出力されたメッセージの内容を簡単に説明します。

    1. https://atlas.hashicorp.com/bento/centos-7.3からBoxのメタデータを取得

    2. 取得したメタデータを元に、https://atlas.hashicorp.com/bento/boxes/centos-7.3/versions/2.3.4/providers/virtualbox.boxからBoxをダウンロード、検証

    3. Boxを元に、VirtualBox上で仮想マシン(インスタンス)を生成

    4. 仮想マシン上のネットワークインタフェース初期化、NATによるポートフォワーディング設定(2200番ポートに着信した通信を22番ポートに転送する)

    5. 仮想マシン上のIPアドレスの設定(127.0.0.1⇒ループバックアドレス)

    6. SSH接続用の鍵ペアの作成(秘密鍵は自動でホストOS側に配置される)

    7. 共有フォルダのマウント処理(「D:/Vagrant」がホストOS⇔ゲストOS間で共有される)

    通常、VirtualBoxを用いて1から仮想マシンを構築する場合、ホストOSとゲストOS間で通信をさせようとするとかなり手間がかかります。アダプタの設定、IPアドレスの設定、NATの設定、ファイアウォールの設定、SSHサーバの起動など考慮すべき点が沢山あるため、躓くことが多いのです。

    しかし、Vagrantはそういった設定を自動で行ってくれます。その結果、あなたはゲストOSへのアクセス手順について悩む必要がなくなります。

    さて、仮想マシンが起動したので次は接続してみましょう。Git Bashコンソールで「vagrant ssh」と入力してみてください。

    自動で仮想マシンへの公開鍵SSH接続が行われます。しかし、あなたは仮想マシンのIPアドレス、SSHポート待ち受け番号、ユーザ名、パスワード、秘密鍵の配置パスを意識する必要はありません。Vagrantによりこれらの情報は隠蔽され、あなたは仮想マシン上の開発に専念することができます。これがVagrantの大きな特徴です。

    なお、Git Bashコンソールではなく、Teratermなど、他の使い慣れたコンソールを利用したい場合はホストOS上で「vagrant ssh-config」と入力します。

    SSHの接続情報が出てくるので、これを元に接続します。秘密鍵にはIdentityFileを選択します。なお、ゲストOSログイン用のユーザ名・パスワードは「vagrant」で統一されています。

    無事、仮想マシンへの接続ができていることが確認できます。また、ゲストOSはホストOSのネットワークを利用するため、インターネットへの接続も問題ありません。

    これで開発環境が整ったので、次はGitでVagrantfileを管理するフェーズに入ります。

    GitでVagrantfileのバージョンを管理する

    まず、Git Bashコンソールで「git init」と入力します。

    initコマンドにより、「.git」ディレクトリが新たに生成されます。このディレクトリにはGitの設定ファイルなどが入っており、Gitはこのディレクトリの存在をトリガとして、「Vagrant」ディレクトリをワーキングツリーとみなします。(Gitでは、「.git」ディレクトリを持つ作業用ディレクトリをワーキングツリーと呼びます)

    ※Vagrantにおけるinitコマンドとは異なり、Gitでファイルのバージョン管理を行う場合、initコマンドは必須です。

    ここまで完了したら、一旦Gitの使い方を説明します。

    Gitでは、コミット(commit)という単位でファイルのバージョンを管理します。例えば、「test.txt」というファイルを作り、そのファイルのバージョンを管理するとします。

    「test.txt」は今作られたばかりなので、内容は空っぽです。いわば、このファイルのバージョンは「0」であると言えます。

    ここで重要なのは、Gitは自動でファイルのバージョンを管理してくれるワケではありません。開発者が明示的にコミットすることによって、「test.txt」はGitに初めて「このファイルのバージョンは”0″である」と認識されます。まずはイニシャルコミットを完了しないとバージョン管理は始まりません。

    さて、コミットをするためには対象ファイルをアド(add)する必要があります。アドとは、ファイルをインデックスに登録することです。

    コミットはインデックスに登録されたファイルのアップデートのみを対象とすることで、開発者の意図しないファイルをコミットに含めることを防ぐようになっています。

    先程作った「test.txt」をアドし、コミットします。これにより、空の「test.txt」は初回のコミットに紐付きます。

    次に、「test.txt」に”Hello World!”という文字列を追加しました。

    先程と同じように「test.txt」をアドし、コミットします。これにより、文字列が追加された「test.txt」は2回目のコミットに紐付きます。

    もし、「test.txt」を空の状態に戻したい(バージョンロールバックしたい)場合は、1回目のコミットから復元すればよいのです。これがバージョン管理です。

     実際に、Vagrantfileをインデックスに登録してみましょう。

    「git add Vagrantfile」と入力し、その後「git status」を確認します。

    なんか英語が沢山出てきて焦りますね。1つずつ説明します。

    まず、「On branch master」は現在のブランチがmasterであることを表しています。

    Gitでは、複数人で同じソフトウェアを並行して開発できるよう、ブランチという概念が存在します。言葉での説明が難しいので、図で説明されているサイトを下記に貼ります。こちらのサイトはGitの基礎が分かりやすく解説されているためオススメです。

    ようこそ、サルでもわかるGit入門へ。Gitをつかってバージョン管理ができるようになるために一緒に勉強していきましょう!

    次に、「Initial commit」はこれから行うコミットがこのワーキングツリーにおいて最初のコミットであることを表しています。

    「Changes to be committed:」はこれから行うコミットに含まれるファイル(addされたファイル)を表しています。新規追加されたファイルはnew file、前回のコミットから内容が変更されたファイルはmodifiedと表示されます。

    「Untracked files:」はこれから行うコミットに含まれないファイル(addされていないファイル)を表しています。

    つまり、現在はVagrantfileのみがインデックスに登録されている状態です。

    「.vagrant」ディレクトリはいつの間に作られたかというと、vagrant up時に、SSH鍵などを格納するために作られています。このディレクトリは特に重要なものでもないため、今回のコミットからは外すことにしています。

    さて、いよいよコミットの出番です。「git commit -m “Initial commit”」を入力し、バージョン管理を始めましょう。(-mオプションはコミットメッセージを表しています。コミットメッセージは通常、ファイルの変更点や追加機能について記載します。)

    これでコミットが完了しました。

    「master (root-commit)」はそれぞれ、そのコミットがmasterブランチであること、ルートコミット(全てのコミットの根本)であることを表しています。(masterでコミットする前にブランチを切ってコミットした場合、それがルートコミットになります)

    その後ろにある「1b4c150」はコミットのリビジョンを示しています。Gitはコミットをリビジョンによって識別しています。「Initial commit」はコミットメッセージです。

    「1 file changed, 71 insertions(+)」はこのコミットによってファイルが1つ変更され、合計71行が追加されたことを表しています。

    「create mode 100644 Vagrantfile」はVagrantfileがパーミッション644(-rw-r–r–)で登録されたことを表しています。(先頭の100は分かりませんでした・・・誰か教えて下さい)

    これでGitでVagrantfileを管理するという目的も達成された・・・と思いきや、少し手順が不足しています。

    Gitでは最終的にコミットの履歴をサーバにプッシュ(記録)する必要があります。これにより、データのバックアップとソースコードの配布が容易になります。(現段階ではコミット履歴はマシンローカルにしかありません)

    プッシュにはリモートサーバ(Gitホスティングサービス)の契約が必要であるため、GitHubを利用します。

    GitHubはGitホスティングサービスの中で最も有名です。しかし、無料ユーザの場合プライベート(鍵付き)リポジトリの作成が出来ないため、ソースコードを公開する必要がない状況においてはBitBucketがよく使われます。今回はVagrantfileの配布(公開)を目的としているため、GitHubを使うことにします。

    Gitで最新のVagrantfileを配布する 

    まず、GitHubの公式にアクセスし、会員登録をします。右上の「Sign up」ボタンをクリックします。

    ユーザ名、メールアドレス、パスワードを入力し、「Create an account」ボタンをクリック。

    free planを選択し、「Continue」ボタンをクリック。(「Help me set up an organization next」オプションは組織向けなのでチェックは付けません)

    メールアドレスに送られてくる認証URLにアクセスすると、登録が完了します。「Start a project」ボタンをクリックし、新しいリポジトリを作成します。

    リポジトリ名と、必要に応じ説明文を入力します。Publicを選択し、「Create repository」ボタンをクリックします。(Private repositoryを作成するには有料プランへの加入が必要です)

    リポジトリが作成され、Gitで利用するための手順が示されます。

    今回は既にローカルにリポジトリがある(コミット履歴がある)ため、「…or push an existing repository from the command line」に書いてある手順を実行します。

    「git remote add origin」はoriginという名前でプッシュ先のリモートリポジトリを追加しています。

    「git push -u origin master」はoriginという名前のリモートリポジトリに対して、masterブランチの内容をプッシュしています。(-uオプションを付けることで、次回以降のプッシュ時のコマンドを省略し、「git push」のみで完結できます)

    プッシュ時にGitHubのウインドウが立ち上がるため、ログインします。(ログインしないとユーザ認証が通らないため、処理が進みません)

    プッシュ時の出力メッセージについては、オブジェクトのカウント数など、基準がよく分からないため説明を省略します。コンフリクト等のエラーが発生しなければ問題ないと思います。

    無事プッシュが完了すると、GitHubのWebページからソースコードやコミットログを確認できるようになります。

     「Clone or download」ボタンをクリックすると、ソースコードをZIPファイルでダウンロードしたり、cloneコマンドで使用するURLを表示することができます。

    Gitで最新のVagrantfileを回収する

    最後にcloneコマンドを使い、チームメンバのPCでVagrantfileをダウンロードして仮想マシンを起動する手順を紹介します。

    ※メンバPCにVirtualbox ・Vagrant・Gitがインストールされていることが前提です。入っていない場合は、インストールをお願いします。

    まず、メンバPC上でGit Bashコンソールを立ち上げ、作業用ディレクトリで「git clone」を実行します。リモートリポジトリ名のディレクトリが作成されます。

    次に、cdコマンドで作成されたディレクトリへ移動します。

    ZIPでダウンロードする場合と異なり、cloneコマンドで取ってきた場合は「.git」ディレクトリ以下も全て含まれるため、今までのコミットログなどを全て確認できます。

    これにより、開発者はcloneで取ってきたソースコードに変更を加え、同じリモートリポジトリにプッシュすることが容易になっています。

    次に、「vagrant up –provider virtualbox」を実行します。

    ダウンロードしたVagrantfileに基づいて仮想マシンが構築されるため、これでメンバ全員の開発環境を統一することが出来ました。

    また、Vagrantでは「vagrant halt」で仮想マシンの停止、「vagrant destroy」で仮想マシンの削除、「vagrant reload」で仮想マシンの再起動を行うことが出来ます。sudoコマンドの実行や、suコマンドでのroot昇格も可能です。(パスワードは「vagrant」です)

    ホストOSからゲストOSにSSHポート以外でアクセスする場合(webサーバなど)、Vagrantfileに「config.vm.network “forwarded_port”」の記載が必要なため注意して下さい。

    最後に

    今回はBoxファイルを利用した仮想マシンの構築のみ行いましたが、VagrantではChefなどのプロビジョニングツールと連携して、ソフトウェアのインストールや設定ファイルの記述まで自動化することが可能です。

    事前に設定済の仮想マシンをBox化してVagrantfileと共に配布する方法もありますが、プロビジョニングツールを使うことで以下のようなメリットがあります。

    ・環境をコード化できる(環境の可視化に加え、手順の再利用がしやすい)

    ・本番環境構築の際にも同じレシピファイルが使える(非仮想環境でも動作する)

    プログラムの開発が終わり、本番環境の構築フェーズに入るタイミングでプロビジョニングツールは非常に活躍するので、個人的にはBox化よりもこちらをお勧めします。

    ※一応、ツールを使わずにVagrant単体でもプロビジョニングは可能ですが、2つ目のメリットを享受できないためオススメはできません。開発環境のみに適用など、用途を絞った使い方であればアリだと思います。

    この記事で、少しでも多くの方の悩みを解決できれば幸いです。

    非常に長くなりましたが、最後までお付き合いいただきありがとうございました。

    修正点などありましたら適宜リライトしていきます。

    スポンサーリンク