Если вы не слышали про такой проект 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