これまで何度かdockerコマンドとjqを組み合わせて使ってきました。
IDCFクラウドCLIのidcf-compute-apiコマンドは、デフォルトでレスポンスをJSONで返すので、同じようにjqでパースしてみます。
また、idcf-compute-apiコマンドはJSON以外にも、CSVや表形式でレスポンスを表示できるので、サンプルを見ようと思います。
deployVirtualMachine
deployVirtualMachineコマンドを使うと、IDCFクラウドにインスタンスを作成できます。
このコマンドは、非同期APIなのでジョブIDを返して終了します。
--serviceofferingid
、--templateid
、--zoneid
は必須のパラメータのため、値は予め調べておく必要があります。
調べ方はあとで書きますが、数値はそれぞれ以下のIDを表しています。
--serviceofferingid 21
-> M4サイズ--templateid 7183
-> Ubuntu Server 12.04.04--zoneid 1
-> jp-east-t1ゾーン
とりあえずサンプルです。
jobid=$(idcf-compute-api deployVirtualMachine --keypair mykey \ |
このジョブIDを使い、インスタンスの作成の終了をポーリングしてみます。
while : |
レスポンスJSONのjqパース例
queryAsyncJobResult
コマンドは、以下のようにレスポンスを返します。
{ |
先ほど、
echo ${json} | jq '.queryasyncjobresultresponse | .jobresult | .virtualmachine | {id,password,name,displayname}, {ipaddress: .nic[].ipaddress}' |
のようにパースしましたが、JSONの構造をドット(.)でパイプしながら降りていきます。
パイプの最後が出力される結果になり、上記の例ではでは一つ深いnic
要素のipaddress
をオブジェクトとして作り直しています。
ちょっとわかりずらいですが、マニュアルもあるので、使っていくうちにだんだん覚えていくと思います。
listServiceOfferings
listServiceOfferings
コマンドは、作成するインスタンスサイズをリストします。deployVirtualMachine
の--serviceofferingid
オプションではIDを指定するので、予め調べておきます。
jqを使うとこんな感じです。
$ idcf-compute-api listServiceOfferings | jq '.listserviceofferingsresponse | .serviceoffering[] | {id,name}' |
idcf-copute-api
には、結果をCSV型式で表示する-c
や、表形式のt
オプションがあります。
表示したいプロパティを指定できるので、便利な場合もあります。
$ idcf-compute-api listServiceOfferings -c=id,name |
listTemplates
deployVirtualMachine
の--templateid
オプションで指定する、テンプレートのイメージをリストします。
jqのフィルタを使いUbuntuだけに限定し、idとname要素だけ選択してみます。
書き方はORMのDSLみたいでちょっと苦手です。
$ idcf-compute-api listTemplates --templatefilter=featured | jq '.listtemplatesresponse | .template[] | select(contains({name:"Ubuntu"}) and contains({name:"LATEST"})) | {id,name}' |
同じことをidcf-compute-api
の-c
オプションと、sortやgrepをパイプした例を試してみます。
UNIXコマンドに慣れていれば、jqのフィルタよりわかりやすいかも知れません。
$ idcf-compute-api listTemplates --templatefilter=featured -c=id,name | egrep 'LATEST.*Ubuntu' | sort -t , -k 2 |
まとめ
--keypair
はlistSSHKeyPairsコマンドで、--zoneid
はlistZonesコマンドで確認できます。
jqを使うと、ジョブIDやステータスをAPIのレスポンスから抽出できるので、
シェルスクリプトで変数に詰めたり、if分で評価するときに便利に使えます。
この前は、Saltを使ってGCEにプロビジョニングしました。
IDCFクラウドでも、GCEやCoreOSで便利なcloud-initが使えたらよいのですが、今のAPIだとちょっと難しそうです。
また、CloudStack用のAPIライブラリに、Goで書かれたgopherstack
があります。わかりやすいGoのコードなのであとで読んでみようと思います。
そのため、次回はシェルスクリプトでidcf-compute-apiを使いsalt-masterとsalt-minionをプロビジョニングしてみます。