2011年11月27日日曜日

CloudStack API用Perlライブラリを公開しました

以前作成したスクリプトをライブラリ化してCPANに公開しました。
Net::CloudStack

CloudStack APIについてのdocumentは下記をご参照ください。
Developer's Guide:CloudStack


ライブラリinstall手順(cpan install以外の部分) についてまとめます。
  1. 事前準備
    #yum install make cpan gcc expat-devel
    #cpan YAML               #私の環境ではcpanで必要でした。
    #cpan YAML::Tiny            #後述のサンプルスクリプトで使用。
    Cent6.xの場合
    # vi /usr/share/perl5/CPAN/Config.pm
    Cent5.xの場合
    # vi /usr/lib/perl5/5.8.8/CPAN/Config.pm
      'prerequisites_policy' => q[follow],        #[yes]押下を省略するため、ask->followに変更
  2. 事前準備その2(https対応必要の場合)
    #yum install openssl-devel
    #cpan LWP::Protocol::https
  3. ライブラリinstall
    #cpan Net::CloudStack

以下簡易なサンプルスクリプト例と実行例です。(冗長な部分もあるかもしれませんが、ご勘弁)
  • client用サンプルスクリプト(cs-api.pl)
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use Net::CloudStack;
    use YAML::Tiny;
    use Data::Dumper;
    use JSON;
    use XML::Simple;

    my ($xml_json,$send_request);
    my $yaml = YAML::Tiny->new;
    $yaml = YAML::Tiny->read('cs-api.yml');
    my $obj;

    if(defined($yaml->[0]->{xml_json})){
        $xml_json = $yaml->[0]->{xml_json};
    }
    else{
        $xml_json = 'json';
    }

    if(defined($yaml->[0]->{send_request})){
        $send_request = $yaml->[0]->{send_request};
    }
    else{
        $send_request = 'no';
    }

    my $api = Net::CloudStack->new(
        api_key => $yaml->[0]->{api_key},
        secret_key => $yaml->[0]->{secret_key},
        base_url => $yaml->[0]->{base_url},
        api_path => $yaml->[0]->{api_path},
        xml_json => $xml_json,
        send_request => $send_request,
        );

    my $cmd = $ARGV[0];
    if(defined($ARGV[1])){
        $api->${cmd}("$ARGV[1]");
    }
    else{
        $api->${cmd};
    }
    print Dumper($api->url);
    print Dumper($api->response);
    if($api->xml_json =~ /json/i){
        $obj = from_json($api->response);
    }
    else{
        my $parser = XML::Simple->new;
        $obj = $parser->XMLin($api->response);
    }
    print Dumper($obj);
    if($api->xml_json =~ /json/i){
        foreach (keys %$obj){
            print Dumper($obj->{$_}->{jobid});
        }
    }
    else{
            print Dumper($obj->{jobid});
    }
    exit;
  • 設定ファイル(cs-api-yml)
    cs-api.plと同じディレクトリに保存。(下記伏字にしています)
    ---
    api_key:    ***
    secret_key: ***
    base_url:   http://*.*.*.*
    api_path:   portal/client/api?  #your API PATH
    xml_json:   json
    send_request:   yes
  • 実行例
    # ./cs-api.pl startVirtualMachine id=521
    $VAR1 = 'http://*.*.*.*/portal/client/api?apikey=*****&command=startVirtualMachine&id=521&response=json&signature=***';
    $VAR1 = '{
       "startvirtualmachineresponse" : {
          "jobid" : 2114
       }
    }
    ';
    $VAR1 = {
              'startvirtualmachineresponse' => {
                                                 'jobid' => 2114
                                               }
            };
    $VAR1 = 2114;
また、CPANに公開するまでの手順もまとめました。
CPAN Authorになるまでのまと

備忘録。下記対応予定です
  • APIをresponse処理対応
  • error処理
  • document整備
---
追記 2011/12/02
  • サンプルスクリプトについて追記
