IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

Vagrantを使ってCloudStack上の環境構築をしてみよう

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

こんにちは、佐々木(@atsaki)です。

CloudStackを使うと欲しいときに欲しいだけ仮想マシンを簡単に作成することができて便利ですが、仮想マシンを作成するたびに同じ設定を入力したり、GUIでの操作が必要になることを面倒と思われている方もいらっしゃるのではないでしょうか?

今回はVagrantというツールを使用して、CloudStack上により簡単に環境を構築する方法をご紹介します。

 

※本記事は CloudStack Advent Calendar 2013 の12月19日分の記事となっています。

Vagrant

Vagrant は設定ファイルに記述した内容をもとに簡単に仮想マシンを作成してくれるツールです。 実際の使い方をイメージしていただくために、 VirtualBox 上にUbuntu 12.04の仮想マシンを作成する例を見てみましょう。ただ仮想マシンを作成するだけでは面白くないので、作成した仮想マシンにApacheをインストールしHTMLを表示させてみます。 Vagrantを使用する際には、プロジェクトごとにディレクトリを作り、その中に必要となるファイルを格納します。
$ mkdir simple-example
$ cd simple-example
$ ls
Vagrantfile index.html
Vagrantfileは構築する環境についての記述を行うファイルでVagrantを使用するうえで最も重要なファイルです。
Vagrant.configure("2") do |config|

  # 使用する仮想マシンのイメージ(Box)を指定
  config.vm.box = "precise64"
  # Boxをダウンロードする際のURLを指定
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

  # 仮想マシン作成後に実行される処理を記述
  # シェルスクリプト以外にもAnsible, Chef, Puppetなどが使用可能
  config.vm.provision :shell do |s|
    s.inline = <<-EOS
 apt-get update
 apt-get install apache2 -y
 cp /vagrant/index.html /var/www/index.html
 EOS
  end
end
index.htmlには今回表示させるHTMLを記述します。
<h1>Hello, CloudStack!!</h1>
シェルスクリプトの最後でファイルのコピーを行っていますが、これは何をコピーしているのでしょう?実はVagrantはプロジェクトのディレクトリを作成された仮想マシンの/vagrantディレクトリと共有します。つまり、/vagrant/index.htmlはプロジェクトディレクトリ内のindex.htmlです。 次のコマンドを実行すると仮想マシンが作成され、シェルスクリプトが実行されます。
$ vagrant up
次のコマンドで仮想マシンにログインできます。
$ vagrant ssh
次のようにポートフォワーディングを行い、ブラウザから http://localhost:8080 を開くと「Hello, CloudStack!!」と表示されたページが開きます。
$ vagrant ssh -- -L 8080:localhost:80
仮想マシンが不要になったら次のコマンドで削除することができます。
$ vagrant destroy
以上が簡単なVagrantの使い方の流れです。 Vagrantを使用するとVagrantfileを記述するだけで仮想マシンの作成、仮想マシンへのファイルの転送、作成後の処理、削除といった操作が非常に簡単にできることがご理解いただけたかと思います。検証などで同じ仮想マシンを繰り返し作成・削除するような場合には、特に威力を発揮します。

vagrant-cloudstack

今回ご紹介するvagrant-cloudstackは、VagrantをCloudStackに対応させるためのプラグインです。vagrant-cloudstackを使用することによりVagrantfileに少し設定を追加するだけで上で見た操作がCloudStack上でも可能となります。

vagrant-cloudstackの準備

Vagrantのインストール

下記URLからお使いのOSにあわせてバイナリを入手しインストールしてください。 本記事ではバージョン 1.4.0 を使用しています。本記事で使用しているソフトウェアのバージョン情報は 使用したツールのバージョン に記載しておりますのでご参照ください。

cloudmonkeyのインストール・設定

