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/
и получаем примерно следующее:
libvirt-php

Теперь мы можем управлять виртуальными машиными через WEB. Думаю излишне писать, что доступ в папку manage надо сделать по паролю, проще всего это сделать средствами апача.

За подготовку скрипта отдельное спасибо Алексу.

Удачи в настройках.
© shadow_alone

2 комментария

  1. ITD27M01:

    Скажите, принципиально веб-сервер может же работать на свосем другой машине, нежели гипервизор, верно? За соединение вот эта строчка отвечает $res3=libvirt_connect так?

  2. andrey0001:

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

Leave a Reply

You must be logged in to post a comment.