有台测试的虚拟机经常需要开机或关机操作,每次都通过web界面进行操作的话影响效率。遂通过API进行操作,减少web加载的等待时间。
详细的API接口文档可参考官方链接 : vmware API
首先获取访问API接口的令牌
curl -s -k -X POST "https://$vcenter-ip/rest/com/vmware/cis/session" -u $username:$password
分别替换$vcenter-ip为vcenter的ip; $username为vcenter 的用户名 $password为vcenter 的密码
注意curl 的方法为 POST
正常返回的结果类似这样:
{"value":"8d152bff9448d85ba377fab5d2712026"}
其中8d152bff9448d85ba377fab5d2712026 为令牌内容
通过令牌获取需要操作的vm的vm id
curl -s -k -X GET "https://$vcenter-ip/rest/vcenter/vm" -H "vmware-api-session-id: $your-session-id" | jq
分别替换$vcenter-ip为vcenter的ip; $your-session-id为上一步获取到的令牌
注意curl 的方法为 GET
输出的结果为json格式,不太方便看。
{"value": [{"memory_size_MiB": 4096,"vm": "vm-5039","name": "vAF_8.0.6","power_state": "POWERED_OFF","cpu_count": 2} ]}
可以安装jq工具进行格式化,安装jq后执行(其实就是比上一步多输入 | jq ):
curl -s -k -X GET "https://$vcenter-ip/rest/vcenter/vm" -H "vmware-api-session-id: $your-session-id" | jq
输出结果为:
{
"value": [
{
"memory_size_MiB": 4096,
"vm": "vm-5039",
"name": "vAF_8.0.6",
"power_state": "POWERED_OFF",
"cpu_count": 2
}
]
}
其中name为vm的名字,vm为vm id 当然也可以利用jq 通过vm名过滤出vm id,例如要过滤出名字为PA-VM-11的虚拟机的vm id 则执行
curl -s -k -X GET "https://$vcenter-ip/rest/vcenter/vm" -H "vmware-api-session-id: $your-session-id" | jq -r '.value[] | select(.name=="PA-VM-11") | .vm
操作虚拟机
此时令牌、vm id都获取后可进行虚拟机的操作
获取当前虚拟机完整信息
curl -s -k -X GET "https://$vcenter-ip/rest/vcenter/vm/$vm-id/" -H "vmware-api-session-id: $your-session-id"
注意curl 的方法为 GET
获取当前虚拟机电源状态
只需要在vm id 后面加power字样
curl -s -k -X GET "https://$vcenter-ip/rest/vcenter/vm/$vm-id/power" -H "vmware-api-session-id: $your-session-id"
注意curl 的方法为 GET
执行开机操作
curl -s -k -X POST "https://$vcenter-ip/rest/vcenter/vm/$vm-id/power/start" -H "vmware-api-session-id: $your-session-id"
注意curl 的方法为 POST
执行关机操作
curl -s -k -X POST "https://$vcenter-ip/rest/vcenter/vm/$vm-id/power/stop" -H "vmware-api-session-id: $your-session-id"
注意curl 的方法为 POST
成果脚本
将以下代码保存为文件 vm-operator
执行 bash vm-operator start 命令vm id 为vm-800的虚拟机自动开机
执行 bash vm-operator stop 命令vm id 为vm-800的虚拟机自动关机
#!/bin/bash
#检查 curl 和 jq 命令是否存在
command -v curl > /dev/null 2>&1 || { echo "curl 命令未安装. 请先安装 curl."; exit 1; }
command -v jq > /dev/null 2>&1 || { echo "jq 命令未安装. 请先安装 jq."; exit 1; }
vcenter_ip="10.0.0.3"
vm_id="vm-800"
username="admin"
password="Vmware"
case $# in
0)
echo "Usage: $0 {start|stop}"
exit 1
;;
1)
response=$(curl -s -k -X POST https://$vcenter_ip/rest/com/vmware/cis/session -u $username:$password )
session_id=$(echo "$response" | jq -r .value)
if [ $? -ne 0 ]; then
echo "登录 VMware vCenter API 失败。请检查 vCenter IP, 用户名和密码。"
exit 1
fi
case $1 in
start)
echo "power on vm: win11 test..."
curl -k -X POST "https://$vcenter_ip/rest/vcenter/vm/$vm_id/power/start" -H "vmware-api-session-id: $session_id"
echo "Done!"
;;
stop)
echo "power off vm win 11 test..."
curl -k -X POST "https://$vcenter_ip/rest/vcenter/vm/$vm_id/power/stop" -H "vmware-api-session-id: $session_id"
echo "Done!"
;;
*)
echo "'$1' is not a valid verb."
echo "Usage: $0 {start|stop}"
exit 2
;;
esac
;;
*)
echo "Too many args provided ($#)."
echo "Usage: $0 {start|stop}"
exit 3
;;
esac