下記リンク先を参考に cloudmonkey のインストール・設定を行ってください。 vagrant-cloudstackの動作にcloudmonkeyは必要ありません。今回は設定に必要なパラメータを取得するために使用しています。 インストールが成功すると、以下のコマンドでcloudmonkeyのシェルが起動します。
$ cloudmonkey
cloudmonkeyのシェルからAPIを使用するために必要な情報を設定していきます。お使いの環境に合わせて設定を行ってください。ここでは IDCフロンティアのセルフクラウド の設定例を示します。(apikey、secretkeyについてはご自身の使用している値で置き換えてください。)
> set protocol https
> set host api.noahcloud.jp
> set port 443
> set path /portal/client/api
> set apikey YOUR_API_KEY
> set secretkey YOUR_SECRET_KEY
APIが使用可能になっていることを確認します。以下のように結果が返ってくれば成功です。
> set display table
> list zones filter=id,name
count = 2
zone:
+----+-------------+
| id | name |
+----+-------------+
| 1 | jp-east-t1v |
| 2 | jp-east-f2v |
+----+-------------+

Vagrant用テンプレートの用意

vagrant-cloudstackを使用する際には専用のテンプレートを作成しておくことをおすすめします。仮想マシンの作成・削除は専用のテンプレートでなくても可能ですが、SSHによるログインや作成後の処理を実行するためにはテンプレートの用意が必要になります。 テンプレートが満たすべき条件は以下2つです。
  • 仮想マシン作成時点でSSHログイン可能であること
  • SSHログインに使用するユーザーがtty・パスワードなしでsudoを実行可能であること
セルフクラウドの場合、Ubuntu Server 12.04 LTSのテンプレート(id:2212)のrootユーザーがこの条件を満たしているので、今回はこのテンプレートを用いて説明します。 その他のテンプレートを使用する場合、一度テンプレートから仮想マシンを作成し、以下の設定を行ったあとテンプレート化します。 IDCフロンティアではvagrant-cloudstack対応テンプレートを準備中です。ご期待ください!!!

SSHキーペアの作成

作成したVMにログイン時に公開鍵認証を使用するためSSHキーペアを用意します。既存のキーペアがあればそれらを使用することができます。 まだキーペアがない場合、cloudmonkeyのシェルから次のコマンドを実行して作成することができます。実行後に表示される秘密鍵を保存して使用してください。
> create sshkeypair name=YOUR_KEYPAIR_NAME

vagrant-cloudstackのインストール

次のコマンドでvagrant-cloudstackをインストールできます。(今回はバージョン 0.1.0 を使用しています。)
$ vagrant plugin install vagrant-cloudstack
エラーが出てインストールできない場合には、必要なパッケージが足りていない場合があるので、ビルドのログを見返してみましょう。Ubuntu 12.04の場合は、以下のパッケージをインストールします。
# apt-get install build-essential libxslt-dev libxml2-dev zlib1g-dev

ダミーボックスの追加

CloudStack上に仮想マシンを作成する場合、イメージとしてCloudStack上のテンプレートを利用するので、ダミーのBoxを追加しておきます。

inifileのインストール

cloudmonkeyの設定ファイルをVagrantから読み込むためにinifileをインストールします。 Vagrantのプラグインはgemなので、vagrant-cloudstackと同じ方法でインストール可能です。 (今回はバージョン 2.0.2 を使用しています。)
$ vagrant plugin install inifile
プラグインのバージョンは次のように確認することができます。
$ vagrant plugin list
inifile (2.0.2)
vagrant-cloudstack (0.1.0)

vagrant-cloudstackを使ってみよう

Vagrantfileの作成

冒頭で示したVirtualBox用のVagrantfileをCloudStackに対応させてみましょう。 ちょっと長いですが、基本的にはCloudStack用の設定が追加されただけです。
require "inifile"

