Если вы не слышали про такой проект Proxmox VE, то запомните это название, чтобы вспомнить его, когда вам потребуется удобное и бесплатное решение для внедрения виртуализации. Proxmox VE - это Debian Linux + веб интерфейс, благодаря которым вы получите доступ к мощному функционалу гипервизора KVM, Qemu, контейнерам LXC и СХД Ceph. У Proxmox VE есть развитый API, позволяющий реализовать альтернативный доступ к вашим виртуальным машинам. В данной статье речь пойдёт о консольной утилите pvesh, использующей API и помогающей админу в автоматизации его повседневных задач. Встала задача перезагружать виртуальную машину не собственными командами из планировщиков операционной системы (изнутри виртуальной машины), а снаружи, средствами Proxmox VE посылать сигнал, словно нажата виртуальная кнопка питания, приказывающая виртуальному серверу закругляться.
Хотелось бы создать решение, которое не было бы привязано к текущему расположению виртуальных машин на физических серверах в кластере виртуализации. Мы с коллегами активно используем Живую Миграцию, и сегодня VM1 работает на node2, а завтра её отправят в режиме онлайн на node3.
Данное требование сразу поставило крест на использовании низкоуровневой команды qm, которая требует отдачи ей приказа на той ноде кластера, где в данный момент трудится нужная виртуальная машина. Уже показывал мощь PveSh в примерах, так как он использует API Proxmox VE и позволяет реализовать задуманное.
Прежде чем начать перезагружать сервера, стоит напомнить, что для MS Windows Server неспроста даны ценные советы по их подготовке к работе в виртуализированной среде. При попытке их выключить через веб интерфейс или в консоли, у вас будет выведен запрос, и такое поведение нужно изменить.
Windows 2008 guest best practices
Windows 2012 guest best practices
К сожалению, нажимая виртуальную кнопку питания, вы выключаете виртуальный сервер, а не перезагружаете. То есть у нас не будет restart в том смысле, что будет shutdown + start. Для работы скрипта требуется лишь наличие jq, которая есть в стандартных репозиториях Debian и Ubuntu, и она облегчает работу с JSON ответами. Работа скрипта не сложна. Вначале получаем по-данному нам VMID имя ноды, на которой трудится в данный момент эта виртуальная машина. Делаем shutdown. Далее в вечном цикле опрашиваем статус и, когда он становится stopped, то смело прерываем цикл while, и выходим на финишную прямую, запуская виртуальную машину.
#!/bin/bash
# vasilisc.com
clear
if ! [ -x "$(command -v jq)" ]; then
echo 'Error: jq is not installed.' >&2
echo "apt-get install jq"
exit 1
fi
if [ -z $1 ]; then
echo "Use "$0" VMID"
exit 1
fi
VMID=$1
NODE=`pvesh get /cluster/resources --type vm | jq --raw-output ".[] | select(.vmid == ${VMID}) | .node"`
# shutdown VM
pvesh create /nodes/${NODE}/qemu/${VMID}/status/shutdown
# get status
while true
do
STATUS=`pvesh get /nodes/${NODE}/qemu/${VMID}/status/current | jq --raw-output ".status"`
echo "NODE="${NODE}" VMID="${VMID}" is "${STATUS}
sleep 5
if [ "${STATUS}" == "stopped" ]; then
break
fi
done
# start
sleep 5
pvesh create /nodes/${NODE}/qemu/${VMID}/status/start
date
exit 0
Дата последней правки: 2023-12-27 11:36:04