Debian.pro

Блог для пользователей и администраторов Debian


Debian, KVM. Поворачиваем KVM лицом к клиентам или ответ на вопрос пользователя вашего VDS «а что делать, если он зависнет???!!!»

Все мы знаем, что для KVM нет веб-панелей, которые позволяют вашим клиентам перезагружать свои ВДСки, запускать их, если она вдруг почему то выключится и так далее. Точнее, есть proxmox, но есть много но.

Я с вами поделюсь одним из своих секретов. После выполнения скрипта, который написан ниже ваши пользователи смогут зайдя на сервер (на котором запущена вдска) по ssh перезагрузить, остановить или запустить свой vds. Способ кстати подходит и для Xen, если вы используете xen+libvirtd.

Что мы получаем. Условно мы имеем, что у пользователя есть виртуальный сервер на KVM с именем vds1. После выполнения скрипта мы получаем файлы:
/usr/bin/menu_vds1
/usr/bin/reboot_vds1
/usr/bin/start_vds1
/usr/bin/stop_vds1

Последние 3 файла для запуска потребуют права рута. Первый файл — как можно догадаться — предназначен для создания меню. В принципе, сама менюшка не нужна как таковая. Но я её использую для того, чтобы не предоставлять пользователям доступа на сам сервер. Просто я указываю /usr/bin/menu_vds1 в качестве шелла для пользователя в файле /etc/passwd. Пользователь не может выполнить на сервере ничего, кроме последних трех команд.
Например, vds23:x:1009:1009:,,,:/home/vds23:/bin/bash нужно заменить на vds23:x:1009:1009:,,,:/home/vds23:/usr/bin/menu_vds23 для того, чтобы пользователь vds23 не мог ничего сделать, кроме того, что написано в файле menu_vds32.

Файлы stop, reboot, start выполнять пользователю мы разрешим через sudo (файл /etc/sudoers). Само собой, у вас должен быть установлен sudo и виртуалки должны работать от рута. Скрипт сам запишет всё нужное в данный файл.
Если у вас нет sudo, то:
root@kvm-server:~$ aptitude install sudo

Установим скрипт:
root@kvm-server:~$ wget -O /usr/bin/addvdscontrol http://debian.pro/files/scripts/addvdscontrol
root@kvm-server:~$ chmod +x /usr/bin/addvdscontrol

Теперь мы можем использовать команду addvdscontrol для добавления возможности управлять вдской пользователю по ssh. Так как скрипт будет создавать пользователя, имя которого совпадает с vds, то название vds (под которым vdsку знает virsh, само собой) должно обязательно начинаться с латинской буквы и содержать в названии только латинские буквы в нижнем регистре и цифры. Например, vds1 — правильно, а 1vds или Vds1 — неправильно. Учитывайте это при создании vds.

Скрипт создаст всё необходимо, кроме соответствующих исправлений в /etc/passwd
Root или пользователь, имя которого совпадает с именем vds (vds1 в нашем случае) может использовать команды:
root@kvm-server:~$ sudo reboot_vds1
root@kvm-server:~$ sudo stop_vds1
root@kvm-server:~$ sudo start_vds1
(руту писать sudo не нужно)
Либо запустить команду
root@kvm-server:~$ sudo menu_vds1
чтобы попасть в меню управления сервера. Если пользователю указать в качестве шелла menu_vds1, то после того, как он авторизуется по ssh он будет сразу попадать в меню и будет выходить сразу после первой команды (спрашивать о выходе его никто не будет).

Для добавления возможности управлять вдской необходимо выполнить команду:
root@kvm-server:~$ addvdscontrol vdsname
например,
root@kvm-server:~$ addvdscontrol vds1

После этого пользователь vds1 сможет зайти по ssh на сервер kvm-server и перезапустить свой VDS. Или выключить. Или включить. Развлекайтесь.

Ну и текст скрипта для тех, кто понял мою сумбурную речь выше и хочет что-то изменить.

