本記事は、Nutanix Advent Calendar 2017,2枚目の12日目、12月12日分としての投稿になります。
https://adventar.org/calendars/2761
** 本記事の内容はこの日付時点の情報(ce-2017.07.20-stable)に基づいています。そのため,今後新しいバージョンが提供された場合に,当該記載と矛盾が生じる場合がありますのでご注意ください。
#はじめに
作事の「NutanixのAHVやVMまわりを設定できるacliに触ってみよう(その1)」では、acliとは何か、ユースケースや、その便利さなどについて紹介してきました。本日のその2では、実際にacliを利用して、AHVの設定やVMの作成を行っていきます。
#acliを触ってみよう
それでは、Nutanix Community Edition(Nutanix CE)でacliを実際に触ってみましょう。今回は、VMを作成や電源操作が、acliでよく利用されるユースケースと想定し、それらに関連する操作をacliについて見ていきます。
ここでは、Nutanix CEをセットアップし、最初のアクティベーション直後から、AHVをセットアップし、VMをインストールするところまでをacliで行っていきます。以下、acliで行う作業内容のサマリです。
*Storage Containerは、ncliを利用してセットアップ済みのもの、またはデフォルトをそのまま利用する想定(念のため、ncliでのStorage Containerの作成についてもコードを紹介)
:ncliでstorage-container作成
ncli container add name=ISO-STORE sp-name=`ncli storagepool ls | grep Name | awk '{print $3}'`
- AHVのネットワーク(作成するVLAN/DHCP)を設定
- Image ServiceにVMのOSインストール用ISOを登録
- VMの作成とVMの電源オン
##ハイパーバイザーのネットワーク設定と確認
vNICレスのVMを作成することもできますが、今回はvNICを接続したVMを構成する想定で、ネットワークの確認を事前に行います。
NutanixのAHVにおいてVMに接続するvNICは、AHVのネットワーク構成におけるVLAN設定と紐付いて接続されます。そのため、VMを構成する前に、VMのvNICに接続可能なAHVのネットワーク(主にVLANや該当するVLANのIPAM設定など)について確認します。
###ネットワーク確認
パラメータの解説
- net.listは、ネットワークの一覧を表示
<acropolis> net.list
Network name Network UUID Type Identifier Subnet
vlan.0 fcba15f3-636f-48d2-976d-355f6352d55e kBridged 0 172.16.0.0/16
<acropolis>
###ネットワークの作成
まず最初にネットワークを作成します。既にvlan.0は作成済みなので、代わりにvlan.220を作成していますが、Nutanix CEのアクティベート直後には一切ネットワークがないため、最初にvlan.0を作成します。vlan.0は、NutanixにおけるネイティブVLANで、タグなしでの通信を行うネットワークになっています(既にインストール環境中で利用するアンマネージドまたはアンタグVLANが0ではない場合は、acliでもなくncliでもないchange_cvm_vlanで実行)。アクティベーション直後の状態である場合は、vlan.220をvlan.0に読み替えて下さい。
パラメータの解説
- vlan.220は、VLAN名称
- vlan=220は、VLAN IDを220と設定
- ip_config=172.16.220.1/2は、Gateway Address/Prefix
<acropolis> net.list
Network name Network UUID Type Identifier Subnet
vlan.0 fcba15f3-636f-48d2-976d-355f6352d55e kBridged 0 172.16.0.0/16
<acropolis>
<acropolis> net.create
Expecting: Network name
<acropolis> net.create vlan.220
annotation= Annotation string
dhcp_address= DHCP server address (for managed networks)
ip_config= IP configuration in CIDR notation ("default_gateway/prefix")
mtu= MTU setting
vlan= VLAN ID
vswitch_name= Vswitch name
<acropolis> net.create vlan.220 vlan=220 ip_config=
Expecting: IP configuration in CIDR notation ("default_gateway/prefix")
<acropolis> net.create vlan.220 vlan=220 ip_config=172.16.220.1/24
<acropolis>
<acropolis>
<acropolis> net.list
Network name Network UUID Type Identifier Subnet
vlan.0 fcba15f3-636f-48d2-976d-355f6352d55e kBridged 0 172.16.0.0/16
vlan.220 1ebf6320-b787-4ef4-8d50-78d2cd6ebf6c kBridged 220 172.16.220.0/24
###IP ADDRESS MANAGEMENT機能を有効状態にしてDHCP設定
VLANごとに設定可能なIPAM(IPアドレスマネジメント機能)は、特に有効にするといったスイッチはacli上にはありませんが、DHCPに関するパラメータを設定すると自動でこれらが有効となります。以下の例では、vlan.220に対して、まずDHCPを「net.add_dhcp_pool」で設定し、その後「net.update_dhcp_dns」でDHCPで配布されるIPにおけるDHCPオプションのDNSを設定しています。
パラメータの解説
- net.add_dhcp_pool vlan.220は、VLAN名称「vlan.220」に対してDHCPサーバーを追加する
- start=172.16.220.11 end=172.16.220.240は、DHCPのプールアドレスを設定
- net.update_dhcp_dns vlan.220は、VLAN名称「vlan.220」に対してDHCPオプションを設定する
- servers=8.8.8.8は、DHCPオプション06のDNSサーバーアドレス、8.8.8.8を追加している
<acropolis> net.add_dhcp_pool vlan.
vlan.0 vlan.220
<acropolis> net.add_dhcp_pool vlan.220
end= Last IPv4 address
start= First IPv4 address
<acropolis> net.add_dhcp_pool vlan.220 start=172.16.220.11 end=172.16.220.240
<acropolis>
<acropolis> net.update
net.update Updates network metadata.
net.update_dhcp_dns Configure the DHCP DNS configuration for a managed network.
net.update_dhcp_tftp Configure the DHCP TFTP configuration for a managed network.
net.update_network_function_chain Sets the network function chain for this network.
<acropolis> net.update_dhcp_dns vlan.220
domains= Comma-delimited list of search domains
servers= Comma-delimited list of DNS server IP addresses
<acropolis> net.update_dhcp_dns vlan.220 servers=8.8.8.8
##Image Serviceへのイメージ登録
VMを作成するには、Prismなどのユーザーインターフェースを通じて、MVへのOSインストールに必要なOSのISOファイルやOSが構成済みのディスクイメージなどの登録が必要です。PrismのGUIを通じたImage Serviceは、容易な操作でISOファイルなどのイメージを登録可能ですが、基本的に1つのアップロードが終わるまで次の操作を待つ必要があります(AOS 5.5からは待つ必要なく次の操作に移れる)。acliを利用することでバッチ的に複数のイメージを一括でアップロードすることが可能です。今回は、acliを利用してISOファイルの登録操作を行って見ます。
なお、以下の例では、http://経由でのファイル登録を行っていますが、このほかにnfs://のURIでも登録が可能で、例えばラボからアクセス可能な社内のNFSサーバー等がインストールイメージのリポジトリ等になっている場合は、nfs://のURI指定をすることで、PrismにISOイメージを登録することが可能です。
パラメータの解説
- image.create ISO-UBUNTU16は、「ISO-UBUNTU16」という名称でイメージを登録
- container=ISO-STOREは、「ISO-STORE」というStorage Containerにイメージを登録
- image_type=kIsoImageは、登録するファイルのタイプはISOである宣言
- source_url=http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.isoは、登録するイメージのソースURLを指定
<acropolis> image.create
Expecting: Comma-delimited list of image names
<acropolis> image.create ISO-UBUNTU16
annotation= Image description
architecture= Disk image CPU architecture
clone_from_vmdisk= UUID of the source vmdisk
compute_checksum= If True, we will compute the checksum of the image
container= Destination Storage Container
image_type= Image type
product_name= Name of the producer/distributor of the image
product_version= Version string for the image
sha1_checksum= SHA-1 checksum
sha256_checksum= SHA-256 checksum
source_url= URL location of the source image
wait= If True, we will wait for the image creation to complete
<acropolis> image.create ISO-UBUNTU16 container=
ISO-STORE NutanixManagementShare SelfServiceContainer UVM-STORE01
<acropolis> image.create ISO-UBUNTU16 container=ISO-STORE
annotation= Image description
architecture= Disk image CPU architecture
clone_from_vmdisk= UUID of the source vmdisk
compute_checksum= If True, we will compute the checksum of the image
image_type= Image type
product_name= Name of the producer/distributor of the image
product_version= Version string for the image
sha1_checksum= SHA-1 checksum
sha256_checksum= SHA-256 checksum
source_url= URL location of the source image
wait= If True, we will wait for the image creation to complete
<acropolis> image.create ISO-UBUNTU16 container=ISO-STORE image_type=k
kDiskImage kIsoImage kNoType
<acropolis> image.create ISO-UBUNTU16 container=ISO-STORE image_type=kIsoImage
annotation= Image description
architecture= Disk image CPU architecture
clone_from_vmdisk= UUID of the source vmdisk
compute_checksum= If True, we will compute the checksum of the image
product_name= Name of the producer/distributor of the image
product_version= Version string for the image
sha1_checksum= SHA-1 checksum
sha256_checksum= SHA-256 checksum
source_url= URL location of the source image
wait= If True, we will wait for the image creation to complete
<acropolis> image.create ISO-UBUNTU16 container=ISO-STORE image_type=kIsoImage source_url=http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
ISO-UBUNTU16: pending
##VMの作成と電源操作
VMの作成も1つのウィザード画面のみでPrismのGUIを通じたVMの作成には特段難しいことはありませんが、最低限でもVM名、vCPU数、vCPU数あたりのコア数、メモリ容量、インストールISOやディスクイメージ、インストール先のディスクサイズ設定、vNICの設定が必要です。この操作を複数回繰り返す必要があるとなると、さすがに面倒な場合もあります。
その場合、acliやBashからacliコマンドをシェルスクリプト形式などで一気に流し込むことで、クローン操作では難しい個々のVMに対する、個別の命名規則でのVM名の設定や、1つ1つ異なるサイジングでのVM作成を容易に作成することが可能です。
今回は、acliにてVMの作成から、設定済みのVMに対する電源投入操作を行ってみます。
###VM基本構成の作成
パラメータの解説
- vm.create UVM-CENT7は、VM名称を設定
- memory=1Gは、VMのメモリサイズとして1GB割り当て
- num_vcpus=2は、VMのvCPU数を2割り当て
<acropolis> vm.create
Expecting: Comma-delimited list of VM names
<acropolis> vm.create UVM-CENT7
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
<acropolis> vm.create UVM-CENT7 memory=
Expecting: Memory size
<acropolis> vm.create UVM-CENT7 memory=1G
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
num_cores_per_vcpu= Number of cores per vCPU
num_vcpus= Number of vCPUs
num_vnuma_nodes= Number of vNUMA nodes
<acropolis> vm.create UVM-CENT7 memory=1G num_v
num_vcpus= Number of vCPUs
num_vnuma_nodes= Number of vNUMA nodes
<acropolis> vm.create UVM-CENT7 memory=1G num_vcpus=2
UVM-CENT7: complete
###VMのディスク回りの構成-1
パラメータの解説
- vm.disk_create UVM-CENT7は、先ほど作成したUVM-CENT7と言うVMのディスクを作成する宣言
- cdrom=true、作成しようとしているディスクがCD-ROMドライブかどうかのフラグ
- clone_from_image=ISO-CENT7-MINは、"clone_from_image"、つまりイメージサービスからのクローン(CD-ROMへのマウント)を意味し、その中から「ISO-CENT7-MIN」と言うファイルを設定
<acropolis> vm.disk_create
MNG-AD MNG-PC UVM-CENT7
<acropolis> vm.disk_create UVM-CENT7
bus= Device bus
cdrom= Indicates if the disk is a CDROM drive
clone_from_adsf_file= Path to an ADSF file
clone_from_image= An image name/UUID
clone_from_vmdisk= A vmdisk UUID
clone_min_size= Minimum size of the resulting clone (only applies to cloned disks)
container= Container (only applies to newly-created disks)
create_size= Size of new disk
device_uuid= Device UUID
empty= Whether the disk is empty (only applies to CDROMs)
index= Device index on bus
scsi_passthru= Passthrough disk?
<acropolis> vm.disk_create UVM-CENT7 cdrom=true
bus= Device bus
clone_from_adsf_file= Path to an ADSF file
clone_from_image= An image name/UUID
clone_from_vmdisk= A vmdisk UUID
clone_min_size= Minimum size of the resulting clone (only applies to cloned disks)
container= Container (only applies to newly-created disks)
create_size= Size of new disk
device_uuid= Device UUID
empty= Whether the disk is empty (only applies to CDROMs)
index= Device index on bus
scsi_passthru= Passthrough disk?
<acropolis> vm.disk_create UVM-CENT7 cdrom=true clone_from_image=
CentOS-7-x86_64-Minimal-1611.iso ISO-UBUNTU16 ISO-WIN10
ISO-CENT7-MIN ISO-VIRTIO ISO-WIN2016
<acropolis> vm.disk_create UVM-CENT7 cdrom=true clone_from_image=ISO-CENT7-MIN
DiskCreate: complete
###VMのディスク回りの構成-2
パラメータの解説
- vm.disk_create UVM-CENT7は、引き続きUVM-CENT7と言うVMにディスクを設定する宣言
- container=UVM-STORE01は、作成するディスクを「UVM-STORE01」と言うStorage Containerに配置する設定
- create_size=16Gは、サイズを16GBで作成
<acropolis> vm.disk_create
MNG-AD MNG-PC UVM-CENT7
<acropolis> vm.disk_create UVM-CENT7 container=
ISO-STORE NutanixManagementShare SelfServiceContainer UVM-STORE01
<acropolis> vm.disk_create UVM-CENT7 container=UVM-STORE01 create_size=
Expecting: Size of new disk
<acropolis> vm.disk_create UVM-CENT7 container=UVM-STORE01 create_size=16G
DiskCreate: complete
###VMのネットワーク回りの構成
パラメータの解説
- vm.nic_create UVM-CENT7は、UVM-CENT7と言うVMに対してvNICを作成する宣言
- network=vlan.0は、「vlan.0」という名称のVLANに接続するvNICを指定する宣言
- request_ip=true、AHVのIPAMから払い出されるDHCPを希望するか否かのフラグで、True(希望する)を設定
<acropolis> vm.nic_create
MNG-AD MNG-PC UVM-CENT7
<acropolis> vm.nic_create UVM-CENT7
ip= IPv4 address
mac= MAC address
model= Virtual hardware model. Defaults to 'virtio', can also specify 'e1000'.
network= Network identifier
network_function_nic_type= Network function nic type
request_ip= If true, then try to request an IP from Acropolis (static if the 'ip=' field is set, otherwise dynamic if the network is managed.) If false, then don't request an IP from Acropolis at all (even if 'ip=' is set.
trunked_networks= List of trunked networks.
type= NIC Type
vlan_mode= VLan Mode. Access by default.
<acropolis> vm.nic_create UVM-CENT7 network
network= Network identifier
network_function_nic_type= Network function nic type
<acropolis> vm.nic_create UVM-CENT7 network=vlan.0 request_ip=
false true
<acropolis> vm.nic_create UVM-CENT7 network=vlan.0 request_ip=true
NicCreate: complete
###念のためVMの構成をPrismから確認
念のため、acliでVMが正しく設定ができているか確認してみます。
正しく設定できているようです。
実は、特にVMの構成部分については、本来設定すべき項目をかなり省略していますが、acli側、Nutanix側でかなりよしなに設定してくれています(よしなに、と言うかデフォルト値などを設定)。例えば、CPUの設定ではvCPU数は設定していますが、num_cores_per_vcpuを設定していません。ディスクの設定では、Indexの番号等を指定していません。このように、かなり緩い指定でもある程度設定が可能です。
###VMの電源オン
パラメータの解説
- vm.on UVM-CENT7は、見たままUVM-CENT7と言うVMの電源をオン、なお、*(アスタリスク)なども指定可能
<acropolis> vm.on
MNG-AD MNG-PC UVM-CENT7
<acropolis> vm.on UVM-CENT7
UVM-CENT7: complete
#acliのコマンドを一撃sh(と言うにはあまりに未熟)に纏めて見る
ここまで、acli(とacliでStorage Containerの作成)を利用して、AHVのネットワーク設定、イメージ登録、VMの作成、VMの電源オンを行ってきました。ここまでの例では、acliのプロンプトにはいって、個々にコマンドを実行していましたが、これをシェルスクリプトに纏めて見ると、どうでしょう。シェルスクリプトを一回叩くだけで、VMの電源オンまでが手放しでいけます。
方法としてはとても簡単です、acliもncliもそれぞれのシェルに入り、プロンプトからコマンドを逐次実行するのではなく、bash上でacliなどを指定してコマンドを書くだけです。bash上でacliのコマンドを実行するには、以下のようにします。
bash$ > acli net.create vlan.220 vlan=220 ip_config=172.16.220.1/24
つまり**(とてもすごい力技ですが)**ここまで解説してきたacliコマンドをシェルスクリプトの中にacliを先頭に付けて、つらつらとすべて流し込んで行けば良いわけです。
#!/bin/bash
#ncliでデフォルトのStorage Pool配下に「ISO-STORE」「UVM-STORE」の2つのStorage Containerを作成する
ncli container add name=ISO-STORE sp-name=`ncli storagepool ls | grep Name | awk '{print $3}'`
ncli container add name=UVM-STORE sp-name=`ncli storagepool ls | grep Name | awk '{print $3}'`
#AHVのネットワークを作成する
acli net.create vlan.0 vlan=0 ip_config=172.16.0.1/24
acli net.add_dhcp_pool vlan.0 start=172.16.0.11 end=172.16.0.240
acli net.update_dhcp_dns vlan.0 servers=8.8.8.8
#VMのOSインストール用ISOイメージ等を登録する(Ubuntu16、VirtIO、CentOS7 Minimal)
acli image.create ISO-UBUNTU16 container=ISO-STORE image_type=kIsoImage
acli source_url=http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
acli image.create ISO-VIRTIO container=ISO-STORE image_type=kIsoImage
acli source_url=http://download.nutanix.com/mobility/1.1.1/Nutanix-VirtIO-1.1.1.iso
acli image.create ISO-CENT7-MIN container=ISO-STORE image_type=kIsoImage
acli source_url=http://ftp.iij.ad.jp/pub/linux/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso
#VMを作成(CentOS Minimal)
acli vm.create UVM-CENT7 memory=1G num_vcpus=2
acli vm.disk_create UVM-CENT7 cdrom=true clone_from_image=ISO-CENT7-MIN
acli vm.disk_create UVM-CENT7 container=UVM-STORE01 create_size=16G
acli vm.nic_create UVM-CENT7 network=vlan.0 request_ip=true
#VMの電源をオン
acli vm.on UVM-CENT7
もっとも実運用に耐えるには、ここから変数化してファイルに汎用性を持たせたり、エラーハンドリングをする必要がありますし、まだVMが起動されインストール待ちの状態までしか到達できていません。もう少し踏み込んでOSのインストールまで持っていくには、あらかじめVMにインストール用のISOイメージをマウントするのではなく、インストール済みの、またはSysprep済みのディスクイメージをマウントして起動する、またはNutanix側の機能としてあるゲストカスタマイズ機能(Cloud init等)を利用する、または1台、ひな形VMを作成しておき、クローンする方が早い場合もあるかもしれませんが、単純なクローンでは対応しきれない、個別のカスタマイズがある様々なVMを一気に構成したりするには、こんな具合のやっつけな感じでも、ある程度を手放しで行える状況にもっていけます。
#まとめ
acliを利用することで、Nutanix CEのインストールとアクティベーション直後、またはプロダクションモデルのNutanixのFoundationとそのアクティベーション直後、Nutanixの環境が、まだまっさらな状態から、acliのみの利用でも、一撃でAHVのネットワークの設定、VMのインストールイメージの登録、VMの構成・作成、VMの電源オンと言うところまでを行うことも可能です。
同様に、ある程度、構成、設定を行い、多数のVMをデプロイしてNutanixを利用している状態から、クラスタのDestroyや再構成を行うことなく一撃でアクティベーション直後のNutanixの環境に戻す(いろいろdelete祭り)ことも可能な訳です(実は、環境リフレッシュのための専用コマンドがあったりしますが、ここでは一旦置いておいて)。
スマホレベルのシンプルさ、ITのスペシャリストでじゃない人でも直感的な操作が可能なユーザーエクスペリエンスを売りにしているPrismですが、ハンズオントレーニング環境の構築、環境の条件を変更しながら繰り返しテストを行うなどのユースケースによっては、コマンドラインインターフェースを利用したい場合も当然生じるケースもあり、その場合には便利なツールになるかと思います。
Nutanixでは、今後、ここで紹介したようなシェルスクリプトで実現するような機能は、既に紹介したようにCalmなどで代替できるようになりますが、AOS 5.5系以降のAOSとそれに合わせて提供されているPrism Centralのバージョン5.5以降の導入及びそれに伴う設定が必要となります。引き続きAOS 5.1系を利用する場合やPrism Centralを導入しない場合などでは、まだまだ運用や構築に貢献できる機能です。
是非、acliに一度触れてみて下さい。