2021年8月5日木曜日

【PowerCLI】仮想マシンに直接コマンドを実行する「Invoke-VMScript」

PowerCLIでは、直接仮想マシンにコマンドを実行する機能がある。この機能を使うと、仮想マシンのOSにログインすることなく、設定変更や情報取得を行うことができる

このコマンドは非常に有用なので、コマンドの使い方を調べて、実際に試してみた。

環境及び前提条件

環境

  • vSphere 6.7 Update 3

前提条件

  • vCenter ServerでESXi管理されていること (要するに無償版のESXiライセンスの環境ではないこと)
  • 仮想マシンにVMware Toolsがインストールされていること

仮想マシンでコマンドを実行するInvoke-VMScript

仮想マシンに対してコマンドを実行するコマンドレットとして、Invoke-VMScriptが用意されている。構文は以下の通り。

Invoke-VMScript [-ScriptText] <String> [-VM] <VirtualMachine[]> [-HostCredential <PSCredential>] [-HostUser <String>] [-HostPassword <SecureString>] [-GuestCredential <PSCredential>] [-GuestUser <String>] [-GuestPassword <SecureString>] [-ToolsWaitSecs <Int32>] [-ScriptType <ScriptType>] [-Server <VIServer[]>] [-WhatIf] [-Confirm] [<CommonParameters>]

必要となるパラメータの説明を以下に記載する。

パラメータ 内容
VM 仮想マシン名を指定する。
GuestUser 仮想マシンのユーザを指定する。
GuestPassword 仮想マシンのパスワードを指定する。
ScriptText スクリプトのコマンドを記載する。コマンドが長くなる場合は、一度コマンドを変数に代入してから実行させるのがおすすめ。複数コマンドを実行したい場合は「;」でコマンドを複数区切って実行させることができる。
(Optional) ScriptType 実行するスクリプトのタイプを選べる。PowerShell、Bat、Bashのいずれかを選べる。WindowsのデフォルトはPowerShellで、LinuxはBashとなる。したがって、仮想マシンがWindowsで、かつコマンドプロンプト上でコマンドを実行したい場合のみ本パラメータでBatを指定すればよく、通常は設定しなくてよい。

実際にいくつか簡単なコマンドを実行してみよう。

PowerShellコマンドを実行

以下は、Windows Server 2016の仮想マシンでhostnamewhoamiGet-WinSystemLocaleを実行する例となる。きちんとコマンドの実行結果が日本語で返ってきていることがわかる。

PS C:\> $str = "hostname ; whoami ; Get-WinSystemLocale"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd!" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|  WIN-4DDOLQRR420
|  win-4ddolqrr420\administrator
|
|  LCID             Name             DisplayName
|  ----             ----             -----------
|  1041             ja-JP            日本語 (日本)
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------------

コマンドプロンプト (Bat) のコマンドを実行

まずはverコマンドをScriptTypeオプションなしで実行してみよう。verコマンドはPowerShellで実行できないのでエラーになる。

PS C:\> $str = "ver"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd!" -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|  ver : 用語 'ver' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
|  名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください
|  。
|  発生場所 行:1 文字:4
|  + & {ver}
|  +    ~~~
|      + CategoryInfo          : ObjectNotFound: (ver:String) [], CommandNotFoundException
|      + FullyQualifiedErrorId : CommandNotFoundException
|
|
---------------------------------------------------------------------------------------------------------------------------------------------

このような場合は、-ScriptType Batを付けて実行すれば成功する。

PS C:\> $str = "ver"
PS C:\> Invoke-VMScript -VM win2016 -GuestUser "Administrator" -GuestPassword "P@ssw0rd!" -ScriptType Bat -ScriptText $str

ScriptOutput
---------------------------------------------------------------------------------------------------------------------------------------------
|
|  Microsoft Windows [Version 10.0.14393]
|
---------------------------------------------------------------------------------------------------------------------------------------------

実行結果から不要な罫線を削除する

Invoke-VMScriptの出力結果は、----といった罫線で囲まれており、出力結果を使って判断等を行う場合には文字列加工が必要となり使い勝手が悪い。このような場合は一度実行結果を変数に入れたのち、ScriptOutputメソッドを使うことで、純粋な実行結果のみを表示させることができる。また、コマの実行時の終了コードについても、ExitCodeメソッドを使うことで取得することができる。

以下実行例となる。

PS C:\> $str = "uname -a"
PS C:\> $res = Invoke-VMScript -VM VyOS-1.1.8 -GuestUser "vyos" -GuestPassword "P@ssw0rd!" -ScriptText $str

PS C:\> $res

ScriptOutput
-----------------------------------------------------------------------------------------------------------------------
|  Linux vyos 3.13.11-1-amd64-vyos #1 SMP Sat Nov 11 12:10:30 CET 2017 x86_64 GNU/Linux
|
-----------------------------------------------------------------------------------------------------------------------

PS C:\> $res.ScriptOutput
Linux vyos 3.13.11-1-amd64-vyos #1 SMP Sat Nov 11 12:10:30 CET 2017 x86_64 GNU/Linux

PS C:\> $res.ExitCode
0

更新履歴

  • 2020/6/3 新規作成
  • 2021/8/5 「実行結果から不要な罫線を削除する」を追記

0 件のコメント:

コメントを投稿

人気の投稿