1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-11

スクリーンショット 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に一度触れてみて下さい。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?