追記 2011/12/06
  • ライブラリ更新に伴い、サンプルスクリプト修正
追記 2012/2/17
  • Cent5.xの手順を追加
このエントリーをはてなブックマークに追加

CPAN Authorになるまでのまとめ

先の記事で報告した通り、今年の個人的な目標の1つの「CPAN Author」になれましたので、簡単にまとめておきたいと思います。

    1. PAUSEへ登録
      これは数ヶ月前に登録済でした。これは自分の登録だけなので、まだライブラリ作成前でもok。
      ***@cpan.orgのmail addressをもらえます。
      しかし、登録時に自分のmail addressへの転送設定をちゃんとしておかないと、最初のvalidationができず、せっかくもらったmail addressが使えません。
    2. CPAN searchで事前確認
      自分が作成しようとするライブラリが存在しないことを確認。
    3. ライブラリの作成
      module::starterというツールを使うと、CPANに必要なファイルの雛形を容易してくれます。
      皆、こういうの使っていたんですね。
    4. PAUSEへ名前空間の登録
      DNSと似たような階層構造で名前をつけるのが一般的のようです。あまりtopレベルの名前空間は取得しないものらしい。
      今回は「Net::CloudStack」としました。
      (Net::Amazon::EC2やNet::OpenStack::Computeというライブラリがあったので、同様にNet::を使うことにしました)
    5. PAUSEからライブラリのupload
      下記の2パターン。
      1. 手動でPerl Makefile.PL;make;make test;make distして、tar.gzを作成し、pauseからuploadする
      2. shipitコマンド
        コマンドラ一発で、gitとmakeとuploadしてくれます。便利。
        こちらを参考にやっと使えるようになりました。
    6. CPANでライブラリ公開
      5,6から数時間で、公開されてました。
      http://search.cpan.org/dist/Net-CloudStack/
  • 学んだこと
    上記のCPAN公開までの手順以外に下記を学びました。
    • オブジェクト型Perl
      Mooseを使いました。Perl4時代の書き方しか知らなかったので新鮮でした。
    • バージョン管理
      gitを使うようになりました。
  • 今後
    モダンPerlのスマートな書き方、運用の仕方を学んでいきたいと思います。
    また、javascriptも挑戦したいと思います。Firefox、chromeなどの拡張や、node.jsなどやってみたいですね。node ninjaで遊んでみたいです。

### 2012/1/29追記 ###
shipitについて追記しました。


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

2011年11月17日木曜日

CloudStack API情報まとめ

CloudStack APIの情報をまとめてみました。

<公式情報>
http://docs.cloud.com/CloudStack_Documentation/Developer%27s_Guide%3A_CloudStack
http://download.cloud.com/releases/2.2.0/api_2.2.11/TOC_User.html

<各言語対応情報>



皆さん情報公開いただいて感謝です。おかげでコードを見ながら、実装することができます。
CloudStackのサイトにJavaのサンプルコードがありましたが、今は見つかりませんでした。
---
2011/11/28追記
CPANでPerlライブラリ公開しましたので、関連リンクを追記しました。
このエントリーをはてなブックマークに追加

2011年11月16日水曜日

CloudStack API用スクリプトをgithubに公開した

githubで公開しています。詳細はreadmeをご参照ください。
https://github.com/snumano/CloudStack-API

以前、本家の方に下記blogで取り上げていただきました。恐縮です。
Beginners guide to interacting with the CloudStack API

今回は、CPANライブラリをフルに利用させていただいています。
やっている事は2つ。
  • APIに投げるためのURLを生成
  • WWW::Mechanizeを使って、生成したURLに対してrequestし、responseをXMLで取得

Perlは書き捨てのスクリプトが書ける程度ですが、なんとか皆さんにも見ていただけるものを公開して、少しでも皆さんの仕事の負担軽減に貢献できればと思っています。日々勉強中です。
今後ですが、Makefile.plも準備して、必要なライブラリのinstallやtestなどの実行ができるようにしたいと思います。

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

