Bruke Digital Ocean API til å administrere Cloud Instances

Hva du skal skape

Hva er Digital Ocean?

Digital Ocean er en av de raskest voksende web vertene, delvis på grunn av sine raske SSD-baserte servere og rimelige $ 5 månedlige hosting planer. Spinning opp forekomster på Digital Ocean for testing eller langvarig bruk er rask, enkel og rimelig. 

I å bygge en App Image å videreselge på Digital Ocean, gikk jeg deg gjennom hvordan du starter en WordPress (eller annen app) forekomst og gjentatte ganger kloner den for klienter. I denne opplæringen skal jeg veilede deg ved å bruke Digital Ocean API for å programmere administrere våre forekomster, også kjent som dråper, og for å automatisere vanlige oppgaver. Jeg vil også gi en prøvekodebase for å kjøre svært grunnleggende API-operasjoner skrevet i Yii Framework for PHP; Du kan få koden her på Github.

Digital Ocean API

Digital Ocean API lar deg administrere Dråper og ressurser på en enkel, programmatisk måte ved hjelp av HTTP-forespørsler. All funksjonalitet som du er kjent med i Digital Ocean-kontrollpanelet, er også tilgjengelig via API, slik at du kan skribe komplekse handlinger som situasjonen krever.

For denne opplæringen integrerer vi utvikler Antoine Corcys Digital Ocean V2 PHP API-bibliotek i en Yii-basert konsollprogram. Du trenger ikke kunnskap om Yii for å bruke programmet, men du kan lære mer om det her: Introduksjon til Yii Framework.

Digital Ocean API autentiserer kontoen din via OAuth og består av nær et dusin områder på høyt nivå:

  • kontoer: gir grunnleggende informasjon om Digital Ocean-kontoen din.
  • handlinger: En historisk logg av handlinger på dråpene i kontoen din.
  • Domener og Domeneregister: lar deg administrere domenene som brukes på dråper i kontoen din, samt DNS-postene som er knyttet til dem.
  • Droplets & Droplet Actions: lar deg lage, avslutte, starte på nytt, stillbilde og mer for dine dråper.
  • Bilder og bildehandlinger: lar deg oppsummere og administrere øyeblikksbilder som du har tatt av dråper på kontoen din. 
  • SSH Keys: lar deg registrere en SSH-nøkkel for å installere når du oppretter en dråpe, slik at passordsikkerhet ikke kreves.
  • regioner: Teller de geografiske områdene som Digital Ocean-dråper kan opprettes innenfor.
  • størrelser: Teller opp de dråplestørrelsene du kan bruke når du lager dråper.

Nå som du vet litt om API, la oss dykke inn med vår egen applikasjon.

Sette opp tilgangstaster

For å kunne bruke API, må du aktivere Personlig tilgangstegn for kontoen din. Logg inn på kontoen din og besøk innstillingsprogrammet: https://cloud.digitalocean.com/settings/applications. Klikk Generer nytt tegn, som vist under:

Legg merke til tilgangstoken din nedenfor - Digital Ocean vil bare vise det til deg en gang:

Nå, la oss gå videre til vårt eksempelkonsollprogram.

Vårt konsollprogram

I denne opplæringen skal vi utforske en liten konsoll-applikasjon jeg har bygget som utfører noen oppgaver knyttet til håndtering av dråper. Du kan installere programmet selv fra Tuts + GitHub-depotet og tilpasse eller utvide det til å implementere flere API-funksjoner du ønsker. Jeg har lagt ut en detaljert installasjonsveiledning for konsollprogrammet på nettstedet mitt. Du kan også utforske min generiske installasjonsveiledning for Digital Ocean-apper.

Konfigurere API-tilgang

Igjen bruker vi Antoine Corcy's Digital Ocean V2 PHP API-bibliotek for å få tilgang til API. 

Vi har bygget en komponent som heter Ocean.php, som fungerer som en modell for bruk av biblioteket. Det er på /app/protected/components/Ocean.php.

Yii laster tilgangstokenet fra Ocean.ini-filen, beskrevet i Installasjonsveiledningen for Digital Ocean Console, og instanterer en digitalOcean API-objekt.

adapter = ny BuzzAdapter (Yii :: app () -> params ['ocean'] ['access_key']); // Opprett et digitalt havobjekt med den forrige adapteren $ this-> digitalOcean = ny DigitalOceanV2 ($ this-> adapter); 

Henter dråper

Nå, la oss hente en liste over våre aktive dråper. I /app/protected/models/Droplet.php, våre synkron Metoden påkaller havkomponenter og får dråpene:

 offentlig funksjon synkronisering () $ ocean = new Ocean (); $ dråper = $ ocean-> getDroplets (); foreach ($ dråper som $ d) $ droplet_id = $ this-> add ($ d);  

Her er det havet getDroplets metoden ser ut som: 

 offentlig funksjon getDroplets () // returnere handlingen api $ action = $ this-> digitalOcean-> dråpet (); // returnere en samling av Handlingsenhet $ actions = $ action-> getAll (); returnere $ handlinger;  

