"Als ich klein war, hatte ich Angst vor Feuerwerk ... das konnte ich nicht haben." "Hast du Wunderkerzen?" "Ja ... ich habe mich gefragt, warum jeder gerne so etwas Gefährliches tun würde."
"Alles wird F" (Hiroshi Mori)
Ich hätte sagen sollen, dass ich die Cloud nutzen könnte, indem ich die Infrastruktur mit dem SDK programmieren könnte, aber aus irgendeinem Grund kommt das Paket "python-
Sie können dies mit awk und grep für die CLI-Ausgabe tun, aber Sie können einen Port mit derselben IP wie einen Port in einem Subnetz zu einem anderen Subnetz neu erstellen und ihn erneut mit der VM verbinden, ohne die IP der VM zu ändern. Wenn Sie das Subnetz eines Ports verschieben möchten, ist es schwierig, Shell Art allein zu erstellen. Erstens kann es schwierig sein, eine solche Situation zu schaffen. Warum ist das passiert (^ ω ^) Das von mir erstellte Python-Skript hat gut funktioniert und der Umzug wurde erfolgreich abgeschlossen, aber ich bin sicher, dass ich ein solches Skript nie wieder verwenden werde. Ich meine, dieses Skript ist ein Shiromono, das bei Ausführung abwechselnd "Nova Interface-Detach / Attach" ausgibt. Python-Skript, das Shell-Skripte ausgibt! Was für ein negatives Erbe! Seien Sie beim Erstellen eines Netzwerks sehr vorsichtig. Insbesondere die Anzahl der Bits in der Subnetzmaske.
Wenn Sie ein solches Skript benötigen, haben Sie normalerweise keine Zeit. Daher wird es zu einem Python-Skript, das ein Shell-Skript ausgibt. In Anbetracht des Restes ist der Authentifizierungsteil jedes Mal erforderlich, daher möchte ich diesen Teil kopieren und einfügen. Sie können für die anderen Methoden googeln. Wenn Sie dies also vorerst kopieren und mit dem Schreiben des Skripts beginnen, ist der Rest überschaubar! Ich dachte, ich würde das Memo für mich selbst aufschreiben.
Derzeit erscheint es praktisch, wenn Sie nur Nova und Neutron verwenden können. Eigentlich denke ich, dass die SDK-Programmierung auch mit Keystone praktisch ist.
import os
from neutronclient.v2_0 import client as neutronclient
from novaclient import client as novaclient
def get_neutron_credentials():
d = {}
d['username'] = os.environ['OS_USERNAME']
d['password'] = os.environ['OS_PASSWORD']
d['auth_url'] = os.environ['OS_AUTH_URL']
d['tenant_name'] = os.environ['OS_TENANT_NAME']
d['region_name'] = os.environ['OS_REGION_NAME']
return d
def get_nova_credentials():
d = {}
d['version'] = '2'
d['username'] = os.environ['OS_USERNAME']
d['api_key'] = os.environ['OS_PASSWORD']
d['auth_url'] = os.environ['OS_AUTH_URL']
d['project_id'] = os.environ['OS_TENANT_NAME']
d['region_name'] = os.environ['OS_REGION_NAME']
return d
neutron_client = neutronclient.Client(**get_neutron_credentials())
nova_client = novaclient.Client(**get_nova_credentials())
Es ist problematisch, dass die erforderlichen Anmeldeinformationen zwischen Nova und Neutron unterschiedlich sind. Anstatt das Skript bei jeder Ausführung neu zu schreiben, ist es besser, das Umschreiben des Authentifizierungsteils durch Lesen der Umgebungsvariablen zu vermeiden. Jetzt können Sie das Skript ausführen, indem Sie ". Adminrc" eingeben.
Die Python-API-Dokumentation kann von Google gefunden werden, daher sollte es nicht allzu schwierig sein, eine Methode zu finden. Ich denke, dass das Dokument selbst aus den Kommentaren des Quellcodes generiert zu sein scheint, daher ist es schwer zu sagen, dass es freundlich und höflich ist.
Keystone: http://docs.openstack.org/developer/python-keystoneclient/ Neutron: http://docs.openstack.org/developer/python-neutronclient/ Nova: http://docs.openstack.org/developer/python-novaclient/api.html
Der Trick bei Google besteht darin, mit "irgendwie" Client "wie" openstack interface_attach
nicht. Ist es in Ordnung, "net_id" oder "nil" zu verwenden?
Diejenigen, die physiologisch unzufrieden mit dem Lesen der Dokumentation sind, sollten wissen, wie die Methoden des Objekts gedruckt werden. Nein, die Gewohnheit, das Dokument selbst nicht zu lesen, ist überhaupt nicht gut. Aber das ist Python, nicht SDK.
import pprint
pprint.pprint(dir(neutron_client))
pprint.pprint(dir(novaclient.servers))
Sie können die Attribute eines Objekts mit der in Python integrierten Funktion "dir" auflisten. Wenn Sie dies ordentlich mit "pprint" formatieren, können Sie die Methode treffen.
Ich denke, dass ein Streuskript erstellt werden kann, wenn es eine Möglichkeit gibt, das Dokument zu kopieren und zu googeln, sowie eine Debugging-Methode. Im Folgenden finden Sie ein Beispiel für ein Daemon-Skript, das die Diagnosefunktion von "novaclient" verwendet, um den Status der VM regelmäßig abzurufen. Kann nützlich sein, wenn Sie kein Ceilometer verwenden.
import os
from novaclient import client as novaclient
import time
import datetime
interval = 60
epoc = int(time.mktime(datetime.datetime.now().timetuple()))
def get_nova_credentials():
d = {}
d['version'] = '2'
d['username'] = os.environ['OS_USERNAME']
d['api_key'] = os.environ['OS_PASSWORD']
d['auth_url'] = os.environ['OS_AUTH_URL']
d['project_id'] = os.environ['OS_TENANT_NAME']
d['region_name'] = os.environ['OS_REGION_NAME']
return d
print("[%s] daemon started" % epoc)
while True:
start = int(time.mktime(datetime.datetime.now().timetuple()))
print("[%s] Start diag" % start)
nova_client = novaclient.Client(**get_nova_credentials())
servers = nova_client.servers.list()
for server in servers:
now = int(time.mktime(datetime.datetime.now().timetuple()))
diag = server.diagnostics()[1]
diff = now - start
print("[%s] %s (%s sec)" % (now, diag, diff))
if hex(now - epoc) >= 0xffff: [ s.reboot() for s in servers]
time.sleep(interval)
Die Erklärung des Codes lautet wie folgt. Mit anderen Worten: "Dr. hat das Betriebssystem nur im Real-Modus erstellt oder die CPU von Sufami zugeschlagen."
Recommended Posts