2011年11月13日日曜日

AWSのVMが起動しなくなったので対処方法を調べた

備忘録。
11/11頃から、AWSのmicroインスタンスのVMがdownするようになった。起動もしない。backup取っていたimageから起動しようとしてもダメ。という状況。

VM起動時のsyslogをみると下記logがでていた。


ERROR: mmu_update failed with rc=**


調べてみるとAWS forumに下記投稿あり。
https://forums.aws.amazon.com/thread.jspa?threadID=77744
https://forums.aws.amazon.com/thread.jspa?threadID=77078

32bit t1.microのAmazon Linux instanceを使用している場合に発生する問題のようだ。
対処は、instance起動時に各regionに応じて、下記のAKIを指定すること。(TOKYOの場合は「aki-ec5df7ed」)


eu-west-1
aki-64695810    ec2-public-images-eu/pv-grub-hd0_1.02-i386.gz.manifest.xml
us-east-1
aki-805ea7e9    ec2-public-images/pv-grub-hd0_1.02-i386.gz.manifest.xml
ap-northeast-1
aki-ec5df7ed    ec2-public-images-ap-northeast-1/pv-grub-hd0_1.02-i386.gz.manifest.xml
us-west-1
aki-83396bc6    ec2-public-images-us-west-1/pv-grub-hd0_1.02-i386.gz.manifest.xml
ap-southeast-1
aki-a4225af6    ec2-public-images-ap-southeast-1/pv-grub-hd0_1.02-i386.gz.manifest.xml


この通りにすると正常に起動できました。
調査中、twitterで同様の事象をつぶやいている@m__さんに上記情報を教えていただきました。感謝。










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

2011年11月12日土曜日

RightScaleのRightScriptsを書いてみた

前回、RightScale(RS)の情報を参考にServerTemplateからサーバを起動するところまでやった。
自分用のServerTemplateさえ持っておけば、いつでも自分用のサーバを用意できる。しかも、RSでServerTemplateを保持するのは無料。ServerTemplateを使いこなして、RSを使っている意味がでてくる。

今回はServerTemplateの一要素であるRightScriptを書いてみた。
RightScriptについては下記を参考にした。
  • いつも参考にさせていただいているRightScale Hack
  • 既にServerTemplateを使っていれば、RS dashboardの[Design]-[RightScript]にいくつかRightScriptsが登録されているはず。これらもとても参考になる。
書いたのは下記のPerlのCPAN shellの初期設定部分(特定ファイルの書き換え)。CPANライブラリをinstallする際、いちいち「yes」と入力するのを省略するための設定を追加した。こちらを参考にした。
結果正常に動作した。


#!/bin/bash -ex

#
# Test for a reboot, if this is a reboot just skip this script.
# リブート時に動作しない設定
#
if test "$RS_REBOOT" = "true" ; then
echo "Skip installation and configuration on reboot."
exit 0
fi


#### Setting ####
#ディストリビューション毎のセッティング

if [ $RS_DISTRO = centos ]; then
## Input Configration Setting on Ubuntu ##
echo "Initializing CPAN setting configuration,now..."
cat<<EOF >/usr/lib/perl5/5.8.8/CPAN/Config.pm

# This is CPAN.pm's systemwide configuration file. This file provides
# defaults for users, and the values can be changed in a per-user
# configuration file. The user-config file is being looked for as
# ~/.cpan/CPAN/MyConfig.pm.

