Dieser Leitfaden ist für erfahrene Softwareentwickler, die Anwendungen auf OpenStack-Clouds einsetzen möchten.
Wenn Sie mit OpenStack vertraut sind, aber keine Cloud-Anwendung im Allgemeinen oder eine OpenStack-Anwendung erstellt haben, informiert Sie dieser Abschnitt darüber, wie Sie mit OpenStack-Komponenten programmieren können.
Die Bereitstellung von Anwendungen in einer Cloud-Umgebung kann sich sehr von der Bereitstellung in einer herkömmlichen IT-Umgebung unterscheiden. Dieser Leitfaden lehrt Sie, wie Sie Anwendungen auf OpenStack bereitstellen und einige bewährte Methoden für die Entwicklung von Cloud-Anwendungen.
Dieses Tutorial zeigt zwei Anwendungen. Die erste Anwendung ist ein einfacher Fraktalgenerator, der mathematische Gleichungen verwendet, um schöne `Fraktalbilder zu erzeugen <http://en.wikipedia.org/wiki/Fractal> `_. Wir zeigen Ihnen diese Anwendung in ihrer Gesamtheit, damit Sie sie mit einer zweiten, robusteren Anwendung vergleichen können.
Die zweite Anwendung ist eine OpenStack-Anwendung, die es Ihnen ermöglicht:
Erstellen und Löschen von Berechnungsressourcen. Diese Ressourcen sind virtuelle Maschineninstanzen, in denen die Fractals-Anwendung läuft.
Machen Sie Cloud-bezogene Architekturentscheidungen wie das Drehen von Funktionen in Mikro-Services und modularisieren sie.
Skalieren Sie verfügbare Ressourcen auf und ab.
Verwenden Sie Objekt- und Blockspeicher für Datei- und Datenbankpersistenz.
Verwenden Sie Orchestrierungsdienste, um sich automatisch an die Umgebung anzupassen.
Anpassung der Vernetzung für bessere Leistung und Segregation.
Entdecken und bewerben Sie erweiterte OpenStack Cloud-Funktionen.
Jeder mit einem Programmierhintergrund kann den Code in diesem Handbuch leicht lesen. Obwohl diese Anleitung auf ein bestimmtes SDK fokussiert ist, können Sie mit der OpenStack Cloud andere Sprachen und Toolkits verwenden:
Sprache |
Name |
Beschreibung |
URL |
---|---|---|---|
Python |
OpenStack SDK |
Offizielle Python-basierte Bibliothek für OpenStack. |
|
Python |
Eine Python-basierte Bibliothek, die die Apache-Stiftung verwaltet. Verwenden Sie es, um mit mehreren Cloud-Typen zu arbeiten. |
https://libcloud.readthedocs.org/en/latest/compute/drivers/openstack.html |
|
Python |
Shade |
Eine Python-basierte Bibliothek, die von OpenStack Infra entwickelt wurde. Verwenden Sie es, um mehrere OpenStack-Clouds zu betreiben. |
|
Java |
`jClouds <https://jclouds.apache.org> `_ |
Eine Java-basierte Bibliothek, die die Apache Foundation verwaltet. Verwenden Sie es, um mit mehreren Cloud-Typen zu arbeiten. |
|
Rubin |
`fog <http://fog.io/> `_ |
Ein Ruby-basiertes SDK. Verwenden Sie es, um mit mehreren Clouds zu arbeiten. |
https://github.com/fog/fog-openstack/blob/master/docs/getting_started.md |
node.js |
`pkgcloud <https://github.com/pkgcloud/pkgcloud> `_ |
Ein Node.js-basiertes SDK. Verwenden Sie es,um mit mehreren Clouds zu arbeiten. |
https://github.com/pkgcloud/pkgcloud/tree/master/docs/providers/openstack |
PHP |
`php-opencloud <http://php-opencloud.com/> `_ |
Eine PHP-basierte Bibliothek. Verwenden Sie es, um PHP-Code zu schreiben, der mit OpenStack-Clouds arbeitet. |
http://php-opencloud.readthedocs.org/de/latest/getting-started-with-openstack.html |
.NET Framework |
OpenStack SDK für Microsoft .NET |
Eine .NET-basierte Bibliothek. Verwenden Sie es, um C ++ oder C # -Code für Microsoft-Anwendungen zu schreiben. |
|
Go |
`gophercloud <https://github.com/gophercloud/gophercloud> `_ |
Ein Go-basiertes SDK. Verwenden Sie es, um Golang-Code zu schreiben, der mit OpenStack-Clouds arbeitet. |
Eine Liste der verfügbaren SDKs finden Sie unter ‚Software Development Kits‘ <https://wiki.openstack.org/wiki/SDKs> `_.
Andere Versionen dieses Handbuchs zeigen Ihnen, wie Sie die anderen SDKs und Sprachen verwenden, um diese Aufgaben abzuschließen. Wenn Sie ein Entwickler für ein anderes Toolkit sind, dass Sie diesen Leitfaden einschließen möchten, fühlen Sie sich frei, Code-Snippets einzureichen. Für weitere Informationen wenden Sie sich bitte an `OpenStack Documentation Team <https://wiki.openstack.org/Documentation> `_ Mitglieder.
Wir gehen davon aus, dass Sie bereits auf eine OpenStack Cloud zugreifen können. Sie müssen ein Projekt haben, auch bekannt als Tenant, mit einem Mindestkontingent von sechs Instanzen. Da die Fractals-Anwendung in Ubuntu-, Debian-, Fedora-basierten und openSUSE-basierten Distributionen ausgeführt wird, müssen Sie Instanzen erstellen, die eines dieser Betriebssysteme verwenden.
Um mit der Cloud zu interagieren, müssen Sie aber auch haben
`libcloud 0.15.1 oder höher installiert <https://libcloud.apache.org/getting-started.html> `_.
Erhalten Sie die folgenden Informationen von Ihrem Cloud-Anbieter:
Auth URL
Benutzername
Passwort
Projekt-ID oder Name (Projekte sind auch als Tenant bekannt)
Cloud Region
Sie können die OpenStack RC-Datei auch aus dem OpenStack Horizon Dashboard herunterladen. Melden Sie sich im Dashboard an und klicken Sie auf :guilabel: Project-> Access & Security-> API Access-> Download OpenStack RC Datei. Wenn Sie diese Methode verwenden, beachten Sie, dass die ‚auth URL‘ den Pfad nicht enthält. Zum Beispiel, wenn Ihre: Datei: openrc.sh Datei zeigt:
export OS_AUTH_URL=http://controller:5000/v2.0
Die aktuelle Auth-URL lautet:
http://controller:5000
In diesem Tutorial interagieren Sie mit Ihrer OpenStack Cloud durch das SDK, das Sie in ‚Wählen Sie Ihr OpenStack SDK‘ gewählt haben. Diese Anleitung setzt voraus, dass Sie wissen, wie Sie Code-Snippets in Ihrer Sprache der Wahl ausführen können.
Um es zu versuchen, fügen Sie den folgenden Code zu einem Python-Skript (oder verwenden Sie eine interaktive Python-Shell), indem Sie :code: python -i eingeben.
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'
provider = get_driver(Provider.OPENSTACK)
conn = provider(auth_username,
auth_password,
ex_force_auth_url=auth_url,
ex_force_auth_version='2.0_password',
ex_tenant_name=project_name,
ex_force_service_region=region_name)
Bemerkung
Weil das Tutorial das :code: conn Objekt wiederverwendet, stellen Sie sicher, dass Sie immer eins zur Hand haben.
Bemerkung
Wenn Sie den :code: `libcloud.common.types.InvalidCredsError: ‚Ungültige Anmeldeinformationen mit der Provider-Ausnahme erhalten, wenn Sie eines dieser API-Aufrufe ausführen, überprüfen Sie Ihre Anmeldeinformationen.
Bemerkung
Wenn Ihr Provider keine Regionen unterstützt, versuchen Sie einen leeren String (‚‘) für den ‚region_name`.
Um Ihre Anwendung auszuführen, müssen Sie eine Instanz starten. Diese Instanz dient als virtuelle Maschine.
Um eine Instanz zu starten, wählen Sie eine Variante und ein Abbild. Die Variante repräsentiert die Größe der Instanz, einschließlich der Anzahl der CPUs und der Menge an RAM und Speicherplatz. Ein Abbild ist eine vorbereitete OS-Installation, von der aus Sie Ihre Instanz klonen. Wenn Sie Instanzen in einer öffentlichen Cloud booten, können größere Varianten teurer sein als kleinere in Bezug auf Ressourcen und monetäre Kosten.
Um die Abbilder aufzurufen, die in Ihrer Cloud verfügbar sind, führen Sie einige API-Aufrufe aus:
images = conn.list_images()
for image in images:
print(image)
Dieser Code gibt die Ausgabe wie folgt zurück:
<NodeImage: id=2cccbea0-cea9-4f86-a3ed-065c652adda5, name=ubuntu-14.04, driver=OpenStack ...>
<NodeImage: id=f2a8dadc-7c7b-498f-996a-b5272c715e55, name=cirros-0.3.3-x86_64, driver=OpenStack ...>
Sie können auch Informationen über verfügbare Varianten erhalten:
flavors = conn.list_sizes()
for flavor in flavors:
print(flavor)
Dieser Code gibt die Ausgabe wie folgt zurück:
<OpenStackNodeSize: id=1, name=m1.tiny, ram=512, disk=1, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1, ...>
<OpenStackNodeSize: id=2, name=m1.small, ram=2048, disk=20, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1, ...>
<OpenStackNodeSize: id=3, name=m1.medium, ram=4096, disk=40, bandwidth=None, price=0.0, driver=OpenStack, vcpus=2, ...>
<OpenStackNodeSize: id=4, name=m1.large, ram=8192, disk=80, bandwidth=None, price=0.0, driver=OpenStack, vcpus=4, ...>
<OpenStackNodeSize: id=5, name=m1.xlarge, ram=16384, disk=160, bandwidth=None, price=0.0, driver=OpenStack, vcpus=8, ...>
Ihre Abbilder und Varianten werden natürlich anders sein.
Wählen Sie ein Abbild und eine Variante für Ihre Instanz. Sie benötigen ca. 1GB RAM, 1 CPU und eine 1GB Festplatte. Dieses Beispiel nutzt das Ubuntu-Abbild mit einer kleinen Variante, was eine sichere Wahl ist. In nachfolgenden Tutorialabschnitten in diesem Handbuch müssen Sie die Abbild- und Varianten-IDs entsprechend dem Abbild und der Variante ändern, die Sie gewählt haben.
Wenn das Abbild, das Sie wünschen, in Ihrer Cloud nicht verfügbar ist, können Sie in der Regel einen von den Richtlinieneinstellungen Ihrer Cloud hochladen. Informationen zum Hochladen von Abbildern finden Sie unter ‚Abbilder abrufen‘ <https://docs.openstack.org/image-guide/obtain-images.html> `_.
Setzen Sie die Abbild- und Größenvariablen auf entsprechende Werte für Ihre Cloud. Wir werden diese Variablen in späteren Abschnitten verwenden.
Zuerst fragen Sie die Verbindung nach einem bestimmten Abbild, indem Sie die ID des Abbildes verwenden, das Sie im vorherigen Abschnitt ausgewählt haben:
image_id = '2cccbea0-cea9-4f86-a3ed-065c652adda5'
image = conn.get_image(image_id)
print(image)
Dieser Code gibt die Ausgabe wie folgt zurück:
<NodeImage: id=2cccbea0-cea9-4f86-a3ed-065c652adda5, name=ubuntu-14.04, driver=OpenStack ...>
Als nächstes sagen Sie dem Skript, welche Variante Sie verwenden möchten:
flavor_id = '2'
flavor = conn.ex_get_size(flavor_id)
print(flavor)
Dieser Code gibt die Ausgabe wie folgt zurück:
<OpenStackNodeSize: id=2, name=m1.small, ram=2048, disk=20, bandwidth=None, price=0.0, driver=OpenStack, vcpus=1, ...>
Jetzt können Sie die Instanz starten.
Verwenden Sie Ihr ausgewähltes Abbild und Ihre Variante, um eine Instanz zu erstellen.
Bemerkung
Das folgende Beispiel-Erstellungsbeispiel geht davon aus, dass Sie ein Ein-Tenant-Netzwerk haben. Wenn Sie die ‚Exception: 400 Bad Request Multiple possible networks found, use a Network ID to be more specific‘ Fehlermeldung bekommen, haben Sie mehrere Tenant-Netzwerke. Sie müssen dem Aufruf, der den Server erstellt, einen ‚Netzwerk‘ -Parameter hinzufügen. Siehe :doc: /appendix für Details.
Erstellen Sie die Instanz.
Bemerkung
Ihr SDK könnte eine Instanz einen ‚Knoten‘ oder ‚Server‘ aufrufen.
instance_name = 'testing'
testing_instance = conn.create_node(name=instance_name, image=image, size=flavor)
print(testing_instance)
Dieser Code gibt die Ausgabe wie folgt zurück:
<Node: uuid=1242d56cac5bcd4c110c60d57ccdbff086515133, name=testing, state=PENDING, public_ips=[], private_ips=[], provider=OpenStack ...>
Wenn Sie vorhandene Instanzen auflisten:
instances = conn.list_nodes()
for instance in instances:
print(instance)
Die neue Instanz erscheint.
<Node: uuid=1242d56cac5bcd4c110c60d57ccdbff086515133, name=testing, state=RUNNING, public_ips=[], private_ips=[], provider=OpenStack ...>
Bevor Sie fortfahren, müssen Sie noch etwas machen.
Cloud-Ressourcen, wie z.B. Instanzen, die Sie nicht mehr verwenden, können Geld kosten. Um unerwartete Ausgaben zu vermeiden, zerstören Sie die Cloud-Ressourcen.
conn.destroy_node(testing_instance)
Wenn Sie die Instanzen erneut auflisten, verschwindet die Instanz.
Lassen Sie Ihre Shell offen, um sie für eine weitere Instanz-Installation in diesem Abschnitt zu verwenden.
Nun, da Sie wissen, wie Sie Instanzen erstellen und löschen, können Sie die Beispielanwendung bereitstellen. Die Instanz, die Sie für die Anwendung erstellen, ähnelt der ersten Instanz, die Sie erstellt haben, aber dieses Mal stellen wir Ihnen einige zusätzliche Konzepte vor.
Bemerkung
Internet-Konnektivität von Ihrer Cloud-Instanz ist erforderlich, um die Anwendung herunterzuladen.
Wenn Sie eine Instanz für die Anwendung erstellen, möchten Sie es ein bisschen mehr Informationen geben als Sie an die bloße Instanz geliefert haben, die Sie gerade erstellt und gelöscht haben. Wir werden in späteren Abschnitten näher eingehen, aber jetzt schaffen wir einfach die folgenden Ressourcen, damit Sie sie der Instanz zuführen können:
Ein Schlüsselpaar. Um auf Ihre Instanz zuzugreifen, müssen Sie einen SSH Public Key in OpenStack importieren, um ein Schlüsselpaar zu erstellen. OpenStack installiert dieses Schlüsselpaar auf der neuen Instanz. Normalerweise wird Ihr öffentlicher Schlüssel geschrieben an :code: .ssh/id_rsa.pub. Wenn Sie keine SSH-Public-Key-Datei haben, folgen Sie diesen Anweisungen <https://help.github.com/articles/generating-ssh- keys/> _ zuerst Wir werden diese Anleitung ausführlich behandeln in :doc:/introduction`.
Im folgenden Beispiel setzen Sie pub_key_file
an den Speicherort Ihrer öffentlichen SSH-Schlüsseldatei.
Bemerkung
Wenn Sie einen IOError sehen, müssen Sie ~/.ssh/
zu /home/{USERNAME}/.ssh/
ändern, indem Sie einen absoluten Pfad verwenden.
print('Checking for existing SSH key pair...')
keypair_name = 'demokey'
pub_key_file = '~/.ssh/id_rsa.pub'
keypair_exists = False
for keypair in conn.list_key_pairs():
if keypair.name == keypair_name:
keypair_exists = True
if keypair_exists:
print('Keypair ' + keypair_name + ' already exists. Skipping import.')
else:
print('adding keypair...')
conn.import_key_pair_from_file(keypair_name, pub_key_file)
for keypair in conn.list_key_pairs():
print(keypair)
<KeyPair name=demokey fingerprint=aa:bb:cc... driver=OpenStack>
Netzwerkzugang. Standardmäßig filtert OpenStack den gesamten Traffic. Sie müssen eine Sicherheitsgruppe erstellen und diese auf Ihre Instanz anwenden. Die Sicherheitsgruppe ermöglicht HTTP- und SSH-Zugriff. Wir werden ausführlicher in Einführung in die Architektur der Fraktale.
print('Checking for existing security group...')
security_group_name = 'all-in-one'
security_group_exists = False
for security_group in conn.ex_list_security_groups():
if security_group.name == security_group_name:
all_in_one_security_group = security_group
security_group_exists = True
if security_group_exists:
print('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.')
else:
all_in_one_security_group = conn.ex_create_security_group(security_group_name, 'network access for all-in-one application.')
conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 80, 80)
conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 22, 22)
for security_group in conn.ex_list_security_groups():
print(security_group)
Userdata. Während der Instanzerstellung können Sie Userdata OpenStack zur Verfügung stellen, um Instanzen nach dem Booten zu konfigurieren. Der Cloud-init-Dienst wendet die Userdata auf eine Instanz an. Sie müssen den Cloud-Init-Service auf Ihrem gewählten Abbild vorinstallieren. Wir werden ausführlicher in /introductiong.
userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''
Jetzt können Sie die Instanz booten und konfigurieren.
Verwenden Sie das Abbild, die Variante, das Schlüsselpaar und die Userdata, um eine Instanz zu erstellen. Nachdem Sie die Instanz angefordert haben, warten Sie, bis sie gebaut wird.
print('Checking for existing instance...')
instance_name = 'all-in-one'
instance_exists = False
for instance in conn.list_nodes():
if instance.name == instance_name:
testing_instance = instance
instance_exists = True
if instance_exists:
print('Instance ' + testing_instance.name + ' already exists. Skipping creation.')
else:
testing_instance = conn.create_node(name=instance_name,
image=image,
size=flavor,
ex_keyname=keypair_name,
ex_userdata=userdata,
ex_security_groups=[all_in_one_security_group])
conn.wait_until_running([testing_instance])
for instance in conn.list_nodes():
print(instance)
Wenn die Instanz startet, weist die Variable ‚ex_userdata‘ die Instanz an, die Fractals-Anwendung bereitzustellen.
Wir decken die Vernetzung im Detail ab in Vernetzung.
Um die Anwendung zu sehen, müssen Sie wissen, wo sie sie suchen. Standardmäßig verfügt Ihre Instanz über einen ausgehenden Netzwerkzugriff. Um Ihre Instanz aus dem Internet zu erreichen, benötigen Sie eine IP-Adresse. In manchen Fällen ist Ihre Instanz standardmäßig mit einer öffentlich routbaren IP-Adresse versorgt. In diesem Fall sehen Sie eine IP-Adresse, die unter public_ips oder private_ips aufgeführt ist, wenn Sie die Instanzen auflisten. Wenn nicht, müssen Sie eine Floating-IP-Adresse an Ihre Instanz erstellen und anhängen.
Um zu sehen, ob eine private IP-Adresse Ihrer Instanz zugewiesen ist:
private_ip = None
if len(testing_instance.private_ips):
private_ip = testing_instance.private_ips[0]
print('Private IP found: {}'.format(private_ip))
Wenn einer zugeordnet ist, können Benutzer diese Adresse verwenden, um auf die Instanz bei einigen OpenStack-Clouds zuzugreifen.
Um festzustellen, ob eine öffentliche IP-Adresse Ihrer Instanz zugewiesen ist:
public_ip = None
if len(testing_instance.public_ips):
public_ip = testing_instance.public_ips[0]
print('Public IP found: {}'.format(public_ip))
Wenn einer zugeordnet ist, können Benutzer diese Adresse verwenden, um auf die Instanz zuzugreifen.
So erstellen Sie eine Floating-IP-Adresse, die Sie mit Ihrer Instanz verwenden können:
Verwenden Sie :code: ex_list_floating_ip_pools () und wählen Sie den ersten floating IP-Adresspool aus. Weisen Sie diesen Pool zu Ihrem Projekt und verwenden Sie ihn, um eine Floating-IP-Adresse zu erhalten.
print('Checking for unused Floating IP...')
unused_floating_ip = None
for floating_ip in conn.ex_list_floating_ips():
if not floating_ip.node_id:
unused_floating_ip = floating_ip
break
if not unused_floating_ip and len(conn.ex_list_floating_ip_pools()):
pool = conn.ex_list_floating_ip_pools()[0]
print('Allocating new Floating IP from pool: {}'.format(pool))
unused_floating_ip = pool.create_floating_ip()
Dieser Code gibt die Floating-IP-Adresse zurück:
<OpenStack_1_1_FloatingIpAddress: id=4536ed1e-4374-4d7f-b02c-c3be2cb09b67, ip_addr=203.0.113.101, pool=<OpenStack_1_1_FloatingIpPool: name=floating001>, driver=<libcloud.compute.drivers.openstack.OpenStack_1_1_NodeDriver object at 0x1310b50>>
Attach the floating IP address to the instance:
if public_ip:
print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
elif unused_floating_ip:
conn.ex_attach_floating_ip_to_node(testing_instance, unused_floating_ip)
Führen Sie das Skript aus, um die Bereitstellung zu starten.
Das Anlegen von Anwendungsdaten und die Konfiguration an die Instanz kann einige Zeit in Anspruch nehmen. Denken Sie daran, eine Tasse Kaffee zu genießen, während Sie warten. Nachdem die Anwendung installiert ist, können Sie Ihren bevorzugten Browser verwenden, um die fantastische grafische Oberfläche unter folgendem Link zu besuchen.
actual_ip_address = None
if public_ip:
actual_ip_address = public_ip
elif unused_floating_ip:
actual_ip_address = unused_floating_ip.ip_address
elif private_ip:
actual_ip_address = private_ip
print('The Fractals app will be deployed to http://{}'.format(actual_ip_address))
Bemerkung
Wenn Sie keine Floating-IP-Adressen verwenden, ersetzen Sie gegebenenfalls eine andere IP-Adresse.
Machen Sie sich keine Sorgen, wenn Ihnen diese Konzepte noch nicht ganz klar sind. In Einführung in die Architektur der Fraktale, erforschen wir diese Konzepte genauer.
/ scaling_out: Erfahren Sie, wie Sie Ihre Anwendung skalieren können.
/ durability: Erfahren Sie, wie Sie Object Storage verwenden, um Ihre Anwendung langlebig zu machen.
Blockieren Sie Speicherplatz: Migrate the database to block storage, or use the database-as-a-service component.
: doc: / orchestration: Automatisches Orchestrieren Ihrer Applikation.
Vernetzung: Learn about complex networking.
Beratung für Entwickler, die neu in Betrieb sind: Get advice about operations.
Werde verrückt: Learn some crazy things that you might not think to do ;)
Die folgende Datei enthält den gesamten Code aus diesem Abschnitt des Tutorials. Mit diesem umfassenden Code-Beispiel können Sie den Code als einzelnes Skript anzeigen und ausführen.
Bevor Sie dieses Skript ausführen, bestätigen Sie, dass Sie Ihre Authentifizierungsinformationen, die Varianten-ID und die Image-ID festgelegt haben.
# step-1
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
auth_username = 'your_auth_username'
auth_password = 'your_auth_password'
auth_url = 'http://controller:5000'
project_name = 'your_project_name_or_id'
region_name = 'your_region_name'
provider = get_driver(Provider.OPENSTACK)
conn = provider(auth_username,
auth_password,
ex_force_auth_url=auth_url,
ex_force_auth_version='2.0_password',
ex_tenant_name=project_name,
ex_force_service_region=region_name)
# step-2
images = conn.list_images()
for image in images:
print(image)
# step-3
flavors = conn.list_sizes()
for flavor in flavors:
print(flavor)
# step-4
image_id = '2cccbea0-cea9-4f86-a3ed-065c652adda5'
image = conn.get_image(image_id)
print(image)
# step-5
flavor_id = '2'
flavor = conn.ex_get_size(flavor_id)
print(flavor)
# step-6
instance_name = 'testing'
testing_instance = conn.create_node(name=instance_name, image=image, size=flavor)
print(testing_instance)
# step-7
instances = conn.list_nodes()
for instance in instances:
print(instance)
# step-8
conn.destroy_node(testing_instance)
# step-9
print('Checking for existing SSH key pair...')
keypair_name = 'demokey'
pub_key_file = '~/.ssh/id_rsa.pub'
keypair_exists = False
for keypair in conn.list_key_pairs():
if keypair.name == keypair_name:
keypair_exists = True
if keypair_exists:
print('Keypair ' + keypair_name + ' already exists. Skipping import.')
else:
print('adding keypair...')
conn.import_key_pair_from_file(keypair_name, pub_key_file)
for keypair in conn.list_key_pairs():
print(keypair)
# step-10
print('Checking for existing security group...')
security_group_name = 'all-in-one'
security_group_exists = False
for security_group in conn.ex_list_security_groups():
if security_group.name == security_group_name:
all_in_one_security_group = security_group
security_group_exists = True
if security_group_exists:
print('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.')
else:
all_in_one_security_group = conn.ex_create_security_group(security_group_name, 'network access for all-in-one application.')
conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 80, 80)
conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 22, 22)
for security_group in conn.ex_list_security_groups():
print(security_group)
# step-11
userdata = '''#!/usr/bin/env bash
curl -L -s https://opendev.org/openstack/faafo/raw/contrib/install.sh | bash -s -- \
-i faafo -i messaging -r api -r worker -r demo
'''
# step-12
print('Checking for existing instance...')
instance_name = 'all-in-one'
instance_exists = False
for instance in conn.list_nodes():
if instance.name == instance_name:
testing_instance = instance
instance_exists = True
if instance_exists:
print('Instance ' + testing_instance.name + ' already exists. Skipping creation.')
else:
testing_instance = conn.create_node(name=instance_name,
image=image,
size=flavor,
ex_keyname=keypair_name,
ex_userdata=userdata,
ex_security_groups=[all_in_one_security_group])
conn.wait_until_running([testing_instance])
for instance in conn.list_nodes():
print(instance)
# step-13
private_ip = None
if len(testing_instance.private_ips):
private_ip = testing_instance.private_ips[0]
print('Private IP found: {}'.format(private_ip))
# step-14
public_ip = None
if len(testing_instance.public_ips):
public_ip = testing_instance.public_ips[0]
print('Public IP found: {}'.format(public_ip))
# step-15
print('Checking for unused Floating IP...')
unused_floating_ip = None
for floating_ip in conn.ex_list_floating_ips():
if not floating_ip.node_id:
unused_floating_ip = floating_ip
break
if not unused_floating_ip and len(conn.ex_list_floating_ip_pools()):
pool = conn.ex_list_floating_ip_pools()[0]
print('Allocating new Floating IP from pool: {}'.format(pool))
unused_floating_ip = pool.create_floating_ip()
# step-16
if public_ip:
print('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.')
elif unused_floating_ip:
conn.ex_attach_floating_ip_to_node(testing_instance, unused_floating_ip)
# step-17
actual_ip_address = None
if public_ip:
actual_ip_address = public_ip
elif unused_floating_ip:
actual_ip_address = unused_floating_ip.ip_address
elif private_ip:
actual_ip_address = private_ip
print('The Fractals app will be deployed to http://{}'.format(actual_ip_address))
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.