nutanix
nutanixce

NutanixのAHVやVMまわりを設定できるacliに触ってみよう(その2)

More than 1 year has passed since last update.

スクリーンショット 2017-12-11 09.37.50.png

本記事は、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}'`
  1. AHVのネットワーク(作成するVLAN/DHCP)を設定
  2. Image ServiceにVMのOSインストール用ISOを登録
  3. VMの作成とVMの電源オン

ハイパーバイザーのネットワーク設定と確認

vNICレスのVMを作成することもできますが、今回はvNICを接続したVMを構成する想定で、ネットワークの確認を事前に行います。
NutanixのAHVにおいてVMに接続するvNICは、AHVのネットワーク構成におけるVLAN設定と紐付いて接続されます。そのため、VMを構成する前に、VMのvNICに接続可能なAHVのネットワーク(主にVLANや該当するVLANのIPAM設定など)について確認します。

ネットワーク確認

パラメータの解説
- net.listは、ネットワークの一覧を表示

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

net.create
<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を追加している

net.add_dhcp/net.update_dhcp_dns
<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を指定

image.create
<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割り当て

vm.create
<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」と言うファイルを設定

vm.disk_create
<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で作成

vm.disk_create
<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(希望する)を設定

vm.nic_create
<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が正しく設定ができているか確認してみます。

スクリーンショット 2017-12-11 23.24.21.pngスクリーンショット 2017-12-11 23.24.45.png

正しく設定できているようです。

実は、特にVMの構成部分については、本来設定すべき項目をかなり省略していますが、acli側、Nutanix側でかなりよしなに設定してくれています(よしなに、と言うかデフォルト値などを設定)。例えば、CPUの設定ではvCPU数は設定していますが、num_cores_per_vcpuを設定していません。ディスクの設定では、Indexの番号等を指定していません。このように、かなり緩い指定でもある程度設定が可能です。

VMの電源オン

パラメータの解説
- vm.on UVM-CENT7は、見たままUVM-CENT7と言うVMの電源をオン、なお、*(アスタリスク)なども指定可能

vm.on
<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を先頭に付けて、つらつらとすべて流し込んで行けば良いわけです。

InitialSetup.sh
#!/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に一度触れてみて下さい。