VMware vRA (vCAC) Cloud Clientを使ってみる

vRealize Automation/vCenter Orchestratorを操作するCLIツール（Cloud Client）がVMwareオフィシャルで提供されていたので、少し触ってみました。

Cloud Clientを使うことで以下のような操作をCLIから実行できるようになります。

- Blue Print / Catalog Itemの作成
- Catalog Itemのリクエスト
- IaaS Endpointの作成
- vCO Workflowの実行

本当は生のREST APIを直接叩けば済む話なのですが、これを使ったほうが各種操作がコマンドとして整理されていて、楽に使えると思います。


# ダウンロード
以下のURLからダウンロードできます。2015/3/24時点での最新バージョンは3.2.0です。

vRealize CloudClient 3.2
https://developercenter.vmware.com/web/dp/tool/cloudclient

ダウンロードして適当なディレクトリに解凍しておきます。

```bash
$ wget https://vdc-download.vmware.com/vmwb-repository/dcr-public/e8b140e7-cf16-4ff6-af88-a22ad7e9f5d1/01b1dcf0-9ed2-4452-8881-61e29faa2bc6/cloudclient-3.2.0-2594179-dist.zip
$ unzip cloudclient-3.2.0-2594179-dist.zip
```

* なお、「vCAC CLI」というコマンドラインツールも提供されているのですが、こちらはエンドポイントを指定してvRA(vCAC)のAPIを叩くような、より薄いツールのようです。


# 対話的に叩いてみる

まずは、試しに対話的に触ってみます。


## vRAへのログイン

解凍したディレクトリに移動し、bin以下にあるシェルスクリプトから起動します。利用許諾が表示されるので、一番したまでスクロールして"Y"を入力します。