Merk: grunnleggende konsoll søknaden gjør bare en enveis nedlasting synkronisering av våre droplet oppføringer. Du kan implementere flere funksjoner på egenhånd, inkludert fjerning av dråper som er slettet i skyen.

Her er vår Droplet-modell Legg til funksjon. Hvis dråpen allerede eksisterer, oppdaterer vi bare posten:

offentlig funksjon legg til ($ dråpe) $ d = Droppet :: modell () -> findByAttributes (array ('droplet_id' => $ dråpe-> id)); hvis (tomt ($ d)) $ d = ny Droppet;  $ d-> user_id = Yii :: app () -> bruker-> id; $ d-> droplet_id = $ dråpe-> id; $ d-> navn = $ dråpe-> navn; $ d-> vcpus = $ dråpe-> vcpus; $ d-> minne = $ dråpe-> minne; $ d-> disk = $ dråpe-> disk; $ d-> status = $ dråpe-> status; $ d-> aktiv = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = ny CDbExpression ('NU ()'); $ D-> Lagre (); returner $ d-> id; 

Hvis du ønsker å utvide modellens funksjoner, tilbyr Digital Ocean et bredt utvalg av Droplet API-handlinger, og Corcy har en liste med klare eksempler her.

Henter bilder

Deretter bruker vi API for å hente en liste over våre nåværende bilder. Bilder er stillbilder, i hovedsak sikkerhetskopier, tatt av en server-forekomst på et gitt tidspunkt.

Vår Snapshot.php-modell har en synkron operasjon som ber om en liste over bildene dine og legger dem individuelt i databasen:

 offentlig funksjon synkronisering () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ stillbilder som $ i) $ image_id = $ this-> add ($ i); hvis ($ image_id! == false) echo $ image_id; lb (); pp ($ i);  

Her er Ocean-komponenten getSnapshots kode:

 offentlig funksjon getSnapshots () // returnere handlingen api $ action = $ this-> digitalOcean-> image (); // returnere en samling av Handlingsenhet $ actions = $ action-> getAll (); returnere $ handlinger;  

Her er stillbildemodellen Legg til kode-vi ignorerer Digital Oceans lagerapplikasjonsbilder som utmerker seg som offentlige:

 offentlig funksjon legg til ($ øyeblikksbilde) $ i = Stillbilde :: modell () -> findByAttributes (array ('image_id' => $ øyeblikksbilde-> id)); hvis (tomt ($ i)) $ i = nytt øyeblikksbilde; $ i-> created_at = ny CDbExpression ('NU ()');  hvis (isset ($ øyeblikksbilde-> offentlig) og $ øyeblikksbilde-> offentlig == 1) return false; // trenger ikke å lagre offentlige bilder akkurat nå else $ i-> user_id = Yii :: app () -> bruker-> id; $ i-> image_id = $ øyeblikksbilde-> id; $ i-> navn = $ øyeblikksbilde-> navn; $ i-> region = $ øyeblikksbilde-> regioner [0]; $ i-> aktiv = 1; $ i-> modified_at = ny CDbExpression ('NU ()'); $ I-> Lagre (); returner $ i-> id;  

Automatisere øyeblikksbilder

Som vi diskuterte i å bygge et App-bilde for å videreselge på Digital Ocean, er det nyttig å automatisere opprettelsen av stillbilder som du kan overføre til kunder og kunder. Dessverre er det for øyeblikket ingen måte å klone eller overføre et bilde ved referanse; hver gang du overfører et øyeblikksbilde til en annen konto, er den borte.

Fordi Digital Ocean krever at du instantierer et bilde som en dråpe og slår av den før du tar et nytt øyeblikksbilde, er det en tidkrevende manuell prosess å skape øyeblikksbilder. Det hjelper ikke de digitale Ocean-kreftene på dråper igjen etter å ha tatt øyeblikksbilder - dette reduserer prosessen bare ned.

Siden API ikke aksepterer forespørsler mens andre operasjoner ventes, må vi bygge et bord for å spore bakgrunnsaksjoner og bruke en cron-jobb for å gjenta strømmen, øyeblikksbildeoperasjonen. Slik fungerer det:

Besøk Bilder side og klikk Utsikt for øyeblikksbildet du vil klone. Deretter klikker du på Gjenskape menyvalg til høyre. 

Dette vil opprette en dråpe og legge til en oppføring i bakgrunnen Handlingstabell med dette image_id og droplet_id. De end_stage er en konstant du kan angi hvilket antall duplikater du skal lage.

