解析 ESXI vim-cmd Hostsvc/autostartmanager/get_autostartseq 以获取每个虚拟机 stopDelay 参数

问题描述 投票:0回答:1

当 UPS 使用电池时,我有每个 ESXI 的关闭脚本。我需要使这个脚本更好地读取可以在 ESXI 主机 UI 中设置的“stopDelay”。可以使用命令 vim-cmd 在控制台中找到该值。 我需要一个脚本,它将返回“stopDelay”以获取所需的 VM ID 作为输入参数。

例如:

[root@localhost:~] vim-cmd hostsvc/autostartmanager/get_autostartseq

(vim.host.AutoStartManager.AutoPowerInfo) [
   (vim.host.AutoStartManager.AutoPowerInfo) {
      key = 'vim.VirtualMachine:1',
      startOrder = 1,
      startDelay = 10,
      waitForHeartbeat = "systemDefault",
      startAction = "powerOn",
      stopDelay = 13,
      stopAction = "systemDefault"
   },
   (vim.host.AutoStartManager.AutoPowerInfo) {
      key = 'vim.VirtualMachine:2',
      startOrder = 2,
      startDelay = -1,
      waitForHeartbeat = "systemDefault",
      startAction = "powerOn",
      stopDelay = 5,
      stopAction = "systemDefault"
   },
   (vim.host.AutoStartManager.AutoPowerInfo) {
      key = 'vim.VirtualMachine:3',
      startOrder = 3,
      startDelay = -1,
      waitForHeartbeat = "systemDefault",
      startAction = "powerOn",
      stopDelay = -1,
      stopAction = "systemDefault"
   }
]

如何解析此输出以获取 VM ID 及其 stopDelay 值? 等式:

./getVMStopDelay 1 => 13
./getVMStopDelay 2 => 5
./getVMStopDelay 3 => -1
bash awk sed esxi
1个回答
0
投票

我将利用 GNU

AWK
来完成此任务,让
file.txt
内容为

(vim.host.AutoStartManager.AutoPowerInfo) [
   (vim.host.AutoStartManager.AutoPowerInfo) {
      key = 'vim.VirtualMachine:1',
      startOrder = 1,
      startDelay = 10,
      waitForHeartbeat = "systemDefault",
      startAction = "powerOn",
      stopDelay = 13,
      stopAction = "systemDefault"
   },
   (vim.host.AutoStartManager.AutoPowerInfo) {
      key = 'vim.VirtualMachine:2',
      startOrder = 2,
      startDelay = -1,
      waitForHeartbeat = "systemDefault",
      startAction = "powerOn",
      stopDelay = 5,
      stopAction = "systemDefault"
   },
   (vim.host.AutoStartManager.AutoPowerInfo) {
      key = 'vim.VirtualMachine:3',
      startOrder = 3,
      startDelay = -1,
      waitForHeartbeat = "systemDefault",
      startAction = "powerOn",
      stopDelay = -1,
      stopAction = "systemDefault"
   }
]

然后

awk 'index($0,"(vim.host.AutoStartManager.AutoPowerInfo)")>1{cnt+=1}/stopDelay/{sub(/,/,"");print "./getVMStopDelay",cnt,"=>",$NF}' file.txt

提供输出

./getVMStopDelay 1 => 13
./getVMStopDelay 2 => 5
./getVMStopDelay 3 => -1

说明:我使用

index
函数来检测
(vim.host.AutoStartManager.AutoPowerInfo)
缩进的行,即开始位置在第一个字符之后,如果是这样,我会将
cnt
值增加 1。当我找到带有
stopDelay
的行时我使用空字符串替换
,
,即删除它并使用
cnt
的值和最后一个字段的内容 (
$NF
) 以符合您要求的格式打印。

(在 GNU Awk 5.1.0 中测试)

© www.soinside.com 2019 - 2024. All rights reserved.