Digital Ocean ist einer der am schnellsten wachsenden Web-Hosts, was teilweise auf die schnellen SSD-basierten Server und die günstigen 5-Dollar-Hosting-Angebote zurückzuführen ist. Das Starten von Instanzen auf Digital Ocean zum Testen oder zum langfristigen Gebrauch ist schnell, einfach und kostengünstig.
Beim Erstellen eines App-Images für den Wiederverkauf bei Digital Ocean habe ich Ihnen gezeigt, wie Sie eine WordPress-Instanz (oder eine andere App) -Instanz starten und für Kunden wiederholt klonen. In diesem Lernprogramm werde ich Sie durch die Verwendung der Digital Ocean API führen, um unsere Instanzen (auch als Droplets bezeichnet) programmgesteuert zu verwalten, und um allgemeine Aufgaben zu automatisieren. Ich werde auch eine Beispiel-Codebasis für die Ausführung sehr einfacher API-Operationen bereitstellen, die im Yii Framework für PHP geschrieben sind. Den Code erhalten Sie hier bei Github.
Mit der Digital-Ocean-API können Sie Droplets und Ressourcen auf einfache, programmatische Weise mithilfe von HTTP-Anforderungen verwalten. Alle Funktionen, die Sie im Bedienfeld von Digital Ocean kennen, sind auch über die API verfügbar, sodass Sie die komplexen Aktionen ausführen können, die Ihre Situation erfordert.
Für dieses Lernprogramm integrieren wir die Digital Ocean V2 PHP API-Bibliothek von Entwickler Antoine Corcy in eine Yii-basierte Konsolenanwendung. Sie benötigen keine Kenntnisse von Yii, um die Anwendung zu verwenden, aber Sie können hier mehr darüber erfahren: Einführung in das Yii Framework.
Die Digital Ocean API authentifiziert Ihr Konto über OAuth und besteht aus einem Dutzend hochrangiger Bereiche:
Nun, da Sie ein wenig über die API wissen, lassen Sie uns mit unserer eigenen Anwendung eintauchen.
Um die API verwenden zu können, müssen Sie persönliche Zugriffstoken für Ihr Konto aktivieren. Melden Sie sich bei Ihrem Konto an und rufen Sie die Seite mit den Einstellungen auf: https://cloud.digitalocean.com/settings/applications. Klicken Neues Token generieren, Wie nachfolgend dargestellt:
Notieren Sie sich Ihr Zugangstoken unter -Digital Ocean zeigt es Ihnen nur einmal:
Nun kommen wir zu unserer Beispielkonsolenanwendung.
In diesem Lernprogramm werden wir eine kleine Konsolenanwendung erkunden, die ich erstellt habe und die einige Aufgaben im Zusammenhang mit der Verwaltung von Droplets erfüllt. Sie können die Anwendung selbst über das Tuts + GitHub-Repository installieren und anpassen oder erweitern, um weitere gewünschte API-Funktionen zu implementieren. Ich habe eine ausführliche Installationsanleitung für die Konsolenanwendung auf meiner Website veröffentlicht. Sie können auch meine generische Installationsanleitung für Digital Ocean-Apps erkunden.
Auch hier verwenden wir die Digital Ocean V2 PHP API-Bibliothek von Antoine Corcy, um auf die API zuzugreifen.
Wir haben eine Komponente namens Ocean.php erstellt, die als Modell für die Verwendung seiner Bibliothek dient. Es ist bei /app/protected/components/Ocean.php
.
Yii lädt Ihr Zugriffstoken aus der Ocean.ini-Datei, die im Installationshandbuch zur Digital Ocean Console-Anwendung beschrieben wird, und instanziiert einen DigitalOcean
API-Objekt.
adapter = new BuzzAdapter (Yii :: app () -> params ['ocean'] ['access_key']); // ein digitales Ozeanobjekt mit dem vorherigen Adapter erstellen $ this-> digitalOcean = new DigitalOceanV2 ($ this-> adapter);
Lassen Sie uns nun eine Liste unserer aktiven Tröpfchen abrufen. Im /app/protected/models/Droplet.php
, unsere Sync
Diese Methode ruft die Ocean-Komponenten auf und ruft die Tröpfchen ab:
öffentliche Funktion sync () $ ocean = new Ocean (); $ droplets = $ ocean-> getDroplets (); foreach ($ droplets als $ d) $ droplet_id = $ this-> add ($ d);
Hier ist was der Ozean getDroplets
Methode sieht so aus:
public function getDroplets () // die Aktion zurückgeben api $ action = $ this-> digitalOcean-> droplet (); // eine Sammlung von Action-Entity zurückgeben $ actions = $ action-> getAll (); $ -Aktionen zurückgeben;
Hinweis: Die Basiskonsolenanwendung führt lediglich eine einseitige Synchronisierung der Droplet-Listen durch. Sie können selbst weitere Funktionen implementieren, z. B. das Entfernen von in der Cloud gelöschten Tröpfchen.
Hier ist unser Droplet-Modell hinzufügen
Funktion. Wenn das Droplet bereits vorhanden ist, aktualisieren wir den Datensatz einfach:
public function add ($ droplet) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); if (leer ($ d)) $ d = neues Droplet; $ d-> user_id = Yii :: app () -> user-> id; $ d-> droplet_id = $ droplet-> id; $ d-> name = $ droplet-> name; $ d-> vcpus = $ droplet-> vcpus; $ d-> Speicher = $ Droplet-> Speicher; $ d-> disk = $ droplet-> disk; $ d-> status = $ droplet-> status; $ d-> aktiv = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = new CDbExpression ('NOW ()'); $ d-> save (); $ d-> id zurückgeben;
Wenn Sie die Funktionen des Modells erweitern möchten, bietet Digital Ocean eine Vielzahl von Droplet-API-Aktionen. Corcy bietet hier eine Liste klarer Beispiele.
Als Nächstes verwenden wir die API, um eine Liste unserer aktuellen Bilder abzurufen. Bilder sind Momentaufnahmen, im Wesentlichen Sicherungen, die zu einem bestimmten Zeitpunkt von einer Serverinstanz aufgenommen wurden.
Unser Snapshot.php-Modell hat eine Sync
Vorgang, der eine Liste Ihrer Bilder anfordert und einzeln der Datenbank hinzufügt:
öffentliche Funktion sync () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ snapshots as $ i) $ image_id = $ this-> add ($ i); if ($ image_id! == false) echo $ image_id; lb (); pp ($ i);
Hier ist die Ozeankomponente getSnapshots
Code:
public function getSnapshots () // Liefert die Aktion api $ action = $ this-> digitalOcean-> image (); // eine Sammlung von Action-Entity zurückgeben $ actions = $ action-> getAll (); $ -Aktionen zurückgeben;
Hier ist das Snapshot-Modell hinzufügen
Code-wir ignorieren die Bilder der Digital Ocean-Bestandsanwendung, die als öffentlich gekennzeichnet sind
public function add ($ snapshot) $ i = Momentaufnahme :: model () -> findByAttributes (array ('image_id' => $ Momentaufnahme-> id)); if (leer ($ i)) $ i = neuer Snapshot; $ i-> created_at = new CDbExpression ('NOW ()'); if (isset ($ snapshot-> public) und $ snapshot-> public == 1) return false; // keine Notwendigkeit, öffentliche Bilder sofort zu speichern else $ i-> user_id = Yii :: app () -> user-> id; $ i-> image_id = $ snapshot-> id; $ i-> name = $ snapshot-> name; $ i -> region = $ Momentaufnahme-> Regionen [0]; $ i -> aktiv = 1; $ i-> modified_at = new CDbExpression ('NOW ()'); $ i-> save (); return $ i -> id;
Wie bereits unter Erstellen eines App-Images für den Wiederverkauf bei Digital Ocean erläutert, ist es hilfreich, die Erstellung von Snapshots zu automatisieren, die Sie an Kunden und Kunden übertragen können. Leider gibt es derzeit keine Möglichkeit, ein Bild per Referenz zu klonen oder zu übertragen. Jedes Mal, wenn Sie einen Schnappschuss auf ein anderes Konto übertragen, ist er weg.
Da Digital Ocean erfordert, dass Sie ein Bild als Droplet instanziieren und ausschalten, bevor Sie einen neuen Schnappschuss erstellen, ist das wiederholte Erstellen von Schnappschüssen ein zeitaufwändiger manueller Vorgang. Es hilft nicht, dass Digital Ocean nach dem Aufnehmen von Schnappschüssen erneut Tröpfchen aktiviert. Dies verlangsamt den Prozess.
Da die API keine Anforderungen akzeptiert, während andere Vorgänge anstehen, müssen wir eine Tabelle erstellen, um Hintergrundaktionen zu verfolgen, und einen Cron-Job verwenden, um den Ausschalt- und Momentaufnahmevorgang zu wiederholen. So funktioniert das:
Besuche den Bilder Seite und klicken Sie auf Aussicht für den Schnappschuss, den Sie gerne klonen möchten. Klicken Sie dann auf Replizieren Menüpunkt nach rechts.
Dadurch wird ein Droplet erstellt und damit ein Eintrag zur Hintergrund-Aktionstabelle hinzugefügt image_id
und droplet_id
. Das Endphase
ist eine Konstante, die Sie festlegen können, um die Anzahl der zu erstellenden Duplikate anzugeben.
Hier ist das Snapshot-Modell replizieren ()
Methode:
öffentliche Funktion replicate ($ id) // Lookup image_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // das Tröpfchen erstellen $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ snapshot-> name, $ snapshot-> region, $ snapshot-> image_id); // Befehl zur Aktionstabelle mit droplet_id und image_id hinzufügen $ a = new Action (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ snapshot-> image_id; $ a-> action = Action :: ACTION_SNAPSHOT; $ a-> status = Aktion :: STATUS_ACTIVE; $ a-> stage = 0; // Vom Benutzer einstellbare Konstante für die Anzahl der Replikationen, um $ a-> end_stage = Snapshot :: NUMBER_REPLICATIONS zu machen; $ a-> last_checked = 0; $ a-> modified_at = new CDbExpression ('NOW ()'); $ a-> created_at = new CDbExpression ('NOW ()'); $ a-> save ();
Die cron-Task pingt http://ocean.ihredomain.com/daemon/index, um die Aktionstabelle regelmäßig zu verarbeiten. Alle nicht abgeschlossenen überfälligen Elemente fordern eine weitere Momentaufnahme an.
Hier ist das Action-Modell verarbeiten()
Methode:
public function process () set_time_limit (0); // Suche nach überfälligen Aktionen $ todo = Action :: model () -> overdue () -> findAllByAttributes (array ('status' => self :: STATUS_ACTIVE)); foreach ($ todo as $ item) if ($ item-> action == self :: ACTION_SNAPSHOT) $ result = Momentaufnahme :: model () -> take ($ item-> id);
Der Snapshot-Prozess wird das Droplet herunterfahren, 20 Sekunden warten, bis das Droplet heruntergefahren ist, und einen Snapshot anfordern.
Hier ist das Snapshot-Modell nehmen()
Methode:
öffentliche Funktion take ($ action_id) $ result = false; $ a = Action :: model () -> findByPk ($ action_id); $ snapshot = snapshot :: model () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ ocean = new Ocean (); // Herunterfahren versuchen // Momentaufnahme aufnehmen $ result = $ ocean-> Momentaufnahme ($ a-> stage, $ a-> droplet_id, $ snapshot-> name, $ snapshot-> region, $ snapshot-> image_id); // Wenn der Schnappschuss erfolgreich war if ($ result) // Stufe $ a-> stage + = 1 erhöhen; // Wenn die letzte Momentaufnahmereplikation abgeschlossen ist, beenden Sie die Aktion if ($ a-> stage> = $ a-> end_stage) $ a-> status = Action :: STATUS_COMPLETE; // oder so, update last_checked $ a-> last_checked = time (); $ a-> save (); $ Ergebnis zurückgeben;
Hier ist der Code in der Ocean-Komponente, um die API-Aufrufe tatsächlich durchzuführen:
Public Function Snapshot ($ stage, $ droplet_id, $ name, $ region, $ image_id, $ begin = 1, $ count = 3, $ size = '512mb')) $ no_sleep = false; $ name = str_replace ("_", "-", $ name); $ droplet = $ this-> digitalOcean-> droplet (); try echo 'Herunterfahren'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id); catch (Ausnahme $ e) $ err = $ e-> getMessage (); echo 'Ausnahme erwischt:', $ e-> getMessage (), "\ n"; if (stristr ($ err, 'bereits ausgeschaltet') === false) false zurückgeben; else $ no_sleep = true; if (! $ no_sleep) echo 'Schlaf für 20 Sekunden nach dem Ausschalten ...'; lb (); Schlaf (20); echo 'Schnappschuss von' machen. $ droplet_id. ' benannt '. $ name.' - copy - '. $ stage; lb (); try $ snapshot = $ droplet-> snapshot ($ droplet_id, $ name .'- copy - '. $ stage); catch (Ausnahme $ e) echo 'Ausnahme:', $ e-> getMessage (), "\ n"; falsch zurückgeben; // Herunterfahren und Snapshot erfolgreich zurückgeben true;
Wenn Sie die Digital Ocean-Website besuchen, um das Droplet anzuzeigen, werden folgende Aktionen angezeigt:
Wenn der Schnappschuss erfolgreich ist, kehrt er zum Schnappschussmodell zurück, um die Stufe zu erhöhen. Wenn die Anzahl der Stufenreplikationen abgeschlossen ist, ist die Aktion abgeschlossen.
Sie können die besuchen Bilder auf der Digital Ocean-Website, um Ihre replizierten Momentaufnahmen anzuzeigen:
Nachdem die Bilder erstellt wurden, können Sie das Droplet manuell löschen - oder Sie können den Code erweitern, wenn dies der Fall ist STATUS_COMPLETE
ist erreicht. Wenn Sie das Droplet nicht löschen, wird Ihnen dies in Rechnung gestellt.
Beachten Sie, dass die API derzeit keine Möglichkeit bietet, einen Snapshot an eine E-Mail-Adresse zu übertragen. Sie müssen dies also manuell über die Weboberfläche tun.
Ich hoffe, dass Ihnen dieses Tutorial gefallen hat und dass Digital Ocean ein nützlicher Service in Ihrem Portfolio an Tools und Hosting-Providern ist. Im nächsten Tutorial werden wir den Digital-Ocean-DNS-Dienst untersuchen.
Bitte zögern Sie nicht, unten Ihre Fragen und Kommentare zu posten. Sie können mich auch auf Twitter @reifman erreichen oder mich direkt per E-Mail kontaktieren. Folgen Sie meiner Tuts + Instructor Seite, um zukünftige Artikel dieser Serie zu sehen.