2015年6月29日月曜日

Vagrant始めました

 こんにちは、北野です。最近は、VagrantやDockerというキーワードを至るところで目にします。にも関わらず、「仮想化に関連した技術」というくらいのざっくりとした知識しかないうえ、両者の違いもはっきりわかっていませんでした。

 このままでは時代に取り残されるという危機感から、今回はまずVagrantについて調べてみました。

Vagrantとは

 Vagrantは、仮想環境を利用した開発環境構築ツールです。Hashicorp社のMitchel Hashimoto氏によってRuby言語で作成され、MIT Licenseで配布されているオープンソースソフトウェアです(ソースコードは、https://github.com/mitchellh/vagrant にあります)。

 Vagrantの最大の特長は、「さまざまな仮想化環境を統一されたコマンドで操作できる」点です。対応している仮想化環境は、VirtualBox、VMwareといった仮想化ソフトウェア、AWS、OpenStackといったクラウド環境、DockerやLXCなどのコンテナ環境など、多岐にわたっています。

インストール方法

 早速、インストールして、どんなものか使ってみます。Vagrantを使用している方はMacユーザーのほうが多いような印象がありますが、私はWindowsユーザーなのでWindowsで説明します。

VirtualBoxのインストール

 まず、仮想化環境を用意します。今回は、VirtualBoxを利用することにしました。

  1. 仮想化支援機能の有効化

    BIOS画面などで「仮想化支援機構」(Virtualization Technology)が有効になっているかを確認する。有効になっていない場合は、有効にしておきます。


  2. VirtualBoxのダウンロード

    前述したとおり、仮想化環境はいろいろ選択できますが、今回はVirtualBoxを使用するので、ダウンロードサイトから、環境に合ったVirtualBoxをダウンロードします。


  3. インストーラの実行

    インストーラ(ex. VirtualBox-4.3.28-100309-Win.exe)をダブルクリックして、インストールします。すべてデフォルトのまま、[Next]ボタンをクリックしていくだけで問題ありません。


  4. VirtualBoxの起動確認

    デスクトップ上に作成されている「Oracle VM VirtualBox」アイコンをクリックして、下図のような画面が起動したらインストール完了です(ただし、これは問題なくインストールされているか確認するためで、Vagrantを使用するときは直接VirtualBoxを起動する必要はありません)。

    Extension Packは、USB2.0ホストコントローラ、リモートデスクトップ機能、PXEブートローダなどの機能を追加するもので、Vagrantの利用だけならインストールしなくても問題ありません。


Vagrantのインストール

 続いて、Vagrant本体をインストールします。

  1. Vagrantのダウンロード

    ダウンロードサイトから、環境に合ったVagrantをダウンロードします。


  2. インストーラの実行

    インストーラ(ex. vagrant_1.7.2.msi)をダブルクリックして、インストールを実行します。こちらも、すべてデフォルトのまま、[Next]ボタンをクリックで問題ありません。


  3. Vagrantの実行確認

    Windowsならコマンドプロンプト(Macならターミナル.app)を起動し、vagrant --versionを実行して、バージョン情報が表示されればインストール完了です。


テスト環境の構築

 Vagrantを利用する準備ができましたので、まず簡単なテスト環境を構築して、Vagrantがどんなものか触れてみます。

  1. 仮想環境のダウンロード

    Vagrant上で利用する仮想環境のベースイメージは、「Box」と呼ばれています。Boxは自作することも可能ですが、ここでは公開されているBoxをhttp://www.vagrantbox.es/ からダウンロードして利用してみましょう。ここでは、「CentOS7.0 x86_64 minimal」という名前のBoxを、「cent7」という名前で保存します。

    >vagrant box add cent7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
    

    保存されているboxの一覧は、vagrant box listで確認できます。

    >vagrant box list
    cent7        (virtualbox, 0)
    

    ダウンロードしたBoxは、ホームディレクトリの.vagrant.d/boxesディレクトリ以下に保存されます。仮想ディスクファイルや属性情報ファイルなどがあります。

    >dir .vagrant.d\boxes\cent7\0\virtualbox
    ……
    2015/06/05  13:23       455,184,384 box-disk1.vmdk
    2015/06/05  13:23            13,494 box.ovf
    2015/06/05  13:23                25 metadata.json
    2015/06/05  13:23               505 Vagrantfile
                   4 個のファイル         455,198,408 バイト
    

  2. 定義ファイルの作成

    続いて、次のコマンドを実行します。

    >vagrant init cent7
    

    このコマンドを実行すると、仮想環境の定義ファイルであるVagrantfileがカレントディレクトリに作成されます。作成されたVagrantfileは標準的なもので、このファイルに変更を加えることで、Box実行時の設定をカスタマイズすることができます。

    >dir
    ……
    2015/06/05  13:31             3,087 Vagrantfile
                   1 個のファイル               3,087 バイト
    

  3. 仮想環境の起動

    これで準備は整いました。あとは、次のコマンドを実行すれば、仮想環境を起動させることができます。

    >vagrant up
    

  4. 仮想環境へのアクセス

    あとは、次のコマンドを実行すれば、仮想環境にsshログインできます。

    >vagrant ssh
    

    ……と書きましたが、残念ながらWindowsには標準でsshコマンドが装備されてないため、上記の方法ではアクセスできません(MacやLinuxなら問題なくアクセスできます。この辺りがVagrant利用者にMacユーザーが多い理由があるのかもしれません)。

    そのため、WindowsではTeratermなどのsshアプリケーションを利用するか、Cygwinなどを利用してコマンドプロンプト上で利用できるsshコマンドを用意する必要があります。

    デフォルトの接続情報は、下記のとおりです。

    • IPアドレス:127.0.0.1
    • ポート番号:2222
    • ユーザー名:vagrant
    • パスワード:vagrant


    アクセスすると、あとは普通のCentOS 7として利用できます。

    Welcome to your Vagrant-built virtual machine.
    [vagrant@localhost ~]$ cat /etc/redhat-release
    CentOS Linux release 7.1.1503 (Core)
    

  5. 仮想環境の停止/削除

    仮想環境を停止/削除するときは次のコマンドを実行します。

  6. テスト環境のサスペンド

    >vagrant suspend
    

    仮想環境のシャットダウン

    >vagrant halt
    (ゲストOS内でshutdownでも良い)
    

    仮想環境の削除

    >vagrant destroy
    

    Boxの削除

    >vagrant box remove {title}
    

Vagrantは本当に便利か?

 ここまで読まれた方の中には、「元のVirtualBoxと比較しても特に便利な感じがしない」と思われた方もいるかもしれません。

 コマンドでの仮想環境操作ならVirtualBox付属のVBoxManageコマンドでもできますし、VirtualBoxでそのまま使える仮想ディスクイメージも配布しているサイトもあります(ex. Ubuntu Japanese Team)。

 しかし、まだもう1つのVagrantの特長を紹介していませんでした。Vagrantには「プロビジョニング」と呼ばれる機能があり、これこそがVagrantが開発環境ツールとして多くの人に使われている理由の1つなのです。プロビジョニングにはさまざまな意味がありますが、ここでは「サーバー設定の自動化」のことを指します。

擬似開発環境の構築

 Vagrantのプロビジョニング機能の便利さを感じてもらうため、次のような擬似開発環境をVagrantで作成してみます。

  1. CentOS 7のサーバーを2台構築
  2. 1台はApacheがインストールされたWebサーバー
  3. もう1台はMariaDBがインストールされたDBサーバー
  4. WebサーバーからDBサーバーにmysqlクライントでアクセスできる

 上記の要件のうち、1.については、前述した仮想環境の定義ファイルである、Vagrantfileを下記のように修正することで実現できます(説明のため、行番号を付加しています)。

・Vagrantfile

1  Vagrant.configure(2) do |config|
2    config.vm.box = "cent7"
3
4    config.vm.define "web" do |web|
5        web.vm.provision "chef_solo", run_list: ["apache"]
6        web.vm.network :private_network, ip: "192.168.33.10"
7        web.vm.hostname="web.example.com"
8        web.vm.network :forwarded_port, guest: 22, host: 3322, id: "ssh"
9        web.vm.network :forwarded_port, guest: 80, host: 8080
10    end
11
12    config.vm.define "db" do |db|
13        db.vm.provision "chef_solo", run_list: ["mariadb"]
14        db.vm.hostname="db.example.com"
15        db.vm.network :private_network, ip: "192.168.33.11"
16        db.vm.network :forwarded_port, guest: 22, host: 4422, id: "ssh"
17    end
18  end

 2行目は、先ほどvagrant box add~で追加したBoxを利用するための設定です。今回が初めて実行する場合であれば、予めvagrant box add~を実行しておく必要があります。

 4行目~10行目までがWebサーバー用のCentOS 7サーバーを構築するための設定、12行目~17行目までがDBサーバー用のCentOS 7サーバーを構築するための設定です。

 6行目と15行目が相互通信に利用するためのホストオンリーアダプタ用のIP設定、7行目と14行目がホスト名の設定、8行目と16行目がsshアクセス用のポートフォワーディングの設定、9行目がWebサーバーアクセス用へのポートフォワーディングの設定です。

 5行目と13行目がプロビジョニング用の設定です。Vagrantは、シェルスクリプトのほか、標準でchefpuppetといった代表的な構成管理ツールを利用できます。

 ここでは、chefを利用することにします。Web用、DB用のchefの設定ファイルをVagrantfileが置かれているディレクトリ配下に、下記のようなディレクトリ構成でそれぞれ置いてあります。

vagrant
│  Vagrantfile
└─cookbooks
    ├─apache
    │  └─recipes
    │          default.rb
    │
    └─mariadb
        ├─recipes
        │      default.rb
        │
        └─templates
            └─default
                    grant.sql.erb

 Webサーバー用のchef設定ファイル(vagrant\cookbooks\apache\recipes\default.rb)は、次のとおりです。Chef自体は今回のテーマではないので詳しくは説明しませんが、firewalldの停止のあと、httpdのインストールを行い、自動起動とサービス起動の設定、MariaDBのクライアントのインストールを行っています。

default.rb(web)

service "firewalld" do
    ignore_failure true
    action [:disable, :stop]
end

package "httpd" do
  action :install
end

service "httpd" do
  action [ :enable, :start ]
end

package "mariadb" do
   action :install
end

 DBサーバー用のchef設定ファイル(vagrant\cookbooks\mariadb\recipes\default.rb)は、次のとおりです。こちらもfirewalldの停止のあと、MariaDBサーバーのインストール、自動起動とサービス起動の設定を行っています。そして、最後に別ファイルで置いてあるテンプレートファイル(後述)を読み込んだあと、MariaDBにインポートしています。

default.rb(db)

service "firewalld" do
    ignore_failure true
    action [:disable, :stop]
end

package "mariadb-server" do
  action :install
end

service "mariadb" do
  action [ :enable, :start ]
end

template "/var/tmp/grant.sql" do
  owner "root"
  group "root"
  mode 0644
end

execute "grant" do
   command "mysql -uroot < /var/tmp/grant.sql"
end

 テンプレートファイル(vagrant\cookbooks\mariadb\templates\default\grant.sql)は、次のとおりです。これは、Webサーバーからrootユーザーでリモートアクセスできるように権限を与えるためのファイルです。

grant.sql.erb

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.33.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

 ここまで準備ができれば、あとは、Vagrantfileのあるディレクトリをカレントディレクトリにして、vagrant upを実行するだけです。しばらく待つと、要件どおりの模擬開発環境ができあがります。

 WebサーバーにApacheがインストールされ、ホストマシンのWebブラウザからポートフォワーディングされてテストページが参照できます。



 また、webサーバーからmysqlコマンドでDBサーバー上のMariaDBへのアクセスもできています。

[vagrant@web ~]$ mysql -uroot -h192.168.33.11
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.41-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select version();
+----------------+
| version()      |
+----------------+
| 5.5.41-MariaDB |
+----------------+
1 row in set (0.00 sec)

MariaDB [(none)]>

Vagrantは本当に便利です!

 今回の擬似開発環境は、実際にはありえないほど非常に簡易なものです。また、設定ファイルをなるべくシンプルにするため、firewalldを止めてしまったり、テンプレートファイルを適切に利用していなかったりなど、設定もかなり雑です。しかし、Vagrantの便利さはある程度伝わったのではないかと思います。

 簡単にまとめると、Vagrantの利点は大きく3つあるように思います。まず1つ目は、「利用者が簡単なコマンドを実行するだけで環境構築できること」です。サーバー知識の少ない開発者でも、複雑な手順書がなくても開発環境を構築できます。

 2つ目は「ローカルマシン内に仮想環境を用いて開発環境を構築すること」です。同じ仮想環境のイメージをベースに構築するため、環境の差異に起因する挙動の違いが発生することはなくなります。また、ローカルマシン上に構築しているので負荷テストを行っても迷惑をかけることもありません。

 3つ目は、「サーバーの構成情報をコードで記述できること」です。コード化されることにより環境構築が自動化され、漏れのない環境を効率よく構築できます。また、バージョン管理できるので、以前の状態に戻すことも容易となります。

 なお、より本格的な開発環境を構築するなら、Vagrantのプロビジョニング機能ではなく、インストール後のゲストマシン上でchefやpuppetを実行する場合もあると思います。Vagrantはこうした用途を想定して、vagrant実行ディレクトリ(Vagrantfileが置かれているディクトリ)を、ゲストマシン上の/vagrantディレクトリに自動マウントするよう、あらかじめ設定されています。これにより、ホストマシン上でバージョン管理ツールからvagrant実行ディレクトリにpullしておいたchef/puppetの設定ファイルを、ゲストマシン上の/vagrantディレクトリでそのまま実行して自動構成を行うようなシームレスな運用が可能となります。

 最後に、Vagrantにはプラグインがいろいろ用意されており、機能拡張することができます。特に、saharaというプラグインをインストールしておけば、ゲストマシンをいつでもcommit前の状態に戻すことができます。これにより、どんなに大幅な変更を行っても、コマンド一発で変更前の状態に戻すことができるので、何の心配もなく開発に取り組むことができるはずです。

 今回の調査で、どうしてもっと早くVagrantを使い始めなかったんだろうと思いました。次回は、もう1つの気になるキーワード、「docker」について書きたいと思います。

0 件のコメント:

コメントを投稿