Her er stillbildemodellen gjenskape() metode:

 offentlig funksjon replikere ($ id) // se opp image_id $ snapshot = Stillbilde :: modell () -> findByAttributes (array ('id' => $ id)); // opprett dråpet $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ øyeblikksbilde-> navn, $ øyeblikksbilde-> region, $ øyeblikksbilde-> image_id); // legg til kommando til handlingstabell med droplet_id og image_id $ a = ny handling (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ øyeblikksbilde-> image_id; $ a-> action = Handling :: ACTION_SNAPSHOT; $ a-> status = Handling :: STATUS_ACTIVE; $ a-> stadium = 0; // brukeroppsett konstant for antall replikasjoner for å gjøre $ a-> end_stage = Stillbilde :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = ny CDbExpression ('NU ()'); $ a-> created_at = ny CDbExpression ('NU ()'); $ A-> Lagre (); 

Cron oppgaven vil ping http://ocean.yourdomain.com/daemon/index for å regelmessig behandle handlingstabellen. Eventuelle uferdige forsinkede elementer vil be om et annet øyeblikksbilde.

Her er handlingsmodellen prosess() metode:

 offentlig funksjon prosess () set_time_limit (0); // se etter forfalte handlinger $ todo = Handling :: modell () -> forfalt () -> findAllByAttributes (array ('status' => selv :: STATUS_ACTIVE)); foreach ($ todo som $ item) if ($ item-> action == selv: ACTION_SNAPSHOT) $ result = Stillbilde :: modell () -> ta ($ item-> id); 

Stillbildeprosessen vil stenge dråpen, pause 20 sekunder for å vente på at dråpen skal stenge, og be om et øyeblikksbilde.

Her er stillbildemodellen ta() metode:

 offentlig funksjon ta ($ action_id) $ resultat = false; $ a = Handling :: modell () -> findByPk ($ action_id); $ snapshot = Stillbilde :: modell () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ ocean = nytt hav (); // forsøk avslutning // ta stillbilde $ result = $ ocean-> øyeblikksbilde ($ a-> stadium, $ a-> droplet_id, $ øyeblikksbilde-> navn, $ øyeblikksbilde-> region, $ øyeblikksbilde-> bilde_id); // hvis stillbilde var vellykket hvis ($ resultat) // trinn trinn $ a-> stadium + = 1; // hvis siste snapshot replication complete, avslutte handling hvis ($ a-> stadium> = $ a-> end_stage) $ a-> status = Handling :: STATUS_COMPLETE;  // hverken, oppdater last_checked $ a-> last_checked = tid (); $ A-> Lagre (); returnere $ resultat; 

Her er koden i Ocean-komponenten for å faktisk lage API-anropene:

offentlig funksjons øyeblikksbilde ($ stadium, $ droplet_id, $ navn, $ region, $ image_id, $ start = 1, $ count = 3, $ size = '512mb') $ no_sleep = false; $ name = str_replace ("_", "-", $ navn); $ dråpe = $ this-> digitalOcean-> dråpe (); prøv echo 'Shutting down'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id);  fangst (Unntak $ e) $ err = $ e-> getMessage (); ekko 'Fanget unntak:', $ e-> getMessage (), "\ n"; hvis (stristr ($ err, 'allerede slått av') === false) returner false; ellers $ no_sleep = true;  hvis (! $ no_sleep) echo 'Sleep 20 seconds for power off ...'; lb (); søvn (20);  ekko 'Ta et øyeblikksbilde av'. $ droplet_id. ' navngitt '. $ navn .'- kopi -'. $ stadium; lb (); prøv $ snapshot = $ droplet-> øyeblikksbilde ($ droplet_id, $ name .'- copy - '. $ stadium);  fangst (Unntak $ e) echo 'Fanget unntak:', $ e-> getMessage (), "\ n"; returner falsk;  // avslutning og øyeblikksbilde vellykket retur sann; 

Hvis du besøker nettstedet Digital Ocean for å se dråpet, ser du handlingen pågår:

Hvis stillbildet lykkes, går det tilbake til stillbildemodellen for å øke scenen. Når antall trinnreplikasjoner er ferdig, er handlingen fullført.

Du kan besøke Bilder side på Digital Ocean-nettstedet for å se dine kopierte stillbilder:

Når bildene er opprettet, kan du slette dråpen manuelt - eller du kan utvide koden til å gjøre det når STATUS_COMPLETE er nådd. Hvis du ikke sletter dråpen, blir du belastet for det.

Vær oppmerksom på at API-en på denne tiden ikke gir muligheten til å overføre et øyeblikksbilde til en e-postadresse, så du må fortsette å gjøre dette manuelt via webgrensesnittet.

Hva blir det neste?

Jeg håper at du har hatt denne opplæringen og funnet Digital Ocean som en nyttig tjeneste i din portefølje av verktøy og vertsleverandører. I neste opplæring vil vi utforske Digital Ocean DNS-tjenesten.

Ta gjerne inn dine spørsmål og kommentarer nedenfor. Du kan også nå meg på Twitter @ reifman eller email meg direkte. Følg min Tuts + instruktørside for å se fremtidige artikler i denne serien.

Relaterte linker

  • Digital Ocean API
  • Digital Ocean V2 PHP API-bibliotek
  • Installasjonshåndbok for Digital Ocean Console