使用 CloudStack API
如同 AWS API 一样,CloudStack API 也是基于 Web Service,可以使用任何一种支持 HTTP 调用的语言(例如 Java,PHP)编写代码。
调用代码(caller)首先需要在管理服务器进行认证。目前 CloudStack 采用两种认证方式:
Session 认证:通过 login API,获得一个 JSESSIONID cookie 和一个 SESSIONKEY token。
API Key 认证。
本文代码示例采用 API Key 进行认证。其过程如下:
管理员给调用者分配 API Key 和 Security Key(由 Admin 通过 web console 或者用 registerUserKeys在程序中生成)。
调用者用 Security Key 以 HMAC SHA-1 哈希算法对 API Key + Command String 生成签名。
最后的 API Request=Base URL+API Path+Command String+Signature。
下面具体为 admin 用户生成两个 key:
首先登陆管理台::8080/client。
点击 accounts,选择 admin,点击 users tab,找到 admin。
可以看到 API Key 和 Security Key,如果两个框没有值,点击工具栏的钥匙小图标,“Generate Keys”,如图 16。
图 16. 生成 API Key 和 Security Key
两个 Key 的生成结果如下:
表 3.Admin 用户的 API Key 和 Security Key
Security Key YaCSGzL9PvadlW4CDxH-k5QDAN8pDjPK7V5NZdvnIvJnzf_TKXg_OPXg616FM5k8yuYeyWkltMgugsbma9Hl0A
接下来用 CloudStack 的 Restful API 生成一个虚拟机。其调用 URL 如下:
:8080/client/api?command=deployVirtualMachine& serviceofferingid=1&templateid=4&zoneid=1command 参数中的内容可以参阅 API Reference: CloudStack,此处不赘述。需要注意的是,URL 当中每个参数是按照字母顺序排列的,这是生成签名必要的。
下面演示如何生成签名并组装一个完整的 URL。
首先在此处下载一段 perl 脚本,我们要利用它来帮助生成签名。将它放入合适的目录,然后在命令行下键入:
$ ./generate-url.pl –f 1 -u "command=deployvirtualmachine&serviceofferingid=1&templateid=4&zoneid=1" -a TEBBqfXkV-9blsxpkjFLAxNUmnvMsFEq7WKwPOMT_nuce69bmcElXz1izsN1qJFK58ye5U5hWWN2ckscsysodg – s 7VJx0QfxvJQZBYZbLdct2QFck8lV6hwLMvo9YCJ97pVou8f_aDSHdhEqBaY2CtFI6_MULP0eYqr_Z7D2Jon8nQ-f 后面数字 1 是生成 url 的意思,-a 后面是 API Key,-s 后面是 Security Key。-u 后面的 command 参数都已经修改为小写字母(此步不可省略)。命令运行完毕生成一段字符串:
*.*.*.*/client/api?command=deployvirtualmachine&serviceofferingid=1 &zoneid=1&templateid=4&apikey=Kn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4 GDUHD1TmoVw3e-oNxjRTCBXchffju5OFTqW4zPIik-HKxH7-w&signature=%2BQMXTBOoicZJG 6EosCcRGvO7OWU%3D然后把 IP 替换入上面 url,并把 command 中的小写字母还原成原来正确的 API 名字,结果如下:
:8080/client/api?command=listVirtualMachines&account=admin&domainId=1&apikey=Kn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4GDUHD1TmoVw3e-oNxjRTCBXchffju5OFTqW4zPIik-HKxH7-w&signature=i5%2FQxBf7FIGc6GvAfNcpFnVKpEw%3D把该 URL 键入浏览器,可以执行成功,返回一段 XML response:
<deployvirtualmachineresponse cloud-stack-version="3.0.2.20120506223416"> <id>d29a98f2-610c-4e4e-9331-18c133c5bdb3</id> <jobid>a5c9f26d-98be-4a81-9883-da9dd8dfda47</jobid> </deployvirtualmachineresponse>如果回到控制台界面的 instance tab,可以看到一个新的 vm instance 被创建。
用同样的方法,使用如下命令,列举出 Admin 用户下的全部虚拟机。
:8080/client/api?command=listVirtualMachines&account= admin&domainId=1&apikey=Kn7rrPjdXDWTrcjCTLs7hZM22o0X6aKSZ4Cy4GDUHD1TmoVw3e-oNxjRTCBXchffju5OFTqW4zPIik-HKxH7-w&signature=%2BQMXTBOoicZJG6EosCcRGvO7OWU%3DQ10:CentOS 需要安装 perl 开发环境才能运行上面的脚本。如果在命令执行过程中出现类似 cannot locate WWW/Mechanize 类的错误,需要先安装 cpan:
yum install cpan
然后用 cpan 安装缺少的 module:
cpan install WWW::Mechanize
后面缺少哪个 module,就用 cpan 安装该 module,直到所使用的包都被装入。
总体而言,CloudStack 的 API 提供了很灵活和强大的功能,而且通过 CloudBridge,更是实现了与亚马逊 EC2 API 的兼容。