#!/bin/bash
echo "Спасибо [Raiden] и mva с irc://freenode.net/#ubuntu-ru за помощь в написании скрипта."
echo "Идея скрипта - inkvizitor68sl"
echo "При публикации скрипт обязательна ссылка на сайт http://debian.pro"
s=$1
echo $s
echo "echo \"Вы попали в меню управления виртуальным сервером $server\"" > /usr/bin/menu_$s
echo "echo \"Данное меню предоставляет следующие возможности:\"" >> /usr/bin/menu_$s
echo "echo \"reboot | stop | start\"" >> /usr/bin/menu_$s
echo "echo \"для задействования возможности - введите название действия.\"" >> /usr/bin/menu_$s
echo "echo \"для выхода - наберите любую другую команду\"" >> /usr/bin/menu_$s
echo "echo \" \"" >> /usr/bin/menu_$s
echo "read A" >> /usr/bin/menu_$s
echo "reboot=\"sudo /usr/bin/reboot_$s\"" >> /usr/bin/menu_$s
echo "start=\"sudo /usr/bin/start_$s\"" >> /usr/bin/menu_$s
echo "stop=\"sudo /usr/bin/stop_$s\"" >> /usr/bin/menu_$s
echo "wrong=\"exit\"" >> /usr/bin/menu_$s
echo "case \"\$A\" in" >> /usr/bin/menu_$s
echo "\"reboot\") exec \$reboot;;" >> /usr/bin/menu_$s
echo "\"start\" ) exec \$start;;" >> /usr/bin/menu_$s
echo "\"stop\" ) exec \$stop;;" >> /usr/bin/menu_$s
echo "* ) exec \$wrong;;" >> /usr/bin/menu_$s
echo "esac" >> /usr/bin/menu_$s
echo "virsh destroy $s" > /usr/bin/reboot_$s
echo "sleep 10" >> /usr/bin/reboot_$s
echo "virsh start $s" >> /usr/bin/reboot_$s
echo "$s rebooted, good bye" >> /usr/bin/reboot_$s
echo "virsh destroy $s" > /usr/bin/stop_$s
echo "$s stopped, good bye" >> /usr/bin/stop_$s
echo "virsh start $s" > /usr/bin/start_$s
echo "$s started, good bye" >> /usr/bin/start_$s
chmod +x /usr/bin/menu_$s
chmod +x /usr/bin/reboot_$s
chmod +x /usr/bin/stop_$s
chmod +x /usr/bin/start_$s
echo "$s ALL=NOPASSWD: /usr/bin/reboot_$s" >> /etc/sudoers
echo "$s ALL=NOPASSWD: /usr/bin/reboot_$s" >> /etc/sudoers
echo "$s ALL=NOPASSWD: /usr/bin/reboot_$s" >> /etc/sudoers
echo "Добавляем пользователя $s"
adduser $s
echo "Пользователь $s теперь может выполнять команды sudo reboot_$s, sudo stop_$s и sudo start_$s"
echo "Если вы желаете ограничить пользователя $s на сервере, чтобы он не мог ничего, кроме управления своей vds $s, то в файле /etc/passwd в строке для пользователя $s замените /bin/bash на /usr/bin/menu_$s"


Комментарии (5):

  1. dxd :

    было бы правильно по максимум ограничить вход на ноду. ну а возможность рестарта реализовать как-нибудь иначе. например, простенький перл-скрипт с таким меню. ресурсов это будет потреблять минимум, поэтому их можно не учитывать в итоге.

  2. dxd :

    *выше имел ввиду сделать веб-морду на перле :)

  3. Веб морду-то зачем)
    У меня сейчас скрипт есть попроще, как руки дойдут — напишу про него.

  4. Алексей :

    Задумка интересная, но вот незадача — при подключении по SSH, клиента «выбрасывает» из консоли (она закрывается) и ничего не выполняется.
    Как пофиксить?

  5. Показывайте, что там написали.
    Выполняться рестарт должен, а консоль закрываться так и должна.

Написать комментарий