※この記事は公開されてから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
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
<h1>Hello, CloudStack!!</h1>
$ vagrant up
$ vagrant ssh
$ vagrant ssh -- -L 8080:localhost:80
$ vagrant destroy
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
> 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
> 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を実行可能であること
- ログイン用ユーザー作成
- 仮想マシン作成時にログインユーザーが公開鍵認証でログインできるように設定
- /etc/sudoersでログインユーザーのrequiretty無効化、パスワード無しでのsudo許可
SSHキーペアの作成
作成したVMにログイン時に公開鍵認証を使用するためSSHキーペアを用意します。既存のキーペアがあればそれらを使用することができます。 まだキーペアがない場合、cloudmonkeyのシェルから次のコマンドを実行して作成することができます。実行後に表示される秘密鍵を保存して使用してください。
> create sshkeypair name=YOUR_KEYPAIR_NAME
vagrant-cloudstackのインストール
次のコマンドでvagrant-cloudstackをインストールできます。(今回はバージョン 0.1.0 を使用しています。)
$ vagrant plugin install vagrant-cloudstack
# apt-get install build-essential libxslt-dev libxml2-dev zlib1g-dev
ダミーボックスの追加
CloudStack上に仮想マシンを作成する場合、イメージとしてCloudStack上のテンプレートを利用するので、ダミーのBoxを追加しておきます。
$ vagrant box add dummy https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.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
$ vagrant ssh -- -L 8080:localhost:80
$ vagrant destroy
Dockerを使ってみよう
Dockerとはコンテナを利用した軽量な仮想環境を使用するためのツールです。Vagrantは1.4から公式にDockerをProvisionerとして使うことができるようになっており、 Vagrantで作成した仮想マシン上でDockerのイメージを簡単に実行できるようになっています。 今回は、例としてブラウザ上でインタラクティブにPythonを使えるツール IPython Notebook を導入してみます。 プロジェクトディレクトリの構成は以下のようになります。
$ tree
.
├── Vagrantfile
└── ipython-notebook
└── Dockerfile
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
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
$ vagrant up --provider=cloudstack
$ vagrant ssh -- -L 8888:localhost:8888
まとめ
Vagrantを利用してCloudStack上に環境構築を行う方法をご紹介しました。 CloudStackでの環境構築が手軽にできるようになりますので、ぜひお試しください。使用したツールのバージョン
- Vagrant (1.4.0)
- cloudmonkey (5.0.0)
- vagrant-cloudstack (0.1.0)
- inifile (2.0.2)
- IPython (1.1.0)
<連載記事>
- Vagrantを使ってCloudStack上の環境構築をしてみよう
- vagrant-cloudstack用 CentOS 6.5 テンプレート公開