ESXi 上の VM に ESXi をインストールする「Nested ESXi」と呼ばれる使用方法があり、
検証環境や、vSAN Witness Appliance などで利用されています。
Nested ESXi は物理マシンへのインストールと同様に DCUI からの設定作業ができるため
通常は、VM コンソールから設定をすることになります。
しかし VM であり、しかも最近の ESXi 6.x ではデフォルトで VMware Tools がインストールされます。
そのため Nested ESXi では、ネットワーク設定前であっても
vSphere のレイヤから直接での設定投入ができます。
通常、PowerCLI からゲスト OS の設定を変更する場合は Invoke-VMScript を使用しますが、
ScriptType で指定できるインタープリタは PowerShell、Bat、Bash だけなので
ESXi ではスクリプト(コマンド)が実行できません。
Invoke-VMScript
https://code.vmware.com/doc/preview?id=6330#/doc/Invoke-VMScript.html
そこで、ためしに vSphere Web Services API の GuestOperationsManager にある
GuestProcessManager を利用して esxcli コマンドを実行してみました。
GuestProcessManager
今回は、下記のようなサンプル スクリプトを作成してみました。
エラー制御などは、あえて一切いれていないので、
実行してみる場合はお好みで改造していただければと・・・
invoke_nested-esxcli.ps1 · GitHub
スクリプトの内容は下記のようになっています。
param($ESXiVM, $ESXiUser, $ESXiPass)
# 最初に変数設定。
$vm_name = $ESXiVM
$esxi_user = $ESXiUser
$esxi_pass = $ESXiPass
$esxcli_args = $args
$vm = Get-VM $vm_name | select -First 1
$vm_id = $vm.Id
$vc_name = $vm.Uid -replace "^.*@|:.*$",""
$vc = $global:DefaultVIServers | where {$_.Name -eq $vc_name}
"ESXi VM Name:" + $vm.Name
"esxcli args: " + $esxcli_args
# ESXi の認証情報をセット。
$cred = New-Object VMware.Vim.NamePasswordAuthentication
$cred.Username = $esxi_user
$cred.Password = $esxi_pass
# esxcli コマンドをフルパスで指定。
$gps = New-Object VMware.Vim.GuestProgramSpec
$gps.WorkingDirectory = "/tmp"
$gps.ProgramPath = "/bin/esxcli"
$gps.Arguments = $esxcli_args
# ここでコマンド実行。
$gom = Get-View $vc.ExtensionData.Content.GuestOperationsManager
$pm = Get-View $gom.ProcessManager
$gos_pid = $pm.StartProgramInGuest($vm_Id, $cred, $gps)
$pm.ListProcessesInGuest($vm_Id, $cred, $gos_pid)
実行するときには、まず Nested VM を管理している vCenter に接続しておきます。
PowerCLI> Connect-VIServer <vCenter アドレス>
このスクリプトでは、esxcli のオプションを通常どおり指定しやすいように工夫しています。
実行方法は、下記のような感じです。
PowerCLI> .\invoke_nested-esxcli.ps1<esxcli option> -ESXiVM:<Nested ESXi VM Name> -ESXiUser:<Nested ESXi User Name> -ESXiPass:<Nested ESXi User password>
もしくは・・・
PowerCLI> .\invoke_nested-esxcli.ps1 -ESXiVM:<Nested ESXi VM Name> -ESXiUser:<Nested ESXi User Name> -ESXiPass:<Nested ESXi User password> <esxcli option>
たとえば「esxcli system hostname set --host ~ --domain ~」の実行は
下記のようになります。
PowerCLI> .\invoke_nested-esxcli.ps1 system hostname set --host hv-n23w --domain go-lab.jp -ESXiVM:hv-n23w -ESXiUser:root -ESXiPass:VMware1!
ESXi VM Name:hv-n23w
esxcli args: system hostname set --host hv-n23w --domain go-lab.jp
Name : esxcli
Pid : 2278253
Owner : root
CmdLine : "/bin/esxcli" system hostname set --host hv-n23w --domain go-lab.jp
StartTime : 2018/04/22 2:52:18
EndTime :
ExitCode :
これだとコマンドの出力結果は取得できないのですが、
Nested ESXi をネットワーク設定して vCenter に登録してしまえば
vCenter 経由で ESXi の設定確認ができるので、うちでは設定投入するだけの利用をしています。
ちなみに、今回の環境では下記でした。
- 物理環境: vCenter 6.5 U1 / ESXi 6.5 U1
- Nested ESXi: ESXi 6.7
- PowerCLI 10.0.0 / PowerShell 5.1 / Windows 10
以上、PowerCLI から Nested ESXi の esxcli を実行してみる話でした。