Skip navigation
2014

いまさらですが、PowerCLI で VM をクローンしてみようと思います。

 

今回は PowerCLI 5.5 R2 を使用しています。

PowerCLI> Get-PowerCLIVersion | select UserFriendlyVersion

 

UserFriendlyVersion

-------------------

VMware vSphere PowerCLI 5.5 Release 2 build 1671586

 

まず、PowerCLI で vCenter に接続します。

※vCenter のアドレスは「vc55u1-1.vmad.local」にしています。

PowerCLI> Connect-VIServer vc55u1-1.vmad.local

 

Name                           Port  User

----                           ----  ----

vc55u1-1.vmad.local            443   VMAD\Administrator

 

それでは、この VM 「vm001」をクローンしてみます。

PowerCLI> Get-VM vm001

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm001                PoweredOff 1        0.250

 

VM のクローンは、New-VM コマンドレットでできます。

「-VM」でクローン元、「-Name」でクローン先の VM を指定します。

ちなみに、VM のテンプレートからクローンするときは、

「-VM」の代わりに「-Template」に指定します。

 

今回は、ほかにもいくつかオプションを指定しています。

  • 「-VMHost」→ VM を作成する ESXiを指定。
  • 「-Datastore」→ VM を作成するデータストアを指定。
  • 「-DiskStorageFormat」→ 仮想ディスク(VMDK ファイル)のフォーマットを指定。

PowerCLI> New-VM -VM vm001 -Name vm002 -VMHost hv55n1.vmad.local -Datastore ds_hv55n1_01 -DiskStorageFormat EagerZeroedThick

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm002                PoweredOff 1        0.250

 

New-VM には、下記のようにパイプ「|」で VM を指定することもできます。

今回は、別のデータストアにクローンしてみました。

クローン先は NFS データストアなので Thin 形式にしています。

PowerCLI> Get-VM vm001 | New-VM -Name vm003 -VMHost hv55n1.vmad.local -Datastore ds_nfs_181 -DiskStorageFormat Thin

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm003                PoweredOff 1        0.250

 

指定した ESXi / データストア に VM が作成されました。

PowerCLI> Get-VM vm00? | select Name,VMHost,{$_|Get-Datastore} | sort Name | ft -AutoSize

 

Name  VMHost            $_|Get-Datastore

----  ------            ----------------

vm001 hv55n1.vmad.local ds_hv55n1_01

vm002 hv55n1.vmad.local ds_hv55n1_01

vm003 hv55n1.vmad.local ds_nfs_181

 

VMDK ファイルも、指定したディスク形式になっています。

PowerCLI> Get-VM vm00? | Get-HardDisk | select Parent,Name,StorageFormat,@{N="GB";E={[int]$_.CapacityGB}},Filename | ft -AutoSize

 

Parent Name           StorageFormat GB Filename

------ ----           ------------- -- --------

vm001  Hard disk 1            Thick 10 [ds_hv55n1_01] vm001/vm001.vmdk

vm002  Hard disk 1 EagerZeroedThick 10 [ds_hv55n1_01] vm002/vm002.vmdk

vm003  Hard disk 1             Thin 10 [ds_nfs_181] vm003/vm003.vmdk

 

vNIC の種類(VMXNET3など)やポートグループは、クローン元の設定を引き継ぎます。

しかし、MAC アドレスは、ちゃんと再生成されます。

PowerCLI> Get-VM vm00? | Get-NetworkAdapter | select Parent,Name,Type,NetworkName,MacAddress | sort Parent | ft -AutoSize

 

Parent Name                 Type NetworkName  MacAddress

------ ----                 ---- -----------  ----------

vm001  Network adapter 1 Vmxnet3 pg-vlan-0005 00:50:56:90:30:b0

vm002  Network adapter 1 Vmxnet3 pg-vlan-0005 00:50:56:90:38:59

vm003  Network adapter 1 Vmxnet3 pg-vlan-0005 00:50:56:90:00:e6

 

大量のVM を作成したい場合は、

下記のようにまとめて作成したりもできます。

※この例だとクローン元 VM や ESXi などが決め打ちですが・・・