```bash
$ cd cloudclient-3.2.0-2594179
$ ./bin/cloudclient.sh
...

Do you accept the terms of license agreement? (Y)es/(N)o:Y      
===================================================
 _____ _                 _ _____ _ _            _   
/  __ \ |               | /  __ \ (_)          | |  
| /  \/ | ___  _   _  __| | /  \/ |_  ___ _ __ | |_ 
| |   | |/ _ \| | | |/ _` | |   | | |/ _ \ '_ \| __|
| \__/\ | (_) | |_| | (_| | \__/\ | |  __/ | | | |_ 
 \____/_|\___/ \__,_|\__,_|\____/_|_|\___|_| |_|\__|
                                                    
                                                    
===================================================
Version : 3.2.0
*Tip* : You can hit tab to move through commands and arguments
*Tip* : You can autologon with a CloudClient.properties file

Welcome to the VMware CloudClient
CloudClient>
```

vRAの特定のテナントに対してログインしてみます。

```
CloudClient>vra login userpass --user USER@DOMAIN --password PASSWORD --server xxx.xxx.xxx.xxx --tenant TENANT
vRA SSO login: [ACTIVE], session: [INACTIVE], user=[USER@DOMAIN], server=[https://xxx.xxx.xxx.xxx], tenant=[TENANT]
IaaS Model Manager login: [INACTIVE], session: [INACTIVE]
```

ログインに成功すると、"vRA SSO login: [ACTIVE]"が表示されるはずです。


## コマンドを叩いてみる

ログイン状態となったところで、組み込みコマンドを叩いてみます。"help"で組み込みコマンドを一覧表示できます。

- Catalog一覧の表示

```bash
CloudClient>vra catalog list
+--------------------------------------+-----------------------------+--------------------------------------+---------------------------------------------+----------------------------+-----------+
| id                                   | organization.subtenantLabel | organization.subtenantRef            | name                                        | catalogItemTypeRef.label   | status    |
+--------------------------------------+-----------------------------+--------------------------------------+---------------------------------------------+----------------------------+-----------+
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | IT                          | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | Config Something                            | Advanced Service Blueprint | PUBLISHED |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | IT                          | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | Windows2008                                 | Multi-Machine Service      | PUBLISHED |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | IT                          | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | Windows2012                                 | Virtual Machine            | PUBLISHED |
+--------------------------------------+-----------------------------+--------------------------------------+---------------------------------------------+----------------------------+-----------+
```


# ワンライナーとして叩く

対話モードでの動作は確認できたので、次に組み込みコマンドも含んだワンライナーとして叩いてみます。


## CloudClient.propertiesの作成

対話モードでは手動でログインしましたが、毎回入力しなくてすむように、ログイン情報を"CloudClient.properties"という外部ファイルに書き出しておきます。

まずはCloudClientのコマンドからCloudClient.propertiesのひな形と、パスワードファイルを生成しておきます。

```bash
CloudClient>login autologinfile
CloudClient>login keyfile --file vRA_password.txt --password PASSWORD
```

生成されたファイルを開くと、vRA/vRA(IaaS)/vCOの3種類のアカウント情報を設定できるようになっています。
ここではvRAのアカウントを設定します。vra_keyfileには、先ほど生成したvRA_password.txtを指定します。

```bash
vi CloudClient.properties

#vra_server : vRealize Automation Virtual Appliance
vra_server=IP_ADDR_OF_VCAC

#vra_tenant : Tenant Name, defaults to vsphere.local
vra_tenant=TENANT_NAME

#vra_username : SSO username in the form user@domain.com
vra_username=USERNAME

#vra_password : SSO password
vra_password=PASSWORD

#vra_keyfile : Encrypted file location of SSO password
vra_keyfile=vRA_password.txt
```

## 叩いてみる

あとは、実行したいコマンドを引数としてcloudclient.shを実行すれば、結果が出力されます。

```
./bin/cloudclient.sh vra catalog list
vRA SSO login: [ACTIVE], session: [INACTIVE], user=[USER@DOMAIN], server=[https://xxx.xxx.xxx.xxx], tenant=[TENANT]
+--------------------------------------+-----------------------------+--------------------------------------+---------------------------------------------+----------------------------+-----------+
| id                                   | organization.subtenantLabel | organization.subtenantRef            | name                                        | catalogItemTypeRef.label   | status    |
+--------------------------------------+-----------------------------+--------------------------------------+---------------------------------------------+----------------------------+-----------+
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | IT                          | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | Config Something                            | Advanced Service Blueprint | PUBLISHED |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | IT                          | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | Windows2008                                 | Multi-Machine Service      | PUBLISHED |
| xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | IT                          | xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | Windows2012                                 | Virtual Machine            | PUBLISHED |
+--------------------------------------+-----------------------------+--------------------------------------+---------------------------------------------+----------------------------+-----------+
```


# （おまけ: REST APIを直接叩く場合）

ところで、当然vRAは生のREST APIも提供しているので、それを直接叩いても同様のことができるはずなのですが、今回試した中ではうまく行きませんでした。一応内容をメモ代わりに記載しておきます。

## Tokenの取得

特に変わったことはなく、jsonでusernameとpassword、tenant名を指定してリクエストします。自己証明を使っているので--insecureを指定します。

```bash:Request
curl -v --insecure -H "Accept: application/json" -H "Content-type: application/json" -X POST \
-d '{"username":"NAME@DOMAIN","password":"PASSWORD","tenant":"TENANT"}' \
https://IP_OF_VCAC/identity/api/tokens
```

すると、こんな感じでtokenが返却されます。

```bash:Response
{
    "expires": "2015-03-25T20:25:05.178Z",
    "id": "MTQ...N2Y=",
    "tenant": "TENANT"
}
```

なお、有効期間はデフォルトで24時間となっています。変更したい場合には、vCAC Appliance内の
/etc/vcac/security.properties
にある、
identity.basic.token.lifetime.hours=N
を任意に指定することで変更可能です。

## リクエストを投げてみる

取得したtokenを使って、GETリクエストを投げてみます。

```bash:Request
curl -v --insecure -H "Accept: application/json" \
-H "Authorization: Bearer MTQ...N2Y=" \
-X GET https://IP_OF_VCAC/catalog-service/api/consumer/catalogItems
```

...が、どうも空のレスポンスが返ってきてしまいます。

```bash:Response
{
    "links": [],
    "content": [],
    "metadata": {
        "size": 20,
        "totalElements": 0,
        "totalPages": 0,
        "number": 1,
        "offset": 0
    }
}
```

Cloud ClientやvCAC CLIを使うと正しく一覧が返ってくるので、リクエストの投げ方に問題があると思われます。時間があるときにもう少し調べてみる。


### 参考
CloudClient Documentation（以下からダウンロード）
https://developercenter.vmware.com/web/dp/tool/cloudclient/3.2.0