2013年12月31日火曜日

IT関連コンテスト情報まとめてみた


最近、次男が通う小学校の教頭先生から小学生向けプレゼンコンテストを教えてもらったり、@jishihaから三鷹のU15,U18 rubyコンテストを教えてもらいました。
思った以上にIT系のコンテスト多い、しかも小中学生が参加できるものもある、賞品・賞金もでる。結構、おいしいんじゃないかと。(@jishihaの受け売りだけど)
で、まとめてみました。


まとめてみると、ITコンテストといってもいろいろな種類がある。プログラム、アプリ、サーバ系そして企画・プレゼン系。
中高校生が参加できるものから小学生が参加できるものや、チームで参加のもの。

まだまだ編集中ですが、まずは公開したいと思います。早いうちに、アプリ系のコンテスト情報追加します…

このエントリーをはてなブックマークに追加

2013年12月16日月曜日

vagrant-cloudstackを試してみた

いまいち周りで、vagrant-cloudstackが盛り上がらないなーと思っていた所、所属する会社の若手エンジニアS君に「vagrant-cloudstackってのがあるんだけどさー、IDCFクラウドセルフタイプでうまく動かないんだよね。」と相談したところ「あ、直しました。本家にPullRequest出してます」と即答。数日後無事マージされた事を確認。ただし、本家のvagrant-cloudstackの機能制限のため、vagrant up,destroyぐらいしかできない。vagrant ssh接続もできない。もちろんsshを利用するprovisionも実行できない。。。という状況でした。

そこで同じく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)クラウドを構築することができます。
同じようなソフトウェアでOpenStackWakame等があります。

私が所属する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-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:~#

5. id:vagrantとして、仮想マシンにsshで接続
下記の通り、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 回)
このエントリーをはてなブックマークに追加