そこで同じくS君に「vagrantはprovisionできないと意味ないよね」と相談したところ、数日後「直しました。PullRequest中です。CloudStackはVM作成とは別に、ネットワーク周りの設定(FW、PortForwarding)を追加しないといけないので機能追加しました」との事。
それから待つこと約2週間。やっと本家にマージされたので、vagrant-cloudstackとIaaSとして私が携わっているIDCFクラウドセルフタイプを使って、VM作成およびサーバ構築の自動化までの方法を紹介したいと思います。
今回はIDCFクラウドセルフタイプを使いますが、CloudStackであれば他事業者のものでも、自社や自宅ラックで動かしているCloudStack環境でも、Vagrantfileのパラメータを変更するだけで利用可能なはずです。
それでは始めます。
Vagarntとは
Vagrant(ベイグラント)はVirtualBoxのフロントエンドに相当するツールです。vagrantコマンドなどを使ってコマンドラインから簡単に新しい仮想マシンを削除したり、不要なVMを削除したりできます。 オープンソースとして公開されています。各種ドキュメントは下記で公開されています。http://www.vagrantup.com/
VagrantはVM作成後のソフトウェア構築の自動化にも対応しており、その場合はshellやChefSolo,Puppet,Ansibleなどのdeploy toolと連携します。今回は、ChefSoloを使用します。
今回はChefおよびChefSoloの説明は割愛しますが、興味のある方は後述の参考情報をご参照ください。 (@naoyaさんの入門Chef Soloから入るのが王道です)
vagrant-cloudstackとは
Vagrantのpluginです。 上述の通り、Vagrantは元々local PCのVirtualBoxのフロントエンドとして開発されたものですが、VMWareにも対応し、その後、pluginをinstallすることで、様々な機能を追加できるようになりました。そのpluginの中で、外部環境の仮想マシンの起動やprovisionができるようにしたのが、vagrant-aws pluginがあります。
その後、同じように外部環境を使えるpluginが開発されています。 現在、私の方で確認したものは下記の通りです。これらは
vagrant plugin installコマンド
でinstallできます。(詳細は各ドキュメントをご参照ください)vagrant-aws
vagrant-openstack
vagrant-rackspace
vagrant-digitalocean
vagrant-cloudstack
上記以外のpluginについては下記をご参照ください。外部環境の仮想マシンを使うもの以外にも、vagrant-omnibus、vagrant-berkshelf、saharaなど様々なpluginが開発されています。
http://www.rubydoc.info/gems/v
2013年12月現在、vagrant-cloudstackの機能は下記の通りです。(changelog抜粋)
0.1.0
* Plugin now enables parallelization by default.
+ This behaviour can be turned off by invoking vagrant with --no-parallel (this flag requires vagrant 1.2.1)
* Added support for starting, stoping and reloading machines.
* Added support for portforwarding and adding ssh keys.
* Added support for basic network type.
+ Basic means that there is no need to specify a network_id to connecto to.
+ Default network type is advanced.
CloudStackとIDCFクラウドセルフタイプ
CloudStackはオープンソースのクラウド基盤管理ソフトウェアで、コンピューティングリソースをプールすることにより、パブリック、プライベート、およびハイブリッドのIaaS(Infrastructure as a Service)クラウドを構築することができます。同じようなソフトウェアでOpenStack、Wakame等があります。
私が所属するIDCフロンティアでは、2011年9月よりCloudStackを使用したIaaSサービス IDCFクラウドセルフタイプ(以下、IDCFクラウド)を提供しています。
IDCFクラウドでは、CloudStack APIを利用可能です。
vagrant-cloudstackでは、このCloudStack APIを利用して、CloudStack環境上に仮想マシンを作成します。
環境
今回はローカルPCとして、MacBook Air(MBA)でVagrant環境を用意します。予め、MBAに下記をinstallします。- ローカル環境
- MBA(MacOSX10.9、メモリ8GB、HDD250GB)
- ソフトウェア
- VirtualBox 4.3.2
下記からDL,installします。
https://www.virtualbox.org/wiki/Downloads - Vagrant 1.3.5
下記からDL,installします。
http://downloads.vagrantup.com/ - Ruby 1.9.3p327
rbenvを使用 - Bundler 1.3.5
ローカルMBAのCLIより、下記コマンドを実施
$ gem install bundler
- Vargrant plugin
ローカルMBAのCLIより、下記コマンドを実施- vagrant-berkshelf 1.3.3
$ vagrant plugin install vagrant-berkshelf
- vagrant-omnibus 1.1.2
$ vagrant plugin install vagrant-omnibus
- vagrant-cloudstack 0.1.0
$ vagrant plugin install vagrant-cloudstack
- vagrant-berkshelf 1.3.3
- VirtualBox 4.3.2
vagrant-cloudstack設定方針
ローカルPCの仮想環境にて仮想マシンを作成する場合には、Vagrant用に設定されたイメージ(vagrantbox)を使用しますが、外部環境を利用する場合はvagrantboxは利用できません。
今回は、IDCFクラウドにて用意されているUbuntu12.04テンプレートを用いて仮想マシンを作成し、その後、必要な設定を追加していきます。
- 今回はvagrant-cloudstack利用に必要な最小限の設定ファイル(Vagrantfileおよびscript.sh)を用意。それ以外は、VirtualBox環境で利用していたものを利用する(ChefRecipeなど)
- IDCFクラウドのUbuntu12.04テンプレートを使用
- id:rootでvagrantの設定を実施
- vagrant boxの基本設定と同様に、id:vagrantも作成し、no passwordでsudoできるようにしておく。
- 外部からのsshアクセス用のportは2222を使用
- installするものは以下の通り。
- 公開されているcookbookを利用して、rvmをinstallし、ruby1.9.3を指定
- 自作cookbook(site-cookbook)にて、apche2とmysql-serverをinstall
注意事項
- IDCFクラウドでアカウント作成後、一度、webのコントロール画面から仮想マシンを作成してください。そうする事で、ネットワークとしてIPアドレスが1つ作成されます。このIPアドレスを使用します。
- またできれば、上記で作成した仮想マシンは起動した状態で、以下のvagrant-cloudstackの作業を実施してください。(CloudStackでは仮想マシンが0台になると、FW,PortForwarding,DHCP機能を提供するVR(VirtualRouter)が一旦停止し、再度仮想マシンを起動するVRの起動も行うため、余分に時間がかかるためです)
- 仮想マシン起動中は、料金が発生しますのでご注意ください。作業終了後は起動しっぱなしの仮想マシンがないか確認するようにしましょう。
設定内容
1. Vagrant環境設定用スクリプトを用意scripts/script.sh
として下記ファイルを用意します。- 内容はこちらと、vagrantbox.esのpostinstall.shを参考にしています。
#!/bin/bash
account=$1
useradd -p vagrant -m $account -s /bin/bash
sed -i -e '/Defaults\s\+env_reset/a Defaults\texempt_group=admin' /etc/sudoers
groupadd -r admin || true
usermod -a -G admin $account
sed -i -e 's/%admin ALL=(ALL) ALL/%admin ALL=(ALL) NOPASSWD:ALL/g' /etc/sudoers
echo 'UseDNS no' >> /etc/ssh/sshd_config
vssh="/home/${account}/.ssh"
mkdir -p $vssh
chmod 700 $vssh
(cd $vssh &&
wget --no-check-certificate \
'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' \
-O $vssh/authorized_keys)
chmod 0600 $vssh/authorized_keys
chown -R ${account}:vagrant $vssh
unset vssh
2. Vagrantfile作成
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# config.ssh.username = "vagrant"
config.ssh.username = "root"
config.ssh.private_key_path = "~/.ssh/id_rsa" # IDCFクラウドで仮想マシンを作成時に指定したSSH鍵の秘密鍵を指定
config.ssh.port = "2222"
config.vm.box = "dummy"
config.vm.box_url = "https://github.com/klarna/vagrant-cloudstack/raw/master/dummy.box"
config.vm.provider :cloudstack do |cloudstack, override|
cloudstack.scheme = "https" # IDCFクラウドAPI設定
cloudstack.host = "api.noahcloud.jp" # 同上
cloudstack.port = "443" # 同上
cloudstack.path = "/portal/client/api" # 同上
cloudstack.api_key = "*****" # 画面右上の[マイプロファイル]から[API資格情報]の[API鍵]をコピペ
cloudstack.secret_key = "*****" # 同じく秘密鍵をコピペ
cloudstack.template_id = "2212" # IDCFクラウドで使用するテンプレートのIDを指定。今回はIDCFが提供するUbuntu12.04を指定。
cloudstack.service_offering_id = "24" #IDCFクラウドの仮想マシンタイプ:XSを指定
cloudstack.zone_id = "2" # 2ゾーンあるうち、ゾーン2を指定
cloudstack.keypair = "*****" # IDCFクラウドで仮想マシンを作成時に指定したSSH鍵の秘密鍵を指定
cloudstack.pf_ip_address_id = "*****" # 使用するIPのIDを使用。[マイリソース]-[ネットワーク]で確認
cloudstack.pf_public_port = "2222"
cloudstack.pf_private_port = "22"
cloudstack.instance_ready_timeout = 1800
end
# Chef-solo
config.berkshelf.enabled = true
config.omnibus.chef_version = :latest
config.vm.provision :shell do |shell|
shell.path = "scripts/script.sh" # 上述のscript.shを指定
shell.args = "vagrant" # script.shの引数を指定
end
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["./cookbooks", "./site-cookbooks"]
chef.add_recipe "apt"
chef.add_recipe "rvm::system"
chef.add_recipe "rvm::vagrant"
chef.add_recipe "myapp"
chef.json = {
"rvm" => {
"default_ruby" => "ruby-1.9.3-p448",
"global_gems" => [
{"name" => "bundler"}
]
}
}
end
end
3. 仮想マシンを作成
下記を実行
vagrant up --provider=cloudstack
4. 仮想マシン作成完了後、仮想マシンにsshで接続
そのまま
vagrant ssh
を実行すると、Vagrantfileの内容に従って、rootとして接続します。$ vagrant ssh
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic x86_64)
* Documentation: https://help.ubuntu.com/
*** System restart required ***
________ ______ ______ __ _
/ _/ __ \/ ____/ / ____/________ ____ / /_(_)__ _____
/ // / / / / / /_ / ___/ __ \/ __ \/ __/ / _ \/ ___/
_/ // /_/ / /___ / __/ / / / /_/ / / / / /_/ / __/ /
/___/_____/\____/ /_/ /_/ \____/_/ /_/\__/_/\___/_/
root@i-229-51079-VM:~#
下記の通り、Vagrantfileを一部コメントアウトすることで、仮想マシン作成時に作成したid:vagrantとしてsshアクセスします。vagrantからsudoコマンドを使って、操作可能です。
# config.ssh.username = "vagrant" # この行はコメントインしてもいいが、default値が"vagrant"のため、コメントアウトのままでもよい。
# config.ssh.username = "root" # コメントアウト
# config.ssh.private_key_path = "~/.ssh/id_rsa" # コメントアウト
下記の通り、login後のidがvagrantになっていることが分かります。$ vagrant ssh
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic x86_64)
* Documentation: https://help.ubuntu.com/
*** System restart required ***
________ ______ ______ __ _
/ _/ __ \/ ____/ / ____/________ ____ / /_(_)__ _____
/ // / / / / / /_ / ___/ __ \/ __ \/ __/ / _ \/ ___/
_/ // /_/ / /___ / __/ / / / /_/ / / / / /_/ / __/ /
/___/_____/\____/ /_/ /_/ \____/_/ /_/\__/_/\___/_/
vagrant@i-229-51079-VM:~$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),999(admin),1001(rvm)
サンプルファイル
githubに置きました。個人に依存するパラメータは伏せ字(*****)にしていますので、適宜適切なパラメータを設定してください。
課題
今回の作業にあたって、下記不具合が確認されました。とりあえず、目的のCloudStack上での仮想マシンの作成は達成できたので、後日調査する事とします。- 自作cookbook(site-cookbook)内のrecipeのserviceリソースが正常に動作しない
通常のVirtualBox環境では動作していたので、vagrant-cloudstackの現在の動作制限もしくは不具合かも。 vagrant ssh
実行時。下記warningが表示される。
vagrant-cloudstackはvagrant-awsをfolkして作成されており、そこで利用しているgemに依存している模様。
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
- 今回はUbuntu12.04について紹介したが、CentOSを使用する場合は、今回紹介した設定以外に事前に設定すべき箇所がある模様。
まとめ
- 駆け足でしたが、vagrant-cloudstackを使用して、IDCFクラウド上に仮想マシンを作成し、さらにソフトウェアのinstallする方法を紹介しました。
- Vagrant+ChefSoloでlocal PC上に開発環境作成後、IaaS上に本番環境をdeployする流れがイメージいただけたら幸いです。
- S君ありがとう!
参考情報
今っぽい Vagrant + Chef Solo チュートリアルBerkshelfベースにvagrant, chef(knife-solo)環境を簡単に構築する方法
dotinstall Vagrant入門
入門Chef Solo - Infrastructure as Code
dotinstall Chef入門
RubyistMagazineChef でサーバ管理を楽チンにしよう! (第 1 回)