Oceanul digital este unul dintre gazdele web cu cea mai rapidă creștere, în parte datorită serverelor rapide bazate pe SSD și planurilor lunare de gazduire de $ 5 ieftine. Spinning instanțe pe Digital Ocean pentru testarea sau utilizarea pe termen lung este rapid, ușor și la prețuri accesibile.
În construirea unei imagini de aplicație pentru a revinde la Oceanul Digital, te-am urmărit cum să lansezi o instanță WordPress (sau altă aplicație) și să o clonezi în mod repetat pentru clienți. În acest tutorial, vă voi îndruma folosind Digital Ocean API pentru a gestiona în mod programatic instanțele noastre, cunoscute și ca picături, și pentru a automatiza sarcinile comune. Voi oferi, de asemenea, o bază de date de probă pentru a rula operațiuni de bază API scrise în cadrul Yii pentru PHP; puteți obține codul aici pe Github.
API-ul Digital Ocean vă permite să gestionați drojdiile și resursele într-un mod simplu și programatic folosind cererile HTTP. Toate funcționalitățile pe care le cunoașteți în panoul de control Digital Ocean sunt de asemenea disponibile prin intermediul API, permițându-vă să scriu acțiunile complexe pe care situația dvs. le cere.
Pentru acest tutorial, vom integra Biblioteca API Digital Ocean V2 a dezvoltatorului Antoine Corcy într-o aplicație consola bazată pe Yii. Nu aveți nevoie de cunoștințe despre Yii pentru a utiliza aplicația, dar puteți afla mai multe despre aceasta aici: Introducere în cadrul Yii.
API-ul Digital Ocean autentifică contul dvs. prin OAuth și este alcătuit din aproape zece domenii de nivel înalt:
Acum că știți puțin despre API, să ne aruncăm cu propria aplicație.
Pentru a utiliza API, trebuie să activați Token-urile de acces personale pentru contul dvs. Conectați-vă la contul dvs. și accesați pagina de aplicații pentru setări: https://cloud.digitalocean.com/settings/applications. Clic Generați un nou jeton, așa cum se arată mai jos:
Luați notă de indicativul dvs. de acces de mai jos - Oceanul digital vă va arăta o singură dată:
Acum, hai să trecem la aplicația noastră pentru console.
În acest tutorial, vom explora o mică aplicație de consolă pe care am construit-o și care îndeplinește câteva sarcini legate de gestionarea picăturilor. Aveți posibilitatea să instalați singur aplicația din depozitul Tuts + GitHub și să o personalizați sau să o extindeți pentru a implementa caracteristicile API suplimentare pe care le doriți. Am postat un ghid detaliat de instalare pentru aplicația de consolă de pe site-ul meu. De asemenea, puteți să explorați ghidul meu de instalare generică pentru aplicațiile Digital Ocean.
Din nou, folosim Biblioteca API Digital Ocean V2 a lui Antoine Corcy pentru a accesa API-ul.
Am construit o componentă numită Ocean.php care acționează ca model pentru utilizarea bibliotecii sale. Este la /app/protected/components/Ocean.php
.
Yii vă încarcă tokenul de acces din fișierul Ocean.ini, descris în Ghidul de instalare a aplicației Consola digitală digitală, și instantează o digitalOcean
Obiect API.
adaptor = nou BuzzAdapter (Yii :: app () -> params ['ocean'] ['acces_key']); // crea un obiect digital ocean cu adaptorul anterior $ this-> digitalOcean = noul DigitalOceanV2 ($ this-> adapter);
Acum, să aducem o listă cu picăturile noastre active. În /app/protected/models/Droplet.php
, al nostru sincronizați
metoda invocă componentele Oceanului și obține picăturile:
funcția publică funcțională () $ ocean = new Ocean (); $ picături = $ ocean-> getDroplets (); foreach ($ picături ca $ d) $ droplet_id = $ this-> add ($ d);
Iată ce Oceanul getDroplets
metoda arata ca:
funcția publică getDroplets () // returnează acțiunea api $ action = $ this-> digitalOcean-> droplet (); // returnați o colecție de entitate de acțiune $ actions = $ action-> getAll (); returneaza actiunile $;
Notă: aplicația de bază a consolei are doar o sincronizare cu descărcare într-o singură direcție a înregistrărilor noastre cu picături. Ați putea implementa mai multe caracteristici pe cont propriu, inclusiv înlăturarea picăturilor care au fost șterse în nor.
Iată modelul nostru de Droplet adăuga
funcţie. Dacă deja există picături, actualizăm înregistrarea:
funcția publică adăugă ($ droplet) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); dacă (gol ($ d)) $ d = new Droplet; $ d-> user_id = Yii :: app () -> utilizator-> id; $ d-> droplet_id = $ droplet-> id; $ d-> nume = $ droplet-> nume; $ d-> vcpus = $ picătură-> vcpus; $ d-> memory = $ droplet-> memorie; $ d-> disc = $ droplet-> disc; $ d-> status = $ droplet-> status; $ d-> active = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = nou CDbExpression ("ACUM () '); $ D-> Salvare (); returnează $ d-> id;
Dacă doriți să extindeți caracteristicile modelului, Digital Ocean oferă o mare varietate de acțiuni Droplet API, iar Corcy are o listă de exemple clare aici.
Apoi, vom folosi API pentru a prelua o listă a imaginilor noastre curente. Imaginile sunt instantanee, în esență, copii de siguranță, preluate dintr-o instanță de server la un moment dat.
Modelul nostru Snapshot.php are un sincronizați
care solicită o listă a imaginilor și le adaugă individual în baza de date:
funcția publică funcțională () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ instantanee ca $ i) $ image_id = $ this-> add ($ i); dacă ($ image_id! == false) echo $ image_id; lb (); pp ($ i);
Iată componenta Ocean getSnapshots
cod:
funcția publică getSnapshots () // returnează acțiunea api $ action = $ this-> digitalOcean-> image (); // returnați o colecție de entitate de acțiune $ actions = $ action-> getAll (); returneaza actiunile $;
Iată modelul Snapshot adăuga
cod-ignorăm imaginile aplicației de stocare Digital Ocean, care se disting ca public:
funcția publică adăugă ($ snapshot) $ i = Snapshot :: model () -> findByAttributes (array ('image_id' => $ snapshot-> id)); dacă (gol ($ i)) $ i = Snapshot nou; $ i-> created_at = nou CDbExpression ('ACUM ()'); dacă (isset ($ snapshot-> public) și $ snapshot-> public == 1) return false; // nu trebuie să salvați imagini publice chiar acum altceva $ i-> user_id = Yii :: app () -> user-> id; $ i-> image_id = $ snapshot-> id; $ i-> name = $ snapshot-> name; $ i-> regiune = $ snapshot-> regiuni [0]; $ i-> active = 1; $ i-> modified_at = nou CDbExpression ('ACUM ()'); $ J-> Salvare (); returnează $ i-> id;
După cum am discutat în construirea unei imagini de aplicație pentru a revinde la Oceanul digital, este util să automatizați crearea de instantanee pe care le puteți transfera clienților și clienților. Din păcate, în prezent nu există nici o modalitate de a clona sau de a transfera o imagine prin referință; de fiecare dată când transferați un instantaneu într-un alt cont, a dispărut.
Deoarece Oceanul digital cere să instanțiați o imagine ca o picătură și să o opriți înainte de a face o nouă fotografie, crearea de instantanee repetată este un proces manual manual. Nu ajută Oceanul Digital să dea putere asupra picăturilor din nou după ce a luat instantanee - acest lucru încetinește procesul.
Deoarece API nu acceptă solicitări în timp ce alte operații sunt în așteptare, trebuie să construim un tabel pentru a urmări acțiunile de fundal și să folosim o lucrare cron pentru a repeta operația de oprire, instantaneu. Iată cum funcționează:
Viziteaza Imagini pagina și faceți clic pe Vedere pentru instantaneu pe care doriți să îl clonați. Apoi faceți clic pe Replicarea opțiune de meniu spre dreapta.
Aceasta va crea o picătură și va adăuga o intrare în fundal cu tabelul de acțiuni image_id
și droplet_id
. sfârșitul stagiului
este o constantă pe care o puteți seta indicând numărul de duplicate create.
Iată modelul Instantaneu replica ()
metodă:
funcția publică replică ($ id) // arăta imaginea_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // creaza picatura $ ocean = new Ocean (); $ droplet_id = $ ocean-> lansare_droplet ($ snapshot-> nume, $ snapshot-> regiune, $ snapshot-> image_id); // adăugați comanda la tabela de acțiune cu droplet_id și image_id $ a = acțiune nouă (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ snapshot-> image_id; $ a-> action = acțiune :: ACTION_SNAPSHOT; $ a-> status = Acțiune :: STATUS_ACTIVE; $ a-> etapa = 0; // constanta setabilă de utilizator pentru numărul de replicări pentru a face $ a-> end_stage = Snapshot :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = nou CDbExpression ('ACUM ()'); $ a-> created_at = nou CDbExpression ('ACUM ()'); $ A-> Salvați ();
Sarcina cron va ping http://ocean.yourdomain.com/daemon/index pentru a procesa în mod regulat tabelul de acțiuni. Orice elemente nefinalizate restante vor cere un alt instantaneu.
Iată modelul de acțiune proces()
metodă:
funcția publică () set_time_limit (0); // căutați acțiuni restante $ todo = Acțiune :: model () -> depășite () -> findAllByAttributes (array ('status' => auto :: STATUS_ACTIVE)); ($ item-> action == self :: ACTION_SNAPSHOT) $ rezultat = Snapshot :: model () -> lua ($ item-> id);
Procesul instantaneu va închide picătura, va întrerupe 20 de secunde pentru a aștepta stoparea picăturii și pentru a solicita un instantaneu.
Iată modelul Instantaneu lua()
metodă:
funcția publică ia ($ action_id) $ result = false; $ a = Acțiune :: model () -> findByPk ($ action_id); $ snapshot = Instantaneu :: model () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ ocean = Ocean nou (); // încercare de închidere // snapshot $ result = $ ocean-> snapshot ($ a-> etapă, $ a-> droplet_id, $ snapshot-> nume, $ snapshot-> regiune, $ snapshot-> image_id); // dacă imaginea a fost reușită dacă ($ rezultat) // etapa de incrementare $ a-> stage + = 1; // în cazul în care replicarea ultimei instantanee a fost finalizată, acțiunea se încheie dacă ($ a-> stage> = $ a-> end_stage) $ a-> status = Acțiune :: STATUS_COMPLETE; // oricare mod, actualizare last_checked $ a-> last_checked = time (); $ A-> Salvați (); returneaza rezultatul $;
Iată codul din componenta Ocean pentru efectuarea efectivă a apelurilor API:
($ stage, $ droplet_id, $ name, $ region, $ image_id, $ begin = 1, $ count = 3, $ size = '512mb') $ no_sleep = false; $ nume = str_replace ("_", "-", $ nume); $ droplet = $ this-> digitalOcean-> picătură (); încercați echo 'Închidere'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id); captură (Excepție $ e) $ err = $ e-> getMessage (); echo 'Excepție capturată:', $ e-> getMessage (), "\ n"; dacă (stristr ($ err, 'deja dezactivat') === false) return false; altceva $ no_sleep = true; dacă (! $ no_sleep) echo 'Sleep 20 secunde pentru oprire ...'; lb (); somn (20); echo 'Ia instantaneu de'. $ droplet_id. ' numit '. $ nume.' - copie - '. $ stage; lb (); încercați $ snapshot = $ droplet-> snapshot ($ droplet_id, $ name .'- copy - '. $ stage); captură (Excepție $ e) echo "Excepție capturată: ', $ e-> getMessage ()," \ n "; return false; // shutdown și instantaneu de returnare reușită adevărat;
Dacă vizitați site-ul Digital Ocean pentru a vedea picăturile, veți vedea acțiunea în desfășurare:
Dacă imaginea este reușită, ea revine la modelul Instantaneu pentru a crește treapta. Când numărul de replicări de scenă sa terminat, acțiunea este finalizată.
Puteți vizita Imagini pe site-ul Digital Ocean pentru a vedea instantaneele replicate:
După crearea imaginilor, puteți să ștergeți picăturile manual - sau puteți extinde codul când faceți acest lucru STATUS_COMPLETE
este atins. Dacă nu ștergeți picătura, veți fi taxat pentru aceasta.
Rețineți că, în acest moment, API nu oferă posibilitatea de a transfera un instantaneu la o adresă de e-mail, astfel încât va trebui să continuați să faceți acest lucru manual prin interfața web.
Sper că v-ați bucurat de acest tutorial și veți găsi Digital Ocean ca un serviciu util în portofoliul de instrumente și furnizori de servicii de găzduire. În următorul tutorial vom explora serviciul Digital Ocean DNS.
Vă rugăm să nu ezitați să postați întrebările și comentariile dvs. de mai jos. Puteți să mă contactați și pe Twitter @reifman sau să mă trimiteți direct prin e-mail. Urmați pagina mea Tuts + instructor pentru a vedea articole viitoare din această serie.