さくらのクラウド CLI 「usacloud」では以下のような様々な出力形式に対応しています。
- table形式(デフォルト)
- CSV
- TSV
- JSON
- ID(など)のみ
- カスタム(Go言語のtext/templateで指定)
このうちカスタム形式では、dockerコマンドなどと同じくGo言語のtext/templateを利用して出力フォーマットを定義することが可能です。
今回は出力形式の切り替え方やtext/templateでのカスタム出力形式の使い方を紹介します。
出力形式の切り替え
コマンドのオプションを指定することで出力形式を切り替えます。
table形式
デフォルトは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へ切り替え可能です。
# 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
)を指定することで出力する列を限定できます。
# 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へ切り替え可能です。
# 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などと組み合わせることも可能です。
# 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のみ出力できます。
主に他のコマンドとの連携などで利用します。
# IDのみ出力
$ usacloud server ls -q
123456789001
123456789002
123456789003
カスタム形式
--format
オプション、または--format-file
オプションで任意のカスタム形式を指定可能です。
形式はGo言語のtext/template構文で記述します。
# --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サーバなどを設定するためのスクリプトなども出力可能です。
# テンプレートの定義
$ 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を是非どうぞ!!
以上です。