※赤字がコマンド入力している部分です。

PowerCLI> 4..10 | foreach {

>> $vm_name = "vm" + $_.ToString("000")

>> New-VM -VM vm001 -Name $vm_name -VMHost hv55n1.vmad.local -Datastore ds_nfs_181

>> }

>>

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm004                PoweredOff 1        0.250

vm005                PoweredOff 1        0.250

vm006                PoweredOff 1        0.250

vm007                PoweredOff 1        0.250

vm008                PoweredOff 1        0.250

vm009                PoweredOff 1        0.250

vm010                PoweredOff 1        0.250

 

あらかじめ CSV ファイルを用意して、

それを読み込んで New-VM を実行したりすることもできます。

 

このようなファイルを作成しておき・・・

PowerCLI> cat C:\work\vm_list.txt

SrcVM, NewVM, ESXi,            Datastore

vm001, vm011, hv55n1.vmad.local, ds_nfs_181

vm001, vm012, hv55n1.vmad.local, ds_nfs_181

vm001, vm013, hv55n2.vmad.local, ds_nfs_181

vm001, vm014, hv55n2.vmad.local, ds_nfs_181

 

CSV として読み込んで、New-VM を実行します。

読み込んだファイルに記載してあるように VM がクローンされます・・・

PowerCLI> $vm_list = Import-Csv C:\work\vm_list.txt

PowerCLI> $vm_list | foreach {

>> New-VM -VM $_.SrcVM -Name $_.NewVM -VMHost $_.ESXi -Datastore $_.Datastore

>> }

>>

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm011                PoweredOff 1        0.250

vm012                PoweredOff 1        0.250

vm013                PoweredOff 1        0.250

vm014                PoweredOff 1        0.250

 

最後に、

VM の削除は、Remove-VM コマンドレットでできます。

 

まちがって必要な VM を削除をしないように、

Get-VM で実行対象を絞ってから Remove-VM することをお勧めします。

 

ためしにクローンした VM を削除しておこうと思います。

まず、対象の VM を確認して・・・

PowerCLI> Get-VM vm00[2-9], vm01?

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm002                PoweredOff 1        0.250

vm003                PoweredOff 1        0.250

vm004                PoweredOff 1        0.250

vm005                PoweredOff 1        0.250

vm006                PoweredOff 1        0.250

vm007                PoweredOff 1        0.250

vm008                PoweredOff 1        0.250

vm009                PoweredOff 1        0.250

vm010                PoweredOff 1        0.250

vm011                PoweredOff 1        0.250

vm012                PoweredOff 1        0.250

vm013                PoweredOff 1        0.250

vm014                PoweredOff 1        0.250

 

確認した Get-VM のコマンドラインを、そのまま Remove-VM にパイプで渡します。

vm001 だけは、削除せずに残してみました。

 

デフォルトだと vCenter のインベントリから VM を登録削除するだけですが、

「-DeletePermanently」を指定すると、VMDK ファイル自体も削除できます。

PowerCLI> Get-VM vm00[2-9],vm01? | Remove-VM -DeletePermanently -Confirm:$false

PowerCLI> Get-VM vm0??

 

Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

vm001                PoweredOff 1        0.250

 

以上、PowerCLI での VM のクローンについてでした。

ESXi には、ESXi ファイアウォールという独自のファイアウォール機能があります。

よく、VM(のゲスト OS)がうまく通信できない時に疑われることがありますが、

これは VM の通信には影響しないファイアウォールです。

 

ESXi ファイアウォールの見え方


vSphere Client からの見え方

ESXi の「構成」タブ→「セキュリティ プロファイル」のあたりで見られます。

 

esxi-fw02.png

 

Web Client からの見え方

ESXi の「管理」→「設定」→「セキュリティ プロファイル」のあたりで見られます。

 

esxi-fw01.png

 

ESXi に直接ログインした時の見え方

下記のような感じで、esxcli コマンドなどで見られます。

~ # vmware -l

VMware ESXi 5.5.0 Update 1

~ # esxcli network firewall get

   Default Action: DROP

   Enabled: true

   Loaded: true

