Digital Ocean è uno degli host web in più rapida crescita, in parte grazie ai suoi server veloci basati su SSD e ai costosi piani di hosting $ 5 mensili. Girare istanze su Digital Ocean per i test o l'uso a lungo termine è veloce, facile e conveniente.
Nella creazione di un'immagine per rivendere da Digital Ocean, ti ho illustrato come avviare un'istanza di WordPress (o un'altra app) e ripetutamente clonarla per i client. In questo tutorial, ti guiderò nell'utilizzo dell'API Digital Ocean per gestire in modo programmatico le nostre istanze, note anche come droplet, e per automatizzare le attività comuni. Fornirò anche un esempio di base di codice per eseguire operazioni API di base scritte in Yii Framework per PHP; puoi ottenere il codice qui su Github.
L'API Digital Ocean consente di gestire goccioline e risorse in modo semplice e programmatico utilizzando le richieste HTTP. Tutte le funzionalità che hai familiarità con il pannello di controllo di Digital Ocean sono disponibili anche tramite l'API, che ti consente di scrivere le azioni complesse che la tua situazione richiede.
Per questo tutorial, integreremo la libreria API API Digital V2 di Antoine Corcy dello sviluppatore in un'applicazione console basata su Yii. Non hai bisogno di una conoscenza di Yii per usare l'applicazione ma puoi saperne di più qui: Introduzione al Framework Yii.
La Digital Ocean API autentica il tuo account tramite OAuth ed è composta da quasi una dozzina di aree di alto livello:
Ora che conosci un po 'dell'API, immergiti con la nostra applicazione.
Per utilizzare l'API, è necessario attivare i token di accesso personale per il proprio account. Accedi al tuo account e visita la pagina delle impostazioni dell'applicazione: https://cloud.digitalocean.com/settings/applications. Clic Genera nuovo token, come mostrato di seguito:
Prendi nota del tuo token di accesso qui sotto: Digital Ocean te lo mostrerà solo una volta:
Passiamo ora alla nostra applicazione di console di esempio.
In questo tutorial, esploreremo una piccola applicazione console che ho creato che esegue alcune attività relative alla gestione dei droplet. Puoi installare l'applicazione autonomamente dal repository Tuts + GitHub e personalizzarla o estenderla per implementare funzionalità API aggiuntive che desideri. Ho pubblicato una guida di installazione dettagliata per l'applicazione della console sul mio sito web. Puoi anche esplorare la mia guida all'installazione generica per le app Digital Ocean.
Ancora una volta, utilizziamo la libreria API PHP Digital V2 di Antoine Corcy per accedere all'API.
Abbiamo creato un componente chiamato Ocean.php che funge da modello per l'utilizzo della sua libreria. È a /app/protected/components/Ocean.php
.
Yii carica il token di accesso dal file Ocean.ini, descritto nella Guida all'installazione dell'applicazione Digital Ocean Console e crea un'istanza a digitalOcean
Oggetto API.
adapter = new BuzzAdapter (Yii :: app () -> params ['ocean'] ['access_key']); // crea un oggetto oceanico digitale con l'adattatore precedente $ this-> digitalOcean = new DigitalOceanV2 ($ this-> adapter);
Ora, recuperiamo un elenco delle nostre gocce attive. Nel /app/protected/models/Droplet.php
, nostro sincronizzare
metodo richiama i componenti Ocean e ottiene le goccioline:
funzione pubblica sync () $ ocean = new Ocean (); $ droplets = $ ocean-> getDroplets (); foreach ($ droplets as $ d) $ droplet_id = $ this-> add ($ d);
Ecco cosa l'oceano getDroplets
il metodo sembra:
funzione pubblica getDroplets () // restituisce l'azione api $ action = $ this-> digitalOcean-> droplet (); // restituisce una raccolta di entità Action $ actions = $ action-> getAll (); restituire $ azioni;
Nota: l'applicazione di console di base esegue solo una sincronizzazione di download unidirezionale dei nostri elenchi di droplet. Potresti implementare più funzionalità da solo, inclusa la rimozione di goccioline che sono state eliminate nel cloud.
Ecco i nostri modelli Droplet Inserisci
funzione. Se il droplet esiste già, aggiorniamo semplicemente il record:
funzione pubblica add ($ droplet) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); if (vuoto ($ d)) $ d = nuovo Droplet; $ d-> user_id = Yii :: app () -> user-> id; $ d-> droplet_id = $ droplet-> id; $ d-> nome = $ droplet-> nome; $ d-> vcpus = $ droplet-> vcpus; $ d-> memoria = $ droplet-> memoria; $ d-> disco = $ droplet-> disco; $ d-> status = $ droplet-> stato; $ d-> attivo = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = new CDbExpression ('NOW ()'); $ D-> save (); restituire $ d-> id;
Se desideri estendere le funzionalità del modello, Digital Ocean offre una vasta gamma di azioni API Droplet e Corcy ha un elenco di esempi chiari qui.
Successivamente, utilizzeremo l'API per recuperare un elenco delle nostre immagini attuali. Le immagini sono istantanee, essenzialmente backup, prese da un'istanza del server in un determinato momento.
Il nostro modello Snapshot.php ha un sincronizzare
operazione che richiede un elenco delle tue immagini e le aggiunge singolarmente al database:
funzione pubblica sync () $ ocean = new Ocean (); $ istantanee = $ oceano-> getSnapshots (); foreach ($ istantanee come $ i) $ image_id = $ this-> add ($ i); if ($ image_id! == false) echo $ image_id; lb (); pp ($ i);
Ecco la componente Ocean getSnapshots
codice:
funzione pubblica getSnapshots () // restituisce l'azione api $ action = $ this-> digitalOcean-> image (); // restituisce una raccolta di entità Action $ actions = $ action-> getAll (); restituire $ azioni;
Ecco il modello Snapshot Inserisci
codice: ignoriamo le immagini delle applicazioni azionarie di Digital Ocean che sono distinte come pubbliche:
funzione pubblica add ($ snapshot) $ i = Snapshot :: model () -> findByAttributes (array ('image_id' => $ snapshot-> id)); if (empty ($ i)) $ i = new Snapshot; $ i-> created_at = new CDbExpression ('NOW ()'); if (isset ($ snapshot-> public) e $ snapshot-> public == 1) return false; // non è necessario salvare le immagini pubbliche in questo momento else $ i-> user_id = Yii :: app () -> user-> id; $ i-> image_id = $ snapshot-> id; $ i-> nome = $ snapshot-> nome; $ i-> region = $ snapshot-> regions [0]; $ i-> active = 1; $ i-> modified_at = new CDbExpression ('NOW ()'); $ I-> save (); restituire $ i-> id;
Come abbiamo discusso in Building a App Image to Rivendere a Digital Ocean, è utile automatizzare la creazione di istantanee che è possibile trasferire a clienti e clienti. Sfortunatamente, non esiste attualmente un modo per clonare o trasferire un'immagine per riferimento; ogni volta che trasferisci un'istantanea su un altro account, non c'è più.
Poiché Digital Ocean richiede di istanziare un'immagine come Droplet e di spegnerla prima di eseguire una nuova istantanea, la creazione di istantanee ripetitive è un processo manuale che richiede molto tempo. Non aiuta di nuovo il potere di Digital Ocean sulle goccioline dopo aver scattato delle istantanee, questo rallenta il processo.
Poiché l'API non accetta richieste mentre altre operazioni sono in sospeso, dobbiamo costruire una tabella per tenere traccia delle azioni in background e utilizzare un cron job per ripetere lo spegnimento, operazione di snapshot. Ecco come funziona:
Visitare il immagini pagina e clicca vista per l'istantanea che vorresti clonare. Quindi, fare clic su Replicare opzione di menu a destra.
Questo creerà un droplet e aggiungerà una voce alla tabella Action in background con questo image_id
e droplet_id
. Il stadio terminale
è una costante che puoi impostare indicando il numero di duplicati da creare.
Ecco il modello di Snapshot replicare()
metodo:
funzione pubblica replicare ($ id) // cercare image_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // crea il droplet $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ snapshot-> nome, $ snapshot-> regione, $ snapshot-> id_immagine); // aggiungi il comando alla tabella delle azioni con droplet_id e image_id $ a = new Action (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ snapshot-> image_id; $ a-> action = Azione :: ACTION_SNAPSHOT; $ a-> status = Azione :: STATUS_ACTIVE; $ a-> stage = 0; // costante impostabile dall'utente per il numero di repliche per rendere $ a-> end_stage = Snapshot :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = new CDbExpression ('NOW ()'); $ a-> created_at = new CDbExpression ('NOW ()'); $ A-> save ();
L'attività cron ping su http://ocean.yourdomain.com/daemon/index per elaborare regolarmente la tabella delle azioni. Tutti gli articoli scaduti non completati richiederanno un'altra istantanea.
Ecco il modello di azione processi()
metodo:
public function process () set_time_limit (0); // cerca le azioni scadute $ todo = Action :: model () -> overdue () -> findAllByAttributes (array ('status' => self :: STATUS_ACTIVE)); foreach ($ todo as $ item) if ($ item-> action == self :: ACTION_SNAPSHOT) $ result = Snapshot :: model () -> take ($ item-> id);
Il processo di istantanea spegne il droplet, mette in pausa 20 secondi per attendere che il droplet si chiuda e richiede uno snapshot.
Ecco il modello di Snapshot prendere()
metodo:
funzione pubblica take ($ action_id) $ result = false; $ a = Azione :: modello () -> findByPk ($ action_id); $ snapshot = Snapshot :: model () -> findByAttributes (array ('id_immagine' => $ a-> snapshot_id)); $ ocean = new Ocean (); // tentativo shutdown // acquisisce snapshot $ result = $ ocean-> snapshot ($ a-> stage, $ a-> droplet_id, $ snapshot-> nome, $ snapshot-> regione, $ snapshot-> id_immagine); // se l'istantanea ha avuto esito positivo se ($ result) // incrementa stage $ a-> stage + = 1; // se l'ultima replica dell'istantanea è completa, termina l'azione se ($ a-> stage> = $ a-> end_stage) $ a-> status = Action :: STATUS_COMPLETE; // in entrambi i casi, aggiorna last_checked $ a-> last_checked = time (); $ A-> save (); ritorno $ risultato;
Ecco il codice nel componente Ocean per effettuare effettivamente le chiamate API:
snapshot della funzione pubblica ($ stage, $ droplet_id, $ name, $ region, $ image_id, $ begin = 1, $ count = 3, $ size = '512mb') $ no_sleep = false; $ name = str_replace ("_", "-", $ name); $ droplet = $ this-> digitalOcean-> droplet (); prova echo 'Chiusura'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id); catch (Exception $ e) $ err = $ e-> getMessage (); echo 'Caught exception:', $ e-> getMessage (), "\ n"; if (stristr ($ err, 'già spento') === false) return false; altrimenti $ no_sleep = true; if (! $ no_sleep) echo 'Sleep 20 secondi per spegnimento ...'; lb (); il sonno (20); echo 'Effettua lo snapshot di'. $ droplet_id. ' chiamato '. $ nome .'- copia -'. $ stage; lb (); prova $ snapshot = $ droplet-> snapshot ($ droplet_id, $ name .'- copy - '. $ stage); catch (Exception $ e) echo 'Caught exception:', $ e-> getMessage (), "\ n"; restituisce falso; // shutdown e snapshot esito positivo true;
Se visiti il sito Web Digital Ocean per visualizzare il droplet, vedrai l'azione in corso:
Se l'istantanea ha esito positivo, ritorna al modello Snapshot per incrementare lo stage. Al termine del numero di repliche di stage, l'azione è completata.
Puoi visitare il immagini pagina sul sito Web di Digital Ocean per vedere le tue istantanee replicate:
Dopo aver creato le immagini, puoi eliminare manualmente il droplet oppure puoi estendere il codice per farlo quando STATUS_COMPLETE
è raggiunto. Se non elimini il droplet, ti verrà addebitato il costo.
Nota che in questo momento, l'API non offre la possibilità di trasferire un'istantanea a un indirizzo email, quindi dovrai continuare a farlo manualmente tramite l'interfaccia web.
Spero che questo tutorial ti sia piaciuto e che Digital Ocean sia un servizio utile nel tuo portafoglio di strumenti e provider di hosting. Nel prossimo tutorial esploreremo il servizio Digital Ocean DNS.
Non esitate a postare le vostre domande e commenti qui sotto. Puoi anche raggiungermi su Twitter @reifman o mandarmi un'email direttamente. Segui la pagina dei miei Tuts + istruttore per vedere gli articoli futuri in questa serie.