Vagrant.configure("2") do |config|

  # VirtualBox(デフォルト)用の設定
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

  # CloudStack用の設定
  # CloudStack使用時にデフォルトの設定を上書きする場合にはoverrideを使用します
  config.vm.provider :cloudstack do |cloudstack, override|

    # CloudStack利用時にはダミーのBoxを使用する
    override.vm.box = "dummy"

    # APIを使用するための設定
    # ここではcloudmonkeyの設定ファイルから読み込んでいるが直接入力することも可能
    # 例) cloudstack.host = "api.noahcloud.jp"
    cloudmonkey_config = IniFile.load(File.expand_path("~/.cloudmonkey/config"))
    cloudstack.scheme     = cloudmonkey_config["server"]["protocol"]
    cloudstack.host       = cloudmonkey_config["server"]["host"]
    cloudstack.path       = cloudmonkey_config["server"]["path"]
    cloudstack.port       = cloudmonkey_config["server"]["port"]
    cloudstack.api_key    = cloudmonkey_config["user"]["apikey"]
    cloudstack.secret_key = cloudmonkey_config["user"]["secretkey"]

    # ゾーン・テンプレート・サービスオファリング・キーペアを指定
    # 指定する値はcloudmonkeyのlist系のコマンドで調べることが可能
    # 例) list zones filter=id,name
    cloudstack.zone_id = "1"
    cloudstack.template_id = "2212"
    cloudstack.service_offering_id = "24"
    cloudstack.keypair = "YOUR_KEYPAIR_NAME"

    # グローバルIPアドレスを使ってSSHログインするためのポートフォワーディングの設定
    # IPアドレスのIDは以下のコマンドで調べることが可能
    # > list publicipaddresses filter=id,ipaddress,zonename
    # ポートフォワーディングを設定したポートはファイアウォールがAny(0.0.0.0/0)で開放される
    # ポートフォワーディング未設定の場合、SSHはプライベートIPに対して行われる
    cloudstack.pf_ip_address_id = "1201"
    cloudstack.pf_public_port = "2222"
    cloudstack.pf_private_port = "22"

    # SSHログインに使用する秘密鍵・ポートの設定
    override.ssh.username = "root"
    override.ssh.private_key_path = "YOUR_PRIVATE_KEY_PATH"
    override.ssh.port = "2222"

    # VMが使用可能になるまでのタイムアウト値(秒)
    cloudstack.instance_ready_timeout = 1800
  end                                                    

  # 仮想マシン作成後の処理。VirtualBox用と全く同じ。
  config.vm.provision :shell do |s|
    s.inline = <<-EOS
 apt-get update
 apt-get install apache2 -y
 cp /vagrant/index.html /var/www/index.html
 EOS
  end
end

仮想マシンの作成

CloudStackに仮想マシンの作成時には以下のようにオプションをつけます。 既に同じVagrantfileからVirtualBox上に仮想マシンを作成している場合には、CloudStack上に仮想マシンを作成できませんので、VirtualBox上の仮想マシンを削除するか、別にプロジェクトディレクトリを用意してください。
# vagrant up --provider=cloudstack
仮想マシンがRunning状態になっているにも関わらずSSH接続待ちで止まっている場合は、もう一つ端末を開いて「vagrant ssh」、「vagrant ssh-config」コマンドを実行し、SSHの設定を確認してみましょう。「 vagrant up」を中断すると仮想マシンが削除されてしまうので注意しましょう。 冒頭での例と同様に次のコマンドを実行しブラウザでの表示を確認してみましょう。ブラウザから http://localhost:8080 を開いて「Hello, CloudStack!!」と表示されて いれば成功です。
$ vagrant ssh -- -L 8080:localhost:80
仮想マシンの削除もVirtualBoxと同じく次のコマンドで実行できます。仮想マシン削除時にファイアウォール・ポートフォワーディングのルールも削除されます。
$ vagrant destroy

Dockerを使ってみよう

Dockerとはコンテナを利用した軽量な仮想環境を使用するためのツールです。Vagrantは1.4から公式にDockerをProvisionerとして使うことができるようになっており、 Vagrantで作成した仮想マシン上でDockerのイメージを簡単に実行できるようになっています。 今回は、例としてブラウザ上でインタラクティブにPythonを使えるツール IPython Notebook を導入してみます。 プロジェクトディレクトリの構成は以下のようになります。
$ tree
.
├── Vagrantfile
└── ipython-notebook
 └── Dockerfile
Vagrantfileの仮想マシン作成後の処理をDockerを使用するように書き換えます。
require "inifile"