~ # esxcli network firewall ruleset list

Name                Enabled

------------------  -------

sshServer              true

sshClient             false

nfsClient              true

dhcp                   true

dns                    true

snmp                   true

ntpClient              true

CIMHttpServer          true

CIMHttpsServer         true

CIMSLP                 true

iSCSI                 false

vpxHeartbeats          true

updateManager         false

faultTolerance         true

webAccess              true

vMotion                true

vSphereClient          true

activeDirectoryAll    false

NFC                    true

HBR                    true

ftpClient             false

httpClient            false

gdbserver             false

DVFilter              false

DHCPv6                false

DVSSync                true

syslog                false

IKED                  false

WOL                    true

vSPC                  false

remoteSerialPort      false

vprobeServer          false

rdt                    true

cmmds                  true

vsanvp                 true

rabbitmqproxy          true

ipfam                  true

fdm                    true

 

ESXi ファイアウォールが作用するところ

 

ESXi ファイアウォールは、下図の赤点線のあたり通信を制御します。

図中の VMkernel という部分が、ESXi ハイパーバイザです。

そのため、ESXi 自身の通信(VMkernel の VMkernel ポートの通信)にしか作用しません。

VM の通信には、直接影響しないものです。

 

esxi-fw-img01.png

逆に VM の通信を制御したい場合は、

オレンジ点線のあたりには ESXi ファイアウォールは作用しないので

ゲスト OS でのファイアウォール設定

(Windows ファイアウォールや iptables など)が必要です。

 

そういうわけで、VM の(ゲスト OS の)通信がうまくできないときは

いきなり ESXi ファイアウォールを無効にしたりせずに、

  • その ESXi ホストまでの経路でなにか問題はないか
    (物理サーバより外のファイアウォールや NW 機器の ACL など)
  • VM の認識している vNIC(「ローカルエリア接続 2」や eth1 など)が
    意図した順序で認識されているか
    (ゲストOSから見える MAC アドレスが、VM の 設定画面から見られる MAC アドレスと同じ順番か)
  • VM の vNIC に割り当てたポートグループが正しいか
  • ゲスト OS のファイアウォール設定が正しいか
    (Windows ファイアウォールや iptables など)

などを確認してみるとよいと思います。

 

以上、ESXi ファイアウォールと VM の通信の関係についてでした。

無償版の ESXi の場合は、PowerCLI での ESXi/VM の操作ができません。

しかし、ESXi からの情報取得であれば可能であり、

情報を参照するだけでも PowerCLI は便利だと思います。

 

ただ、PowerCLI(PowerShell)に慣れていない場合に

単純にコマンド単体を実行して表示するだけという もったいないケースがあるようです。


すこし工夫をするだけで だいぶ便利になるので

いくつか役立ちそうなことを紹介してみようと思います。


今回の PowerCLI のバージョンは、5.5 R2 です。

PowerCLI C:\> Get-PowerCLIVersion

 

PowerCLI Version

----------------

   VMware vSphere PowerCLI 5.5 Release 2 build 1671586

---------------

Snapin Versions

---------------

   VMWare AutoDeploy PowerCLI Component 5.5 build 1598391

   VMWare ImageBuilder PowerCLI Component 5.5 build 1598391

   VMware License PowerCLI Component 5.5 build 1265954

   VMware VDS PowerCLI Component 5.5 build 1671576

   VMware vSphere PowerCLI Component 5.5 build 1671576

 

有償版の ESXi を使用している場合は、ほぼ必ず vCenter がいるので

PowerCLI からは vCenter に接続します。

一方、

無償版 ESXi を使用してる場合や、まだ vCenter がない場合は ESXi に直接接続します。

※今回は、hv55n1 ~ hv55n4 という 4台のESXi に接続しています。

PowerCLI C:\> $esxi = "hv55n1.vmad.local","hv55n2.vmad.local","hv55n3.vmad.local","hv55n4.vmad.local"

PowerCLI C:\> Connect-VIServer -Server $esxi -User root -Password ********

 

Name                           Port  User

----                           ----  ----

hv55n1.vmad.local              443   root

hv55n2.vmad.local              443   root

