libvirt-php — простое управление VPS
Если Вам понадобилось сделать простое управления виртуальными машинами на libvirt (KVM, XEN), с возможностью остановить/перезагрузить/стартовать машину через WEB, можно использовать libvirt-php. Для этого нам понадобиться php 5.2 и выше, веб-сервер и несколько строк скрипта.
Для начала установим libvirt-php, для этого скачаем и поставим репозиторий remi отсюда — http://rpms.famillecollet.com/enterprise/5/ или http://rpms.famillecollet.com/enterprise/6/ , в зависимости от версии CentOS.
# rpm -Uvh remi-release*rpm
# yum --enablerepo=remi install php-libvirt
после это нам надо поменять настройки libvirtd на основной машине:
в /etc/sysconfig/libvirtd раскомментируем
LIBVIRTD_ARGS="--listen"
в /etc/libvirt/libvirtd.conf произведем следующие правки
listen_tls = 0
listen_tcp = 1
listen_addr = "127.0.0.1"
auth_tcp = "sasl"
Добавим юзера username с паролем password (его надо будет прописать в скрипте)
# saslpasswd2 -a libvirt username
Убедимся что юзер добавился
# sasldblistusers2 -f /etc/libvirt/passwd.db
Рестартим libvirtd
# /etc/init.d/libvirtd restart
Подразумеваем что связка apache и php уже настроена и работает.
Создаем следуюший скрипт в /var/www/html/manage/index.php
<?php
$states=Array("NoState","Running","Blocked","Paused","Shutdown","Shutoff");
$results=Array("None","OK");
$res3=libvirt_connect("qemu+tcp:///system",false,Array(VIR_CRED_AUTHNAME=>"username",VIR_CRED_PASSPHRASE=>"password"));
print_r($res3); printf ("\n<br>");
$action = intval($_GET[action]);
if ($action == 0)
{
print_r(libvirt_connect_get_hostname($res3));
printf ("\n<br>\n<br>");
$domains=libvirt_list_domains($res3);
foreach ($domains as $dom)
{
$dom1=libvirt_domain_lookup_by_name($res3, $dom);
echo ("Name:\t<b>".libvirt_domain_get_name($dom1).'</b> <a href="?action=1&virtname=' . libvirt_domain_get_name($dom1) . '"> [Destroy(Hard)] </a> | <a href="?action=2&virtname=' . libvirt_domain_get_name($dom1) . '"> [Create(start)] </a> | <a href="?action=3&virtname=' . libvirt_domain_get_name($dom1) . '"> [Shutdown(ACPI)] </a> | <a href="?action=4&virtname=' . libvirt_domain_get_name($dom1) . '"> [Reset(Hard)] </a><br>' . "\n");
echo("UUID:\t".libvirt_domain_get_uuid_string($dom1)."<br>\n");
echo("ID:\t".libvirt_domain_get_id($dom1)."<br>\n");
$dominfo=libvirt_domain_get_info($dom1);
print_r("Memory: ".$dominfo[memory]."<br>\n"."State: <b>".$states[$dominfo[state]]."</b><br>\n"."cpuUsed: ".$dominfo[cpuUsed]."<br>\n");
echo "<br><br>\n";
}
exit;
}
$virtname = $_GET[virtname];
$dom=libvirt_domain_lookup_by_name($res3, $virtname);
if ($action == 1)
{
// libvirt_domain_shutdown
$domain=libvirt_domain_destroy($dom);
print_r("Domain destroying - ".$results[$domain]."\n<br>");
}
if ($action == 2)
{
$domain=libvirt_domain_create($dom);
print_r("Domain starting - ".$results[$domain]."\n<br>");
}
if ($action == 3)
{
$domain=libvirt_domain_shutdown($dom);
print_r("Domain shutting down - ".$results[$domain]."\n<br>");
}
if ($action == 4)
{
$domain=libvirt_domain_destroy($dom);
print_r("Domain destroying down - ".$results[$domain]."\n<br>");
$domain=libvirt_domain_create($dom);
print_r("Domain starting - ".$results[$domain]."\n<br>");
}
echo '<br><br><a href=?>Return</a>';
?>
переходим в браузере на http://ваш_сервер/manage/
и получаем примерно следующее:
Теперь мы можем управлять виртуальными машиными через WEB. Думаю излишне писать, что доступ в папку manage надо сделать по паролю, проще всего это сделать средствами апача.
За подготовку скрипта отдельное спасибо Алексу.
Удачи в настройках.
© shadow_alone
Скажите, принципиально веб-сервер может же работать на свосем другой машине, нежели гипервизор, верно? За соединение вот эта строчка отвечает $res3=libvirt_connect так?
Ну да. обычное соединение к гипервизору, тоже самое, если мы коннектимся с помощью virsh — главное чтоб на самом гипервизоре было разрешение на коннект из-вне