NutanixのAHVやVMまわりを設定できるacliに触ってみよう（その1）

![スクリーンショット 2017-12-11 09.37.50.png](https://qiita-image-store.s3.amazonaws.com/0/84474/0678ebef-2d88-cb73-a47f-97cbc360a22c.png)

本記事は、Nutanix Advent Calendar 2017，2枚目の11日目、12月11日分としての投稿になります。
https://adventar.org/calendars/2761

**本記事の内容は、この日付時点の情報（ce-2017.07.20-stable）に基づいています。そのため，今後新しいバージョンが提供された場合に，当該記載と矛盾が生じる場合がありますのでご注意ください。**

#はじめに

Nuanixでは、ユーザーインターフェースとして、HTML5ベースの管理コンソールであるPrismのGUIインターフェースのほかに、REST APIのインターフェース、そしてacliやncliなどのコマンドラインインターフェースを持っています。今回は、そのうちのacliについて紹介したいと思います。

#acliとは
acliは、特にAHVにおいて、VMの個別の操作、設定に関するインターフェースのほか、ホスト、ネットワーク、ボリュームグループ、構成などの、主にハイパーバイザーにおける操作や設定を可能とするインターフェースを提供しています。一方でncliは、特にNutanixクラスタに係る操作や設定を行うインターフェースを提供しています。

ただし、定義にもよりますが、「クラスタ全体に影響する設定」としてはacliでも一部可能であるため、厳密にクラスタに係る操作かそれ以外かで分類することはできませんが、acliはVM関連操作、ncliはクラスタ関連操作と、ざっくりとした分類で覚えておけば基本的には問題ありません。

> acliを利用する例：

・ VMの電源操作
・ VMの作成
・ Image Serviceに対するイメージの登録、など

> ncliを利用する例：

・ クラスタからのノード（ホスト）のRemove
・ クラスタが利用するNTPやDNSの設定
・ Storage Containerの作成、設定、など

##acliのユースケース
今後は、AOS 5.5で登場したCalm(*)などを利用することで、VMの一括または連続的なデプロイ、複数のVMをひとつのサービススタックとしてデプロイすると言った操作は対応できそうですが、VMのデプロイに限らず、Nutanixの設定や操作を即座に「一括」で行いたい、またはコマンドラインに慣れていてそちらを使いたい、Shell Scriptなんかと連動させて一定のオートメーションを実現させたい、そんな場合にはCLIを利用したいケースがあるかと思います。

>Calm
AOS　5.5でPrism Centralに実装された製品、Cloud Application Lifecycle Managementに由来した名称で、Nutanixが新たに提供する、アプリケーションレイヤーをカバーする製品。具体的には、アプリケーションのオーケストレーション、オートメーションを提供するもので、あらかじめ、Blueprint（オーケストレーションの世界ではRunbookとも言う）と呼ばれる、アプリケーションデプロイの設計書を作成・保存しておくことで、その設計書に基づいて、アプリケーションを自動でデプロイ、そしてデプロイしたアプリケーションの可用性を管理したり、スケールイン・スケールアウト等の管理も行うことができるようになる製品

##acliのコマンド
acliには以下のようなコマンドが提供されています。こちらの記事はNutanix CEのバージョンce-2017.07.20-stableに基づいているため、AOS 5.1系のacliとなります。（AOS 5.1系とacli、5.5系のacliでは、policyがmicrosegに置き換えられている）。

| Command          | Description                     |
|:----------------|:---------------------------------|
| ads              |Acropolis Dynamic Scheduler（ADS）に関連する設定を行う。あくまで主にADSの有効無効を設定するもので、VMのアフィニティルールは、VMのコマンドにて設定する|
| core           |acliそのものに関する設定を行う項目で、例えばTABキー補完時に表示されるヘルプの詳細を表示しないなどの設定を行う|
| ha             |AHVのHAに関連する設定を行う、HAのタイプの指定、フェイルオーバーの有無、許容するホストの障害数などの設定や状況を確認する|
| host               |ホストやホスト上で動作するVMの一覧取得、メンテナンスモード等の設定もこちらのコマンドで行う、なおクラスターからのホストの離脱や追加はacliではなくncliで行う|
| iscsi_client             |AHVホストに接続しているiSCSIクライアントの一覧などを取得（ABSで提供されるボリュームグループを含む）する、なおVG作成、attach/detach等はVGコマンドで行う|
| net          |ネットワークに関連する操作全般、VLANの作成・削除、DHCPの設定などを行う、ただしvSwitchやuplinkに関する設定はnetコマンドではなく、ovsコマンドで行う|
|nf          |Network FunctionやService Chainに関する設定を行う、これまで対応機能がリリースされていなかったため使わなかったコマンド、今後、microsegが実装されると利用が想定される|
|parcel        |ディスクとネットワーク以外のVMの構成情報（VM名、CPU数、メモリ容量、HA設定時のプライオリティ、UUIDなど）を表示する、　ネットワーク、ディスクを含めたVMすべての情報を表示するにはvm.getを利用する|
|policy    |ネットワークのポリシーに関する設定を行う、これまで対応機能がリリースされていなかったため使わなかったコマンド、今後、microsegが実装されると利用が想定される|
|snapshot     |取得済みスナップショットに対するリスト表示、削除操作を行う（作成は不可、作成はVMコマンドで実施）、なおacliのsnapshotコマンド対象にProtection Domainのデータは含まれない|
|task       |AHVで実行されるタスクのリスト取得、タスクのキャンセルを行う、クラスターに関連する操作（eg. Storage Containerの作成、HostのRemove、等）についてはncliのtaskコマンドで行う|
|vg        |ABSなどで利用するボリュームグループに関する操作、VGのリスト、作成、削除、更新、VGのVMまたは外部のiSCSIクライアントへのattach/detachなどを行う|
|vm        |VM及びVMの構成に対する、作成・削除・更新、アフィニティルール設定、GPUのアサイン、電源操作、クローン、スナップショットの取得を行う|
|vm_group    |ADSのアフィニティルールにおけるグループを構成する、vm_groupのリスト、作成、削除、VMの追加、アフィニティルールの適用を行う|

##acliのここが便利！
今回、acliを敢えて紹介する理由として、acliの便利さとユーザーフレンドリーさ**（個人の感想）**があります。私は割とLinuxが苦手（＝黒背景と文字だけの画面が苦手）で、コマンドラインも苦手なのですが（かといってWindowsが得意かと言われると胸を張ってそうだと言えないんですケドね・・・）、acliは割とすんなり使うことができました（この記事は個人の感想であり、効果・効能を示すものではありません（キリッ））。なぜでしょうか・・・それこそが今回、acliを紹介する利理由でもあるんです。

###分かりやすいオブジェクト名＋対象作業での命令
まず1つ目の理由して、コマンドとのコマンドの書式が覚えやすい**（個人の感想）**です。VMの操作ならvm.offやvm.createなど、単純にvmの後に、ピリオドを挟んで行う操作を記載するだけで良いからです。ネットワーク関連の操作を作成ならnet.create、削除ならnet.delete、イメージ登録なら、image.createなどです。

![スクリーンショット 2017-12-11 10.11.18.png](https://qiita-image-store.s3.amazonaws.com/0/84474/787cd227-7fc4-d36e-74f6-37706fb04e6c.png)

###acliの便利なTAB補完
2つめの理由としてTAB補完機能がとても優れていて、ユーザーフレンドリー**（個人の感想）**な点です。このacli、acliのシェルに入った状態で操作を行うとTABキーなどの補完が効く、そして次に何を入力すべきかのサジェスチョンを出してくれます。ネットワーク機器なんかのシェルでは見かけることはありますが、それ以外ではTAB補完だけはしてくれても、次に何を入力すべきかのサジェスチョンまでは出してくれないものが多いかと思います。

それから、TAB補完の便利な機能として、引数に入力すべき対象のオブジェクトをサジェスチョンとして表示してくれます。以下の画面の例では、host.list_vmで、特定のホスト上で起動しているVMの一覧を取得するコマンドですが、host.list_vmまで入力してTABキーを1回叩くと、対象として選択可能なホストの前方一致部分までを、さらにもう数回TABを叩くと、対象として選択可能なホストの一覧が表示されます。acliの利用者は、その一覧から対象となるホストを入力し、VMの一覧を取得することが可能です。

![スクリーンショット 2017-12-11 11.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/84474/944a0068-8a2e-f494-05f1-89684659f29a.png)

そしてもう１つ、既に入力されこれ以上が入力が不要な引数やオプションについては、サジェスチョンの対象から外れ、TABキー補完などを行った際に表示されなくなることです。これによって、次に必要な引数は何か、そしてまだ入力が必要な引数はあるか、といったことがすぐに理解できます**（個人の感想）**。つまり、面倒なコマンドラインのリファレンスマニュアルを熟読せずに初見で触っても、割となんとかなるくらいの便利さ**（個人の感想）**です。

以下の画面の例では、vm.creatで、VMの作成を行うacliの例ですが、作成するVM名、ここでは「NEW-VM」入力をした後、このVMがAgentVMかどうかの指定をしています。VM名を入力した後、TABキーを1度叩くことで、次に入力すべき引数の一覧が表示されますが、その際には、以下の8個の引数が入力対象として表示されています。

![スクリーンショット 2017-12-11 11.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/84474/0d902a29-8de7-75d4-8b55-412d8110417a.png)

```bash:acli-Before
agent_vm=             Agent VM                                                                                                
disable_branding=     Disable Nutanix branding                                                                                
enable_metrics=       Enable host metrics for this VM                                                                         
extra_flags=          Additional VM flags as key=value pairs, separated by semicolon                                          
memory=               Memory size                                                                                             
num_cores_per_vcpu=   Number of cores per vCPU                                                                                
num_vcpus=            Number of vCPUs                                                                                         
num_vnuma_nodes=      Number of vNUMA nodes  
```
ここで、agentまで入力して、TABキーを押すと、「_vm=」が追加で補完された後、これらの値として入力すべき内容の候補として「true」か「false」が表示されます。

![スクリーンショット 2017-12-11 11.43.49.png](https://qiita-image-store.s3.amazonaws.com/0/84474/8a428044-f27c-fceb-5792-18da964d8f8d.png)

ここでは、このVMをAgentVMとせず、通常のVMとするため「false」を入力します。そしてさらにTABキーを叩くと、今度は以下の内容が表示されます。直前まで表示されていたTABキーでの内容から少し変わっています。agentVMについて入力が完了したことで、AgentVMに対する入力はもう必要ないと判断され、TABキー補完で表示される、次に何を入力すべきかの一覧から「agent_vm=」の内容が消えています。

![スクリーンショット 2017-12-11 11.44.11.png](https://qiita-image-store.s3.amazonaws.com/0/84474/72f05b7c-c4e3-079c-f54c-083b2e72065b.png)

```bash:acli-After                                                                                             
disable_branding=     Disable Nutanix branding                                                                                
enable_metrics=       Enable host metrics for this VM                                                                         
extra_flags=          Additional VM flags as key=value pairs, separated by semicolon                                          
memory=               Memory size                                                                                             
num_cores_per_vcpu=   Number of cores per vCPU                                                                                
num_vcpus=            Number of vCPUs                                                                                         
num_vnuma_nodes=      Number of vNUMA nodes  
```
#まとめ
ここまで見てきたとおり、acliは、次に何を入力すべきかを**「手取り足取り」**教えてくれる**（個人の感想）**、非常にユーザーフレンドリーなコマンドラインインターフェースで、背景が真っ黒で文字列しかない画面に拒絶反応を持っている方にも、その症状を和らげてくれるインターフェースです。

コマンドラインインターフェースは、どうしても膨大なリファレンスを見ながら・・・というケースになることが多く、その時点で利用を諦めるケースもあるかと思いますが、acliについては、マニュアルを用意せずにいきなり触ってもなんとかなるレベル**（個人の感想）**になってると思います（もちろんプロダクション環境での運用フェーズではしっかりとリファレンスマニュアルを熟読してから操作をした方が良いかと思います）。

その2では、実際にacliを使って、AHVの初期設定からVMの作成までを行ってみたいと思います。