OpenVZ PHP

fabi288

New Member
Hallo,

ich versuche grade ein eigenes Panel für OpenVZ zuschreiben, leider kann ich nicht bei PHP vzctl aufrufen obwohl die rechte existieren. Jetzt meine Frage würde euch eine Möglichkeit einfallen wie man sowas umsetzen kann?

Ich dachte an einen Cronjob der dann ausgeführt wird. Aber da würde es wahrscheinlich wieder Probleme geben. Danke im Voraus.

Mit freundlichen Grüßen
Fabian Hars
 
Hallo Fabian,

das was du suchst ist die SSH2 Extension für PHP, damit kannst du einem User am Hostsystem die entsprechend benötigten Rechte geben und dich direkt verbinden und die Befehle ausführen. Wobei die Frage ist, ob es mit Cronjobs die sich der OpenVZ Node abholt, nicht sinniger ist da du sonst jedes Passwort bzw einen Key speichern musst.

Setz doch mal den stream in php auf blocking und und mach dann ein var_dump();

Gruß
 
Hallo,

SSH2 Extension ist das Zauberwort.
Ich habe es so gelöst.

Per PHP lasse ich die Befehle in eine SQL Tabelle schreiben. Im Grunde brauchst du da nur den Befehl (start/stop, etc) und die VIED.
Dafür reicht eine Normale PHP Anwendung ohne SSH2 Extension.

Anschliessend lässt du einen cron auführen der jede Minute eine PHP Datei im root Ordner deines Server aufruft. Dieses Script liest die Daten aus der Datenbank und führt die Befehle alle nach und nach aus (SSH2 Extension). Da dieses in einem foreach passiert kannst du nach dem Ausführen direkt den Entsprechenden Eintrag aus der Datenbank löschen.

Problematisch wird es da bei der Neuinstallation und falls du VM's auf weiteren Servern Steuern willst.
 
Herzlichen Dank

ich wollte kein SSH2 benutzen weil ich dann unsicher Passwörter speichern muss.

Habe folgendes.

Auf dem Cotroll System habe ich bei MYsql eine neue Tabelle angelegt:

ID | NodeID | Befehl

und auf dem Node läuft ein PHP Script:

PHP:
<?php

$nodeID = '1';

$starttime = time();

mysql_connect('', '', '') or die(mysql_error());
mysql_select_db('') or die(mysql_error());

while(0==0) {

        $query = mysql_query('SELECT * FROM `node_exec` WHERE `node_id` = "' . $nodeID . '"');
        while($row = mysql_fetch_array($query)) {

			$output = shell_exec($row['comand']);
			echo $output;

			mysql_query('DELETE FROM `node_exec` WHERE id = "' . $row['id'] . '"');

        }

        echo "ok \n";

        if((time() - $starttime) > 60) exit();
        sleep(10);

}

?>

Somit kann ich Zeitnah die Befehle ausführen, jede Minute wird das Script dann für 60 sek gestartet.
 
Sinnvoller ist es du hast einen Server am laufen worauf das Panel läuft und welcher auch die Kommandos über SSH an die jeweiligen Nodes verschickt, sowas ähnliches habe ich vor einiger Zeit programmiert, läuft auch super.

Das geht z.b. mit

Code:
<?php

exec('ssh -i /hosts/PRIVATEKEYFILE [email]infra@nodexyz.mydomain.de[/email] "sudo vzctl start '.$VM['veid'].'"');

?>
 
Last edited by a moderator:
Die frage aber ist es sicher?
bzw. was ist sicherer?

Ich muss ja bei SSH das Passwort oder die Keyfile abspeichern auf den Host und PHP / Apache braucht ja drauf Rechte.
 
Achtung Achtung Achtung

Bei PHP-Scripts mit exec, shell_exec ist GRÖSSTE Vorsicht geboten. Sobald der User eine Variabel setzen kann (GET,POST), die im exec-String vorkommt, kann er selber Befehle ausführen, so ala ;ifconfig oder ||ifconfig oder &&ifconfig. Darum sollte zB für die VEID mit in_array überprüft werden, ob die VEID auch wirklich in der DB ist (DB erst in Array laden). Kommt dann einer mit ifconfig, ist das nicht der Fall.

Das war jetzt nur ein Beispiel, kann man natürlich noch optimieren.
 
Das Stückchen Code ist ja auch nicht für Userinteraktionen gedacht sondern lediglich als background script welches die Befehle aus einer DB bekommt.
 
Ich hab auch gesagt, NUR wenn der User selber variabeln definieren kann. Hab nur darauf hingewiesen, da es Leute geben soll, die das nicht wissen.
 
Bei meinen Script kann der USer auch nichts mit GET oder POST setzen

der User sagt im Controll Panel

&vid=100&action=reboot

darauf hin wird geprüft ob die vid auch sein VServer ist wenn ja wird dann in die Datenbank geschrieben.

vzctl restart 100