Vagrant.configure("2") do |config|

  # VirtualBox用の設定
  config.vm.box = "precise64"
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

  # CloudStack用の設定
  config.vm.provider :cloudstack do |cloudstack, override|

    # CloudStack利用時にはダミーのBoxを使用する
    override.vm.box = "dummy"

    # APIを使用するための設定
    # ここではcloudmonkeyの設定ファイルから読み込んでいるが直接入力することも可能
    # 例) cloudstack.host = "api.noahcloud.jp"
    cloudmonkey_config = IniFile.load(File.expand_path("~/.cloudmonkey/config"))
    cloudstack.scheme     = cloudmonkey_config["server"]["protocol"]
    cloudstack.host       = cloudmonkey_config["server"]["host"]
    cloudstack.path       = cloudmonkey_config["server"]["path"]
    cloudstack.port       = cloudmonkey_config["server"]["port"]
    cloudstack.api_key    = cloudmonkey_config["user"]["apikey"]
    cloudstack.secret_key = cloudmonkey_config["user"]["secretkey"]

    # ゾーン・テンプレート・サービスオファリング・キーペアを指定
    # 指定する値はCloudmonkeyのlist系のコマンドで調べることが可能
    # 例) list zones filter=id,name
    cloudstack.zone_id = "1"
    cloudstack.template_id = "2212"
    cloudstack.service_offering_id = "24"
    cloudstack.keypair = "YOUR_KEYPAIR_NAME"

    # グローバルIPアドレスを使ってSSHログインするためのポートフォワーディングの設定
    # IPアドレスのIDは以下のコマンドで調べることが可能
    # > list publicipaddresses filter=id,ipaddress,zonename
    # ポートフォワーディングを設定したポートはファイアウォールがAny(0.0.0.0/0)で開放される
    # ポートフォワーディング未設定の場合、SSHはプライベートIPに対して行われる
    cloudstack.pf_ip_address_id = "1201"
    cloudstack.pf_public_port = "2222"
    cloudstack.pf_private_port = "22"

    # SSHログインに使用する秘密鍵・ポートの設定
    override.ssh.username = "root"
    override.ssh.private_key_path = "YOUR_PRIVATE_KEY_PATH"
    override.ssh.port = "2222"

    # VMが使用可能になるまでのタイムアウト値(秒)
    cloudstack.instance_ready_timeout = 1800
  end                                                    

  # Dockerをインストール(最新版がうまく動かなかったので0.6.7を使用)
  # ubuntuイメージを取得
  config.vm.provision "docker" do |d|
    d.version = "0.6.7"
    d.pull_images "ubuntu"
  end                                                    

  # Dockerfileからイメージをビルド
  config.vm.provision :shell do |s|
    s.inline = <<-EOS
 cd /vagrant/ipython-notebook
 docker build -t ipython-notebook .
 EOS
  end                                                    

  # コンテナを起動
  config.vm.provision "docker" do |d|
    d.run "ipython-notebook",
      args: "-name 'ipython-notebook' -p '8888:8888'"
  end
end
DockerfileはDockerのイメージについて記述するファイルです。内容は以下のように実行するコマンドを羅列したようなものになっています。
FROM ubuntu
MAINTAINER Atsushi Sasaki                                                       

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe multiverse" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install build-essential -y
RUN apt-get install python-dev python-setuptools python-pip -y
RUN apt-get install python-matplotlib python-numpy python-sympy python-pandas python-rpy python-rpy2 -y
RUN apt-get install r-base r-base-dev -y
RUN apt-get install ruby -y
RUN easy_install -U ipython[all]  

EXPOSE 8888
CMD ipython notebook --pylab=inline --ip=* --MappingKernelManager.time_to_dead=10 --MappingKernelManager.first_beat=3
仮想マシン起動後に8888番ポートをポートフォワーディングし、ブラウザから http://localhost:8888 を開くとIPython Notebookが開きます。
$ vagrant up --provider=cloudstack
$ vagrant ssh -- -L 8888:localhost:8888
IPython Notebookの使い方はリンク先をご参照ください。2番目のリンクで使い方の例を見ることができます。ノートブックをダウンロードして構築した環境で動かすことも可能です。 Dockerを利用することで、簡単にアプリケーションを仮想マシン上で走らせることができます。 また、直にCloudStack上で仮想マシンを作成するよりも短時間で環境が用意できるので、うまく使い分けることによって便利で効率的な使い方が可能になると思います。

まとめ

Vagrantを利用してCloudStack上に環境構築を行う方法をご紹介しました。 CloudStackでの環境構築が手軽にできるようになりますので、ぜひお試しください。

使用したツールのバージョン

<連載記事>

Copyright © IDC Frontier Inc.