我正在尝试编写一个可以在FreeNas(FreeBSD)框上运行的脚本,该脚本通过SSH连接到ESXi主机并正常关闭VM。我需要运行的VM ID列表是:
vim-cmd vmsvc/power.shutdown VMID
在帮助过滤用于检索ID的命令的输出,然后将其传递给shutdown命令之后。
检索所有VM的命令是:
vim-cmd vmsvc/getallvms
它输出如下数据:
Vmid Name File Guest OS Version Annotation
12 Eds-LINUX [Eds-FS-Datastore-1] Eds-LINUX/Eds-LINUX.vmx ubuntu64Guest vmx-13
13 Eds-RT [Eds-FS-Datastore-1] Eds-RT/Eds-RT.vmx freebsd64Guest vmx-13
14 Eds-DC [Eds-FS-Datastore-1] Eds-DC/Eds-DC.vmx windows9Server64Guest vmx-13
15 Eds-STEAM [Eds-FS-Datastore-1] Eds-STEAM/Eds-STEAM.vmx windows9_64Guest vmx-13
16 Eds-DL [Eds-FS-Datastore-1] Eds-DL/Eds-DL.vmx windows9Server64Guest vmx-13
17 Eds-RD [Eds-FS-Datastore-1] Eds-RD/Eds-RD.vmx windows9Server64Guest vmx-13
18 Eds-PLEX [Eds-FS-Datastore-1] Eds-PLEX/Eds-PLEX.vmx windows9Server64Guest vmx-13
19 Eds-MC [Eds-FS-Datastore-1] Eds-MC/Eds-MC.vmx windows9Server64Guest vmx-13
2 Eds-FS [Eds-ESXi-Datastore-1] Eds-FS/Eds-FS.vmx freebsd64Guest vmx-13
我确定可以使用管道插入sed中,使用以下命令删除第一行:
vim-cmd vmsvc/getallvms | sed '1d'
然后,我可以使用以下方法检索要过滤出的VM的ID:
vim-cmd vmsvc/getallvms | awk '/Eds-FS.vmx/{print$1}'
这给我ID2。但是,我不清楚如何将其存储在变量中以备后用。
我需要知道一种仅从该数据中选择第一列的方法,然后将列表中的每个ID放入数组中。然后,我需要遍历数组,并为每个ID运行以下命令以获取VM的电源状态:
vim-cmd vmsvc/power.getstate VMID
这样输出的数据处于打开或关闭状态:
Retrieved runtime info
Powered on
对于每一个打开的电源,我都需要将VM ID存储在第二个阵列中,以便稍后传递给shutdown命令,除非该ID等于我要关闭电源的VM的ID。
答案 0 :(得分:0)
要在第一列中列出ID,请使用awk
,如下所示:
vim-cmd vmsvc/getallvms | awk 'NR>1{print $1}'
要将ID存储在shell数组中,请使用:
readarray -t arr < <(vim-cmd vmsvc/getallvms | awk 'NR>1{print $1}')
要遍历数组并运行另一个命令:
for id in "${arr[@]}"; do
vim-cmd vmsvc/power.getstate "$id"
done
要存储一个特定的id,请使用命令替换:
vmid1=$(vim-cmd vmsvc/getallvms | awk '/Eds-FS\.vmx/{print$1}')
答案 1 :(得分:0)
感谢anubhava,他给了我足够的帮助来使某些东西正常工作(尽管可能没有遵循标准或最佳实践)
我已将此脚本保存在我的ESXi主机上,该主机通过SSH连接并触发以下运行:
freenasid=`vim-cmd vmsvc/getallvms | sed '1d' | awk '/Eds-FS.vmx/{print$1}'`
vmids=`vim-cmd vmsvc/getallvms | sed '1d' | awk '{print$1}'`
for vmid in $vmids
do
if [ $vmid != $freenasid ]
then
powerstate=`vim-cmd vmsvc/power.getstate $vmid | sed '1d'`
if [ "$powerstate" = "Powered on" ]
then
onvmids="$onvmids $vmid"
fi
fi
done
for vmid in $onvmids
do
vim-cmd vmsvc/power.shutdown $vmid
done
exit 0
这可以正确关闭所有正在运行的VM。