usacloudで様々な出力形式を使ってみる(Go言語のtext/templateなど)

![usacloud_logo_h.png](https://qiita-image-store.s3.amazonaws.com/0/20668/2c775f4b-8af3-e853-eaee-1f1b2ea4385b.png)

さくらのクラウド CLI 「[usacloud](https://github.com/sacloud/usacloud)」では以下のような様々な出力形式に対応しています。

- table形式(デフォルト)
- CSV
- TSV
- JSON
- ID(など)のみ
- カスタム(Go言語のtext/templateで指定)

このうちカスタム形式では、dockerコマンドなどと同じくGo言語のtext/templateを利用して出力フォーマットを定義することが可能です。

今回は出力形式の切り替え方やtext/templateでのカスタム出力形式の使い方を紹介します。

## 出力形式の切り替え

コマンドのオプションを指定することで出力形式を切り替えます。

### table形式

デフォルトはtable形式です。

```bash:table形式の例
#デフォルト(table形式)
$ usacloud server ls

+--------------+-------------+-----+--------+------------------+--------+
|      ID      |    Name     | CPU | Memory |     IPAddress    | Status |
+--------------+-------------+-----+--------+------------------+--------+
| 123456789001 | GoDev01     | 2   | 4096MB | 192.2.100.101/24 | up     |
| 123456789002 | GoDev02     | 2   | 4096MB | 192.2.100.102/24 | down   |
| 123456789003 | GoDev03     | 2   | 4096MB | 192.2.100.103/24 | down   |
+--------------+-------------+-----+--------+------------------+--------+
```

### CSV/TSV形式

`--output-type`オプション(エイリアス:`--out`)を指定することでCSV/TSV/JSONへ切り替え可能です。

```bash:CSV_or_TSV形式の例
# CSV
$ usacloud server ls --out csv

RowNumber,ID,Availability,CreatedAt,Description,[...省略...]
1,123456789001,available,2017-01-23T01:23:45+09:00,desc1,[...省略...]
2,123456789002,available,2017-01-23T01:23:45+09:00,desc2,[...省略...]
3,123456789003,available,2017-01-23T01:23:45+09:00,desc3,[...省略...]

# TSV
$ usacloud server ls --out csv

RowNumber	ID	Availability	CreatedAt	Description	[...省略...]
1 	 123456789001 	 available 	 2017-01-23T01:23:45+09:00 	desc1	[...省略...]
2 	 123456789002 	 available 	 2017-01-23T01:23:45+09:00 	desc2	[...省略...]
3 	 123456789003 	 available 	 2017-01-23T01:23:45+09:00 	desc3	[...省略...]

```

`--column`オプション(エイリアス:`--col`)を指定することで出力する列を限定できます。

```bash:CSV_or_TSV形式_列を限定する例
# CSV
$ usacloud server ls --out csv --col ID --col Name

ID,Name
123456789001,GoDev01
123456789002,GoDev02
123456789003,GoDev03

# TSV
$ usacloud server ls --out csv

ID 	 Name
123456789001 	 GoDev01
123456789002 	 GoDev02
123456789003 	 GoDev03
```

## JSON形式

`--output-type`オプション(エイリアス:`--out`)を指定することでCSV/TSV/JSONへ切り替え可能です。

```bash:JSON形式の例
# JSON
$ usacloud server ls --out json

[
  {
    "ID": "123456789001",
    "Name": "GoDev01",
    "Description": "desc1",
    (省略)
  },
  {
    "ID": "123456789002",
    "Name": "GoDev02",
    "Description": "desc2",
    (省略)
  },
  {
    "ID": "123456789003",
    "Name": "GoDev03",
    "Description": "desc3",
    (省略)
  }
]
```

JSONなのでjqなどと組み合わせることも可能です。

```bash:JSON_jqと組み合わせ
# CSV
$ usacloud server ls --out json | jq '.[] | {"id":.ID, "name":.Name, "ipaddress":.Interfaces[0].IPAddress}'
{
  "id": 123456789001,
  "name": "GoDev01",
  "ipaddress": "192.2.100.101"
}
{
  "id": 123456789002,
  "name": "GoDev02",
  "ipaddress": "192.2.100.102"
}
{
  "id": 123456789003,
  "name": "GoDev03",
  "ipaddress": "192.2.100.103"
}
```

## IDのみ出力

`--quiet`オプション(エイリアス:`-q`)を指定すると、対象のIDのみ出力できます。
主に他のコマンドとの連携などで利用します。

```bash:IDのみ出力する例
# IDのみ出力
$ usacloud server ls -q

123456789001
123456789002
123456789003
```

## カスタム形式

`--format`オプション、または`--format-file`オプションで任意のカスタム形式を指定可能です。
形式はGo言語の[text/template](https://golang.org/pkg/text/template/)構文で記述します。


```bash:カスタム形式の例
# --formatオプションでコマンドラインからテンプレートを指定
$ usacloud server ls --format "ID is {{.ID}}, Name is {{.Name}}"

ID is 123456789001, Name is GoDev01
ID is 123456789002, Name is GoDev02
ID is 123456789003, Name is GoDev03

# --format-fileオプションでファイルからテンプレートを指定
$ echo -n "ID is {{.ID}}, Name is {{.Name}}" > custom.tpl
$ usacloud server ls --format-file custom.tpl

ID is 123456789001, Name is GoDev01
ID is 123456789002, Name is GoDev02
ID is 123456789003, Name is GoDev03

```

これを応用することで、例えばサーバ作成時に割り当てられたグローバルIPやDNSサーバなどを設定するためのスクリプトなども出力可能です。

```bash:カスタム形式の応用例_グローバルIPの設定コマンドを出力
# テンプレートの定義
$ cat > custom.tpl << EOL
#!/bin/sh

{{ with index .Interfaces 0 -}}
ip addr add {{.IPAddress}}/{{.Switch.UserSubnet.NetworkMaskLen}} dev eth0
ip route add default via {{.Switch.UserSubnet.DefaultRoute}} dev eth0
{{ end }}
{{ range .Zone.Region.NameServers -}}
echo "nameserver {{.}}" >> /etc/resolv.conf
{{ end -}}
echo "search localdomain" >> /etc/resolv.conf
EOL

# テンプレート指定でコマンド実行
$ usacloud server read --format-file custom.tpl GoDev01

#!/bin/sh

ip addr add 192.2.100.101/24 dev eth0
ip route add default via 192.2.100.1 dev eth0

echo "nameserver 133.242.0.3" >> /etc/resolv.conf
echo "nameserver 133.242.0.4" >> /etc/resolv.conf
echo "search localdomain" >> /etc/resolv.conf
```

## まとめ

- `--output-type`指定でCSV/TSV/JSON出力できるよ
- `--quiet`オプションでIDだけの出力ができるよ
- `--format`/`--format-file`オプションでGo言語のtext/template形式で出力形式の定義ができるよ

さくらのクラウドのお供に[usacloud](https://github.com/sacloud/usacloud)を是非どうぞ！！

以上です。