hv55n3.vmad.local              443   root

hv55n4.vmad.local              443   root

 

ESXi の情報を取得するとき、

ただ Get-VMHost を実行しただけだと下記のようになります。

※「警告: 3 個の列が~」は、PowerCLI の画面幅が小さい(デフォルトの80のまま)ためです。

PowerCLI C:\> Get-VMHost

 

警告: 3 個の列が表示に収まらないため、削除されました。

 

Name                 ConnectionState PowerState NumCpu CpuUsageMhz CpuTotalMhz

----                 --------------- ---------- ------ ----------- -----------

hv55n1.vmad.local    Connected       PoweredOn       2         189        3594

hv55n3.vmad.local    Connected       PoweredOn       2         267        3594

hv55n2.vmad.local    Connected       PoweredOn       2         719        3594

hv55n4.vmad.local    Connected       PoweredOn       2         439        3594

 

デフォルトだと、大した情報は表示されていませんが、

実際は、詳細情報を取得できます。

PowerCLI C:\> Get-VMHost | Get-Member

 

   TypeName: VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl

 

Name                  MemberType Definition

----                  ---------- ----------

Equals                Method     bool Equals(System.Object obj)

GetHashCode           Method     int GetHashCode()

GetType               Method     type GetType()

ToString              Method     string ToString()

ApiVersion            Property   System.String ApiVersion {get;}

Build                 Property   System.String Build {get;}

ConnectionState       Property   VMware.VimAutomation.ViCore.Types.V1.Host.V...

CpuTotalMhz           Property   System.Int32 CpuTotalMhz {get;}

CpuUsageMhz           Property   System.Int32 CpuUsageMhz {get;}