\$CPAN::Config = {
  'build_cache' => q[10],
  'build_dir' => q[/root/.cpan/build],
  'cache_metadata' => q[1],
  'cpan_home' => q[/root/.cpan],
  'dontload_hash' => {  },
  'ftp' => q[/usr/kerberos/bin/ftp],
  'ftp_proxy' => q[],
  'getcwd' => q[cwd],
  'gpg' => q[/usr/bin/gpg],
  'gzip' => q[/bin/gzip],
  'histfile' => q[/root/.cpan/histfile],
  'histsize' => q[100],
  'http_proxy' => q[],
  'inactivity_timeout' => q[0],
  'index_expire' => q[1],
  'inhibit_startup_message' => q[0],
  'keep_source_where' => q[/root/.cpan/sources],
  'links' => q[],
  'make' => q[/usr/bin/make],
  'make_arg' => q[],
  'make_install_arg' => q[],
  'makepl_arg' => q[],
  'ncftp' => q[],
  'ncftpget' => q[],
  'no_proxy' => q[],
  'pager' => q[/usr/bin/less],
  'prerequisites_policy' => q[follow],
  'scan_cache' => q[atstart],
  'shell' => q[/bin/bash],
  'tar' => q[/bin/tar],
  'term_is_latin' => q[1],
  'unzip' => q[/usr/bin/unzip],
  'urllist' => [q[ftp://ftp.riken.jp/lang/CPAN/]],
  'wget' => q[/usr/bin/wget],
};
1;
__END__
EOF

echo "Install CPAN Modules,now..."
cpan $CPAN_MODULES

fi
#リターンコード0で終わらせる
exit 0


はまったのは下記。

  • catのredirectで設定を書き出す際、変数部分「$CPAN」を「\$CPAN」とエスケープする必要があった。これはshellの話で、RS特有の話ではないよう。
これでCPANライブラリが自由にinstallできるようになった。また、各種設定ファイルの変更もできる事が確認できた。
rpmパッケージのinstallについては、上述のServerTemplateのRightScriptsを参考にすればできそうだ。

ServerTemplateの作成は続く。。。
---
2011.11.13追記
Inputsの$CPAN_MODULESでspace区切りでモジュール名を渡せるようにしました。
これで、CPANモジュールのinstallまで全て完了できます。

2011.11.13追記その2
上記のConfig.pmですが、defaultの設定(ftpとしてrikenを選択)に「'prerequisites_policy' => q[follow],」を追加しています。


2012.2.15追記
上記のサンプルですが、fileを書きだす部分はrightscriptのAttachmentsに別fileとしてuploadする方がシンプルそうです。

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

2011年11月1日火曜日

情報のinputからoutputまでをPreziでまとめてみた

前回までの情報のinput保存output方法をPreziにまとめてみました。

保存方法を1つにまとめることができれば簡単なのですがなかなかできません。また、すべての情報を保存するのもあまり現実的ではありません。

最近は下記の検索方法でカバーするようにしています。

  • greplin
    twitter,facebook,gmailなどのクラウドサービスを検索対象にできます。最近はこれが便利。
  • evernote
    はてブの内容を転送し、検索可能にしています。
  • google desktop
    local PC内のfile検索に利用。

1つの検索で、local PCおよび全クラウドサービスが検索できれば最高なんですけど、いいのないでしょうか。





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

情報のoutputについて考えてみた

前回までのinput保存に続き、今回はoutputについてまとめてみます。


  1. twitter
    defaultはこれですね。
  2. facebook
    内輪ネタになりそうな場合や、皆の反応を知りたい場合。
  3. blog
    ここ半年、忘備録として書くようになりました。
    stock系の情報はやはりblogがいいですね。
  4. Prezi
    これもここ半年使うようにしています。以前紹介したものです。
    体系的に情報をまとめたい時、特に全体像が見えていない場合でも、どんどん画面を広げたり・ズームして情報を追加できます。
    画面の大きさを気にする必要がなくなります。
  5. その他
    会社のメンバーにはメール、視覚的に面白いものは部会などで紹介ですね。
    本当に伝えたいものは直接口頭ですね。じゃないと、伝わったかどうか分からない。

当初は、twitterの投稿内容をそのままfacebookに流していたのですが、twitterとfacebookはやはり受けている人との関係や、その人達の興味が違うので、twitterとfacebookは明示的に投稿を分けています。
適切な人に適切な情報が届くようにしないと、見てもらえないかと思っています。

次回は、今までの内容をPreziでまとめたいと思います。



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