acli の結果を json で出力して jq で必要なデータを取り出す
こんにちは。クララの吉村です。
今日は、acli を json で出力して、さらに jq で操作するところをやります。
やりたい事
Prism から 仮想マシンやクラスターの情報を確認できますが、やはりLinuxでサクッと確認したいという時があります。
AWSなどにパブリッククラウドに慣れていると特にそう感じるのではないでしょうか。
今回はそのような環境を整えるまでの手順です。
acli の出力を json にする
acli を操作すると、デフォルトでは以下のような出力になります。
[bash]
$ acli net.list
Network name Network UUID Type Identifier Subnet
Management f489f2cf-45e7-4afa-93b1-7a2982cc7742 kBridged 0
network_test 9b4c9c30-ad14-4664-9daf-969f2e9476ae kBridged 755 xxx.xxx.xxx.xxx./24
network_test_local 62008052-4685-4351-b1bb-621ae13edd96 kBridged 737 xxx.xxx.xxx.xxx./24
nutanix-global 7c760a59-4823-4e8c-9e54-a30a105a7bfc kBridged 737
test-900 c44c305e-28d7-452f-a268-224eff2acc10 kBridged 900 10.0.10.0/24
[/bash]
一覧性はありますが、機能的ではない感じですね。
そこで、こちらを json 形式で出力してみます。
やり方は簡単で、acli のすぐ後に、-o json オプションを指定します。
$ acli -o json net.list {"status": 0, "data": [{"id": 0, "subnet": null, "type": "kBridged", "name": "Management", "uuid": "f489f2cf-45e7-4afa-93b1-7a2982cc7742"}, {"id": 755, "subnet": "xxx.xxx.xxx.xxx/24", "type": "kBridged", "name": "network_test", "uuid": "9b4c9c30-ad14-4664-9daf-969f2e9476ae"}, {"id": 737, "subnet": "xxx.xxx.xxx.xxx/24", "type": "kBridged", "name": "network_test_local", "uuid": "62008052-4685-4351-b1bb-621ae13edd96"}, {"id": 737, "subnet": null, "type": "kBridged", "name": "nutanix-global", "uuid": "7c760a59-4823-4e8c-9e54-a30a105a7bfc"}, {"id": 900, "subnet": "10.0.10.0/24", "type": "kBridged", "name": "test-900", "uuid": "c44c305e-28d7-452f-a268-224eff2acc10"}], "error": null}
json 形式で出力されましたが、出ました横長。
jsonを整形しよう
上記の通り、このままでは視認性が良くないので、見やすく整形します。
CVMには、json_reformat コマンドがインストール済みで、こちらでも整形はできるみたいですが、やはり jq コマンドをインストールしましょう。
こちらの方がネットにいっぱい情報有りますし、aws cli などで使い慣れているのではないでしょうか。
※ nutanix サポートでは、CVMにいかなるソフトウェアのインストールも許されていないので、自己責任でお願いします。
[bash]
## PATHを確認
$ echo $PATH /home/nutanix/ncc/panacea/bin:/usr/lib/jvm/jre 1.8.0/bin:/home/nutanix/ncc/bin:/home/nutanix/kvm/bin:/home/nutanix/prism/cli:/usr/local/nutanix/cluster/lib/sg3utils/bin:/usr/local/nutanix/minerva/bin:/usr/local/nutanix/cluster/bin:/usr/local/nutanix/zookeeper/bin:/usr/local/nutanix/apache-cassandra/bin:/usr/local/nutanix/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
## いっぱい出てきますが、無難に /usr/local/bin/ にします。
$ cd /usr/local/bin
## jq コマンドをダウンロード
## CVM で yum インストールはしないです
$ wget http://stedolan.github.io/jq/download/linux64/jq
$ chmod +x jq
## PATH が通っているか確認
$ which jq
/usr/local/bin/jq
[/bash]
これで準備完了です。
では、先ほどの結果を整形してみましょう。
$ acli -o json net.list | jq '.' { "status": 0, "data": [ { "id": 0, "subnet": null, "type": "kBridged", "name": "Management", "uuid": "f489f2cf-45e7-4afa-93b1-7a2982cc7742" }, { "id": 755, "subnet": "xxx.xxx.xxx.xxx/24", "type": "kBridged", "name": "network_test", "uuid": "9b4c9c30-ad14-4664-9daf-969f2e9476ae" }, { "id": 737, "subnet": "xxx.xxx.xxx.xxx/24", "type": "kBridged", "name": "network_test_local", "uuid": "62008052-4685-4351-b1bb-621ae13edd96" }, { "id": 737, "subnet": null, "type": "kBridged", "name": "nutanix-global", "uuid": "7c760a59-4823-4e8c-9e54-a30a105a7bfc" }, { "id": 900, "subnet": "10.0.10.0/24", "type": "kBridged", "name": "test-900", "uuid": "c44c305e-28d7-452f-a268-224eff2acc10" } ], "error": null }
良くなりましたね。
では、もうちょっと踏み込んで、jq を使って任意のデータのみを抽出してみます。
## ネットワーク一覧から、ネットワーク名のみを抽出 $ acli -o json net.list | jq '.data[].name' "Management" "network_test" "network_test_local" "nutanix-global" "test-900" ## ネットワーク名 nutanix-global に属しているVM名一覧を表示 $ acli -o json net.list_vms nutanix-global | jq '.' { "status": 0, "data": [ { "macAddress": "50:6b:8d:3d:cb:8f", "ipAddress": null, "uuid": "9721d49f-d7da-47cd-92af-d43cfc64123a", "name": "for-ntnx-clara" }, { "macAddress": "50:6b:8d:05:97:27", "ipAddress": null, "uuid": "34520b97-8fb7-4a14-b602-d26d6c6eaca2", "name": "test_clara01" } ], "error": null } ## 上記のVM一覧結果から VM名のみを抽出 $ acli -o json net.list_vms nutanix-global | jq '.data[].name' "for-ntnx-clara" "test_clara01"
このような感じでjsonを整形すれば、いろいろ作業が捗りそうですね。
それでは、以上です。