Also sollte es ja sicher sein. Wenn vorher überprüft wird ob die VID auch wirklich ihn gehört.
 
Wenn eine Überprüfung stattfindet, sollte alles OK sein. Den Zugriff über das Keyfile kannst du mit einer htaccess verbieten, oder du legst das Keyfile in einen Ordner ausserhalb des docroots.
 
Das ist mit sudo, openssh client und ein paar Befehlen kein Problem ;)

Genau, das heisst, Stoppen, Löschen, neu anlegen, ip zuweisen etc
Soweit ich weiss ist ein Neuinstallieren alla vzctl reinstall (dies nur als bsp) 100 nicht möglich
 
Code:
//First at all, destroy vm
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl stop '.$VM['veid'].'"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl destroy '.$VM['veid'].'"');
//Then create and install it
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl create '.$VM['veid'].' --ostemplate '.$TPL['file'].' --config '.$VZPROD['cfgfile'].'"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl set '.$VM['veid'].' --ipadd '.$IP4['ip'].' --save"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl set '.$VM['veid'].' --hostname v'.$VM['veid'].'.cw-core.net --save"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl set '.$VM['veid'].' --nameserver '.$VH['nameserver'].' --save"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl set '.$VM['veid'].' --diskspace '.$VZPROD['diskspace'].'G:'.$VZPROD['diskspace'].'G --save"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl start '.$VM['veid'].'"');
exec('sudo ssh -i /home/key/'.$VH['sshkey'].' infradm@'.$VH['hostname'].' "sudo vzctl set '.$VM['veid'].' --userpasswd root:'.$ROOTPASSWD.'"');

So sieht der Spaß bei mir aus, ein vzctl reinstall gibt es natürlich nicht (habe deine Frage missverstanden), die VM muss zuerst gelöscht und mit einem neuen template neu angelegt werden.
 
ah ok.
dann muss ich nur noch schauen wie ich mich vom Server wo die daten in die DB geschrieben werden auf andere Server sicher einloggen kann sprich auf kunden loslassen kann

in dem Fall bedeuten Kunden = Bekannte
 
Last edited by a moderator:
So ich bin mal so nett und Poste mal mein Bash Code zum Reinstall oder Neuanlegen einer VM

addvserver AKTION VID IP TEMPLATE HOSTNAME RAM HDD ROTTPASS

AKTION: 1 = NEU
2 = Reinstall

Beispiel:
Code:
addvserver 2 500 8.8.8.8 debian-6.0-amd64-minimal neu.neu 128 5 123

Hier wird ein VServer mit der ID 500 neuinstalliert.
IP: 8.8.8.8
Template: debian 6
Hostname neu.neu
Arbeitsspeicher: 128mb
HDD: 5GB
Rootpasswort: 123


Das Script in /bin legen:

Code:
#!/bin/bash
# declare STRING variable

echo "####################################"
echo "####  VSERVER FABIAN HARS ADD   ####"
echo "####  VERSION 0.1               ####"
echo "####################################"
echo ""

if [ $1 -eq 2 ] ; then
        echo "Alten VSERVERoeschen ..."
        vzctl stop $2
        vzctl destroy $2
        echo "... OK"
fi

echo "Erstellen des VServers ..."
vzctl create $2 --ostemplate $4
echo "... OK"

echo ""
echo "Setzen der IP Adresse ..."
vzctl set $2 --ipadd $3 --save
echo "... OK"

echo ""
echo "Setzen von Hostname und dns"
vzctl set $2 --hostname $5 --save
vzctl set $2 --nameserver NAMENSERVER --save
vzctl set $2 --nameserver NAMENSERVER --save
vzctl set $2 --nameserver NAMENSERVER --save
echo "... OK"

echo ""
echo "Setzen von Festplatte, CPU, Swap"
vzctl set $2 --capability sys_time:on --save
MEM="$6M"
HDD="$7G"
vzctl set $2 --vmguarpages $MEM --save
vzctl set $2 --oomguarpages $MEM --save
vzctl set $2 --privvmpages $MEM:$MEM --save
vzctl set $2 --swappages 0:$MEM --save
vzctl set $2 --onboot yes --save
vzctl set $2 --diskspace $HDD:$HDD --save
vzctl set $2 --userpasswd root:$8
echo "... OK"
 
Hallo,

Ich habe das Script nun angelegt und mit diesem Befehl die VM neu angelegt

addvserver 1 500 8.8.8.8 debian-6.0-amd64-minimal neu.neu 128 5 123

nun erhällt die VM nicht 128MB Ram sondern 128 SWAP speicher?

./addvserver 1 500 8.8.8.8 debian-6.0-amd64-minimal-mini s1.domain.de 128 5 passwort

Code:
root@s1:~# free -m
             total       used       free     shared    buffers     cached
Mem:           312         34        277          0          0          0
-/+ buffers/cache:         34        277
Swap:          128          0        128
 
Last edited by a moderator:
Back
Top