11 Dez 2009

Ruby xen-Api howto

Author: Heiko | Filed under: Ruby

Für Phyton, Perl gibt es Bindings für die Xen-Api. Wer allerdings andere Sprachen verwenden möchte wie Ruby, hat erst einmal schlechte Karten. Denn das heißt im Regelfall die schlecht dokumentierte Api zu verstehen.

Für die Xen-Versionen <3.0.4 kann man sich das Gem “ruby-xen” ansehen. Dieses greift allerdings nicht auf die API zu, sondern händelt die Steuerung von Xen über die Xen-Tools auf der Kommandozeile und parst lediglich die Ausgabe.
Libvirt bietet auch ein ruby-Binding an, das aber nicht in den Paketquellen enthalten ist und von Hand kompeliert werden muss.

Ich wollte allerdings die Xen-Api verwenden. Hierzu zeige ich ein einfaches Beispiel, wie man mit der API kommuniziert.

Als erstes müssen in Xen ein paar Einstellungen getätigt werden.
Hierzu öffnen wir /etc/xen/xend-config.sxp
Dort suchen wird als erstes direkt am Anfang der Konfigurationsfile die Logfile definiert und den loglevel eingestellt.

(logfile /var/log/xen/xend.log)
(loglevel DEBUG)

Diese Einstellung kann man natürlich ignorieren, wenn man etwas sicherer mit dem Umgang mit der API ist. Falls dies nicht der Fall ist, empfehle ich den Loglevel so tief anzusetzen.
Nun muss der Xen-Api-Server aktiviert werden

(xen-api-server ((9363 pam ‘^localhost$ ‘)))

der Port ist natürlich variable nach localhost kann man auch noch andere IP’s oder Domains angeben die auf den API-Server Zugriff haben.
Danach muss der xend neu gestartet werden.
Jetzt kann man sich eine Testfile erstellen

vim xen-api.rb

Da wie schon erwähnt Ruby keine Xen-Bindings besitzt, muss die API über die Lib XMLRPC angesprochen werden.
Wir öffnen nun eine Verbindung zu dem Api-Server

#!/usr/bin/env ruby

require 'xmlrpc/client'

client = XMLRPC::Client.new('localhost',nil,9363)

Wie zu sehen ist, sind die Parameter

  • localhost => Server
  • nil => Pfad zum Socket (falls verwendet)
  • 9363 => Port
  • Nun wird die erste Session erzeugt. Diese wird erst erstellt wenn ein erfolgreicher Login stattgefunden hat.

    session = client.call("session.login_with_password","username","password")
    

    Achtung!!!
    Das Login erfolgt über das pam Modul, es muss also ein Systemuser angelegt sein. Via root ist es nicht möglich einzuloggen

    Wenn wir uns erfolgreich eingeloggt haben bekommen wir eine Hash zurück die in etwas so aussehen sollte.

    {“Status”=>”Success”, “Value”=>”25d9b202-1ac4-572a-54d1-19d9e0a88810″}

    als nächster Schritt muss eine Hostreferenz erstellt werden (HostObject)

    host_ref = client.call("session.get_this_host",session["Value"], session["Value"])
    

    Ab diesem Zeitpunkt kann man alle API Functions nutzen die man möchte. Man hat nun die Session und die benötigte Host-Referenz.

    Beispiel:
    Auflisten aller VM’s

    vms = client.call("host.get_resident_VMs",session["Value"],host_ref["Value"])
    vms["Value"].each {|vm|
    
    vm_name = client.call("VM.get_name_label",session["Value"],vm)
    
    puts vm_name["Value"]
    }
    

    Die einzelnen Functions lassen sich aus der Xen-APIDoc auslesen.

    Tags: , , ,

    Leave a Reply