敵のいない勉強部屋

勉強記録用。土日を中心に更新。

CloudStackAPIを使うには

クラウドAPI

CloudStackのようなクラウド基盤ソフトウェアでは、
APIを通じてインフラを管理(操作)できる。 (※CloudStackGUIも結局は裏でAPIをコールしているだけ)

ここではbashスクリプトを使ってAPIをコールし、

ターミナル上の操作でインスタンスを作成するまでの流れを紹介する。

 

APIキー,SECRETキーの取得

CloudStackGUIから、APIを使いたいユーザのAPIキーとSECRETキーを生成する。

f:id:im_not_enemy:20170916232837p:plain

f:id:im_not_enemy:20170916233026p:plain

②リモートPC(linux系)にスクリプトを作成

エディタを開き、こちらのコードを貼り付けるだけ。
https://gist.github.com/keithseahus/6201354

# vi cloud-api.sh

③必要箇所の書き換え

書き換えるのは前半部分のみ。
ADDRESS -> cloudstackのURIを指定
API_KEY -> ①で生成したAPIキーを指定
SECRET_KEY -> ①で生成したSECRETキーを指定
USE_XMLLINT -> こちらはお好みで0か1を指定(1にするとAPIの結果をxmllintで自動生成してくれます)

・編集前

ADDRESS="https://"
API_KEY=""
SECRET_KEY=""
USE_XMLLINT=0 # true => 1, false => 0

・編集後

ADDRESS="http://192.168.70.250:8080"
API_KEY="ki4nHumoJvC28UG5zVoV6m7Cq3MHF0IQCU-ohd08K9nWrY-FVurx2rOjubmbsOL7VutQPUGnJsoEY50JjQ2e8w"
SECRET_KEY="-g8OejVXQtC_uiHgEJVXafKcvAYRwpMeQV2x0VhyivQBIeeFhpWANR31slAghUs_Kap_D7cbVvuI2tBTPwIkCQ"
USE_XMLLINT=1 # true => 1, false => 0

④実行権限を付与

# chmod a+x cloud-api.sh

スクリプトの実行

・例えばZoneの一覧を取得したい場合
作成したスクリプトの引数の"command="部分で実行したいAPIの名前(listZones)を指定
# ./cloud-api.sh command=listZones

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 484 100 484 0 0 4382 0 --:--:-- --:--:-- --:--:-- 4400
<?xml version="1.0" encoding="UTF-8"?>
<listzonesresponse cloud-stack-version="4.9.2.0">
<count>1</count>
<zone>
<id>0b17bf01-fecb-4d79-bbeb-9632641b7eba</id>
<name>cloud-zone01</name>
<networktype>Advanced</networktype>
<securitygroupsenabled>false</securitygroupsenabled>
<allocationstate>Enabled</allocationstate>
<zonetoken>957d6ba3-fa65-34f8-ba7c-aa428316becf</zonetoken>
<dhcpprovider>VirtualRouter</dhcpprovider>
<localstorageenabled>false</localstorageenabled>
</zone>
</listzonesresponse>

 

・サービスオファリングの一覧を取得したい場合

# ./cloud-api.sh command=listServiceOfferings

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2379 100 2379 0 0 43597 0 --:--:-- --:--:-- --:--:-- 44055
<?xml version="1.0" encoding="UTF-8"?>
<listserviceofferingsresponse cloud-stack-version="4.9.2.0">
<count>4</count>
<serviceoffering>
<id>d32187cd-044b-4c3c-9284-0ddd928d3733</id>
<name>Medium Instance (HA)</name>
〜以下略〜

 

・テンプレートの一覧を表示したい場合
"command="以外にも引数が必要となる
# ./cloud-api.sh command=listTemplates templatefilter=self

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1081 100 1081 0 0 16620 0 --:--:-- --:--:-- --:--:-- 16890
<?xml version="1.0" encoding="UTF-8"?>
<listtemplatesresponse cloud-stack-version="4.9.2.0">
<count>1</count>
<template>
<id>66bad79b-e298-4e4e-9741-c768f7ddf8eb</id>
<name>web-linux-01-temp</name>
〜以下略〜

 

インスタンスを作成したい場合
サービスオファリング、テンプレート、ゾーンも引数で指定する必要がある
# ./cloud-api.sh command=deployVirtualMachine serviceofferingid=d32187cd-044b-4c3c-9284-0ddd928d3733 templateid=eac558b0-5ee5-11e7-ba23-90fba6067579 zoneid=0b17bf01-fecb-4d79-bbeb-9632641b7eba

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 225 100 225 0 0 380 0 --:--:-- --:--:-- --:--:-- 380
<?xml version="1.0" encoding="UTF-8"?>
<deployvirtualmachineresponse cloud-stack-version="4.9.2.0">
<id>f8056f37-489c-4b6d-83d5-eb8f366d5bae</id>
<jobid>a0d870b1-fb34-49a9-9633-29167bd10832</jobid>
</deployvirtualmachineresponse>

このようにjobidが返ってくる。

hypervisorやSystemVMが裏でプロビ処理を行っており、その完了を待つ必要があるのだ。

※これを非同期ジョブ(AsyncJob)と呼ぶ。

処理の成否はこのjobidを使って確認する。

・処理の成否確認

# ./cloud-api.sh command=queryAsyncJobResult jobid=a0d870b1-fb34-49a9-9633-29167bd10832

※処理中 jobstatus=0
※処理成功 jobstatus=1 ★今回はこちら
※処理失敗 jobstatus=2

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2419 100 2419 0 0 25138 0 --:--:-- --:--:-- --:--:-- 24938
<?xml version="1.0" encoding="UTF-8"?>
<queryasyncjobresultresponse cloud-stack-version="4.9.2.0">
<accountid>190363c5-edd4-4341-ad9a-84ff5866f4df</accountid>
<userid>42814bac-434e-4396-affb-fd4f62348af1</userid>
<cmd>org.apache.cloudstack.api.command.user.vm.DeployVMCmd</cmd>
<jobstatus>1</jobstatus>
〜〜以下略〜〜

インスタンスが作成されている

今回、インスタンス名はCloudStackが自動で生成しているが、
任意の名前を付けたい場合はcommand=deployVirtualMachineAPIコール時に引数"name="と"displayname="を追加で指定すれば良い。

f:id:im_not_enemy:20170916234817p:plain

・使用可能なAPI一覧

CloudStack API Reference

APIのコール時に必要な引数等や、返り値のxmlの読み方なども確認できる。

API名に(A)がつくものは、非同期ジョブであることを指している。

・他製品(ツール)との連携

今回はbashスクリプトAPIをコールしたが、APIキーとSECRETキーを使えばより様々なツールとの連携が可能になる。 (例: Jenkins, Terraform, Packer ...)
こちらについても今後、使用例を紹介していきたい。