CustomFields          Property   System.Collections.Generic.IDictionary`2[[S...

DiagnosticPartition   Property   VMware.VimAutomation.ViCore.Types.V1.Host.V...

ExtensionData         Property   System.Object ExtensionData {get;}

FirewallDefaultPolicy Property   VMware.VimAutomation.ViCore.Types.V1.Host.V...

HyperthreadingActive  Property   System.Boolean HyperthreadingActive {get;}

Id                    Property   System.String Id {get;}

IsStandalone          Property   System.Boolean IsStandalone {get;}

LicenseKey            Property   System.String LicenseKey {get;}

Manufacturer          Property   System.String Manufacturer {get;}

MaxEVCMode            Property   System.String MaxEVCMode {get;}

MemoryTotalGB         Property   System.Decimal MemoryTotalGB {get;}

MemoryTotalMB         Property   System.Decimal MemoryTotalMB {get;}

MemoryUsageGB         Property   System.Decimal MemoryUsageGB {get;}

MemoryUsageMB         Property   System.Decimal MemoryUsageMB {get;}

Model                 Property   System.String Model {get;}

Name                  Property   System.String Name {get;}

NetworkInfo           Property   VMware.VimAutomation.ViCore.Types.V1.Host.N...

NumCpu                Property   System.Int32 NumCpu {get;}

Parent                Property   VMware.VimAutomation.ViCore.Types.V1.Invent...

ParentId              Property   System.String ParentId {get;}

PowerState            Property   VMware.VimAutomation.ViCore.Types.V1.Host.V...

ProcessorType         Property   System.String ProcessorType {get;}

State                 Property   VMware.VimAutomation.ViCore.Types.V1.Host.V...

StorageInfo           Property   VMware.VimAutomation.ViCore.Types.V1.Host.S...

TimeZone              Property   VMware.VimAutomation.ViCore.Types.V1.Host.V...

Uid                   Property   System.String Uid {get;}

Version               Property   System.String Version {get;}

VMSwapfileDatastore   Property   VMware.VimAutomation.ViCore.Types.V1.Datast...

VMSwapfileDatastoreId Property   System.String VMSwapfileDatastoreId {get;}

VMSwapfilePolicy      Property   System.Nullable`1[[VMware.VimAutomation.ViC...

 

そこで、Select-Object でデフォルトでは表示されないプロパティを指定すれば

「インストールされている ESXi の Build 番号まで揃っているか」

などの情報も確認することができます。

※「Format-Table -AutoSize」により、表形式で幅を自動調整しました。

※「Select-Object *」とすれば、すべてのプロパティを表示できます。

PowerCLI C:\> Get-VMHost | Select-Object Name,Version,Build | Format-Table -AutoSize

 

Name              Version Build

----              ------- -----

hv55n1.vmad.local 5.5.0   1623387

hv55n3.vmad.local 5.5.0   1623387

hv55n4.vmad.local 5.5.0   1623387

hv55n2.vmad.local 5.5.0   1623387

 

また、PowerCLI で情報取得すると、

必ずしも同じ順番で結果が表示されるとは限りません。

そこで Sort-Object で Name 列によって昇順で並べて表示してみます。

PowerCLI C:\> Get-VMHost | Sort-Object Name

 

警告: 3 個の列が表示に収まらないため、削除されました。

 

Name                 ConnectionState PowerState NumCpu CpuUsageMhz CpuTotalMhz

----                 --------------- ---------- ------ ----------- -----------

hv55n1.vmad.local    Connected       PoweredOn       2         370        3594

hv55n2.vmad.local    Connected       PoweredOn       2         952        3594

hv55n3.vmad.local    Connected       PoweredOn       2         479        3594

hv55n4.vmad.local    Connected       PoweredOn       2         718        3594

 

最後に、ESXi の物理的な CPU コア数と、メモリ容量を表示しみます。

メモリ容量が微妙な小数で表示されました。

※「ft」は「Format-Table」の短縮形です。

PowerCLI C:\> Get-VMHost | select Name,Version,Build,NumCpu,MemoryTotalGB | ft -AutoSize

 

Name              Version Build   NumCpu        MemoryTotalGB

----              ------- -----   ------        -------------

hv55n1.vmad.local 5.5.0   1623387      2 3.999500274658203125

hv55n4.vmad.local 5.5.0   1623387      2 3.999500274658203125

hv55n3.vmad.local 5.5.0   1623387      2 3.999500274658203125

hv55n2.vmad.local 5.5.0   1623387      2 3.999500274658203125

 

このような場合、PowerShell の型変換を使用すると

うまい具合に調節して、結果を見やすくすることができます。

PowerCLI C:\> Get-VMHost | select Name,Version,Build,NumCpu,{[int]$_.MemoryTotalGB} | ft -AutoSize

 

Name              Version Build   NumCpu [int]$_.MemoryTotalGB

----              ------- -----   ------ ---------------------

hv55n3.vmad.local 5.5.0   1623387      2                     4

hv55n1.vmad.local 5.5.0   1623387      2                     4

hv55n4.vmad.local 5.5.0   1623387      2                     4

hv55n2.vmad.local 5.5.0   1623387      2                     4

 

メモリ容量の列名が式になってしまったので、

列名も PowerShell の機能で「MemGB」に変更してみます。

PowerCLI C:\> Get-VMHost | select Name,Version,Build,NumCpu,@{Name="MemGB";Expression={[int]$_.MemoryTotalGB}} | ft -AutoSize

 

Name              Version Build   NumCpu MemGB

----              ------- -----   ------ -----

hv55n1.vmad.local 5.5.0   1623387      2     4

hv55n3.vmad.local 5.5.0   1623387      2     4

hv55n4.vmad.local 5.5.0   1623387      2     4

hv55n2.vmad.local 5.5.0   1623387      2     4

 

これまでの工夫をまとめてみました。

※ここでは、さらに省略形にしています。

PowerCLI C:\> Get-VMHost | select Name,Version,Build,NumCpu,@{N="MemGB";E={[int]$_.MemoryTotalGB}} | sort Name | ft -AutoSize

 

Name              Version Build   NumCpu MemGB

----              ------- -----   ------ -----

hv55n1.vmad.local 5.5.0   1623387      2     4

hv55n2.vmad.local 5.5.0   1623387      2     4

hv55n3.vmad.local 5.5.0   1623387      2     4

hv55n4.vmad.local 5.5.0   1623387      2     4

 

以上です。いまさらですが、PowerCLI の参照コマンド超入門でした。