fbpx

bash script for CloudStack API

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

作業で不便だったので、CloudStack APIを実行するbashスクリプトを作成してみました。これを機会にCloudStack API実行についてちょっと説明したいと思います。

まず、管理者権限のあるユーザにAPI鍵を生成します。今回は、新たにAPIをたたくユーザを作ってみます。管理者権限でCloudStack管理サーバにログインし「アカウント」メニューを開き、「新規ユーザ」メニューを実行します。

create user at CloudStack management server

作成したユーザの右端の「アクション」のメニューを選択するとプルダウンメニューが現れます。「キー生成」メニューを選択します。

create keys on CloudStack management console

準備は終わりです。APIを実行するときの鍵が作成されました。画面で確認できます。

show keys at CloudStack management console

CloudStack APIを8080ポートから使用するには署名パラメータを指定してやる必要がありますが、この署名作成手順が面倒なので、その処理をbashスクリプトで自動化してみました。署名作成方法の詳細については、CloudStackのドキュメントを参照してください。署名作成処理の流れは以下のようになります。

  1. コマンドパラメータの要素をソート
  2. コマンドパラメータをURLエンコード
  3. エンコードされた文字列を全て小文字へ置換
  4. 上記文字列と管理サーバで作成された秘密鍵に使用してsha1で署名
  5. signature文字列をURLエンコード

 

実行可能とするために、下記のbashスクリプト(kick_api.sh)をコピーして、以下のパラメータを変更します。

  1. api_key及びsecret_keyパラメータに生成されたキーをコピーします
  2. addressパラメータにアクセスするホスト名を設定します

 

CloudStack APIを実行してみます。CloudStack API一覧についてはここを参照してください。

スクリプトのusage例を説明します。例えば、パラメータ指定なしのlistAccountsコマンドを実行したいときは以下のように実行します。

# kick_api.sh command=listAccoutns

パラメータを指定したstartVirtualMachineコマンドを実行したいときは以下のようします。パラメータやレスポンスタグをスペースデリミッタで続けてください。

# kick_api.sh command=startVirtualMachine id=8

 

以下、スクリプトの記述になります。


#!/bin/bash
#
# kick_api.sh
#
# please set your host
address="http://[your management server]:8080"
# please set your api key
api_key="QVOObVBiTodKl5L0vPQFCCELsxbtEHHysXU42XTFFwhBHWWFV7GaiH5oJG0yHHsqFzCcgflH8Ee8Ttk4m_qJLQ"
# please set your secret key
secret_key="zTl4qQtSZPijMkNYgkX1lQh6QlEUXyjSKeXSPZQl2MJifzOBFhNDA5cQlfK7Ds5BFEM_ua_5ELMPL-z4JNJBIA"

api_path="/client/api?"

if [ $# -lt 1 ]; then
  echo "usage: $0 command=... paramter=... parameter=..."; exit;
elif [[ $1 != "command="* ]]; then
  echo "usage: $0 command=... paramter=... parameter=..."; exit;
elif [ $1 == "command=" ]; then
  echo "usage: $0 command=... paramter=... parameter=..."; exit;
fi

data_array=("$@" "apikey=${api_key}") 

temp1=$(echo -n ${data_array[@]} | \
   tr " " "\n" | \
   sort -fd -t'=' | \
   perl -pe's/([^-_.~A-Za-z0-9=\s])/sprintf("%%%02X", ord($1))/seg'| \
   tr "A-Z" "a-z" | \ 
   tr "\n" "&" )

signature=$(echo -n ${temp1[@]})
signature=${signature%&}
signature=$(echo -n $signature | \
   openssl sha1 -binary -hmac $secret_key | \
   openssl base64 )
signature=$(echo -n $signature | \
   perl -pe's/([^-_.~A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg')

url=${address}${api_path}$(echo -n $@ | tr " " "&")"&"apikey=$api_key"&"signature=$signature

echo " SEND URL: $url"
curl ${url} | xmllint --format - 
新規CTA