0%

IDCFクラウドのCLIをjqで便利に使う

これまで何度か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 \
--serviceofferingid 21 --templateid 7183 --zoneid 1 \
--name myhostname --displayname myhostname \
| jq '.deployvirtualmachineresponse | .jobid')
echo jobid: ${jobid} 

このジョブIDを使い、インスタンスの作成の終了をポーリングしてみます。

while :
do
jobstatus=$(idcf-compute-api queryAsyncJobResult --jobid=${jobid} \
| jq '.queryasyncjobresultresponse | .jobstatus')
if [ ${jobstatus} -eq 1 ]; then
echo -ne "."
sleep 10s
else
json=$(idcf-compute-api queryAsyncJobResult --jobid=${jobid})
echo ${json} | jq '.queryasyncjobresultresponse | .jobresult | .virtualmachine | {id,password,name,displayname}, {ipaddress: .nic[].ipaddress}'
break
fi
done

レスポンスJSONのjqパース例

queryAsyncJobResultコマンドは、以下のようにレスポンスを返します。

{
"queryasyncjobresultresponse": {
"jobid": 1068081,
"jobprocstatus": 0,
"jobresult": {
"virtualmachine": {
...
"name": "minion2",
"nic": [
{
"gateway": "10.1.0.1",
...

先ほど、

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}'
{
"name": "DL32",
"id": 14
}
{
"name": "XL16",
"id": 15
}
...

idcf-copute-apiには、結果をCSV型式で表示する-cや、表形式のtオプションがあります。
表示したいプロパティを指定できるので、便利な場合もあります。

$ idcf-compute-api listServiceOfferings -c=id,name
"id","name"
14,"DL32"
15,"XL16"
...
$ idcf-compute-api listServiceOfferings -t=id,name
+----+------+
| id | name |
+----+------+
| 14 | DL32 |
| 15 | XL16 |
| 16 | L32 |
...

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}'
...
{
"name": "[LATEST][Dedicated Hardware] Ubuntu Server 12.04.1 LTS 64-bit",
"id": 2213
}
{
"name": "[LATEST] Ubuntu Server 10.04 LTS 64-bit",
"id": 1022
}
{
"name": "[LATEST] Ubuntu Server 10.04 LTS 64-bit",
"id": 1022
}
...

同じことをidcf-compute-api-cオプションと、sortやgrepをパイプした例を試してみます。
UNIXコマンドに慣れていれば、jqのフィルタよりわかりやすいかも知れません。

$ idcf-compute-api listTemplates --templatefilter=featured  -c=id,name | egrep 'LATEST.*Ubuntu' | sort -t , -k 2
1022,"[LATEST] Ubuntu Server 10.04 LTS 64-bit"
1022,"[LATEST] Ubuntu Server 10.04 LTS 64-bit"
7183,"[LATEST] Ubuntu Server 12.04.04 LTS 64-bit"
7183,"[LATEST] Ubuntu Server 12.04.04 LTS 64-bit"
1012,"[LATEST][Dedicated Hardware] Ubuntu Server 10.04 LTS 64-bit"
3303,"[LATEST][Dedicated Hardware] Ubuntu Server 10.04 LTS 64-bit"
2213,"[LATEST][Dedicated Hardware] Ubuntu Server 12.04.1 LTS 64-bit"
3311,"[LATEST][Dedicated Hardware] Ubuntu Server 12.04.1 LTS 64-bit"

まとめ

--keypairlistSSHKeyPairsコマンドで、--zoneidlistZonesコマンドで確認できます。

jqを使うと、ジョブIDやステータスをAPIのレスポンスから抽出できるので、
シェルスクリプトで変数に詰めたり、if分で評価するときに便利に使えます。

この前は、Saltを使ってGCEにプロビジョニングしました。
IDCFクラウドでも、GCEやCoreOSで便利なcloud-initが使えたらよいのですが、今のAPIだとちょっと難しそうです。

また、CloudStack用のAPIライブラリに、Goで書かれたgopherstack
があります。わかりやすいGoのコードなのであとで読んでみようと思います。

そのため、次回はシェルスクリプトでidcf-compute-apiを使いsalt-masterとsalt-minionをプロビジョニングしてみます。