Använda Digital Ocean API för att hantera Cloud Instances

Vad du ska skapa

Vad är Digital Ocean?

Digital Ocean är en av de snabbast växande webbhotell, delvis på grund av sina snabba SSD-baserade servrar och billiga 5 månaders webbhotell. Att spinna upp instanser på Digital Ocean för testning eller långsiktig användning är snabb, enkel och prisvärd. 

I att bygga en appbild för att sälja om till Digital Ocean gick jag igenom hur du startar en WordPress-instans (eller annan app) och klickar upprepade gånger för klienter. I denna handledning kommer jag att vägleda dig för att använda Digital Ocean API för att programmera hantera våra instanser, även kända som droppar, och att automatisera vanliga uppgifter. Jag ska också tillhandahålla ett exempelkodsbas för att köra mycket grundläggande API-operationer skrivna i Yii Framework for PHP; Du kan få koden här på Github.

Digital Ocean API

Med API-programmet Digital Ocean kan du hantera droppar och resurser på ett enkelt, programmatiskt sätt med hjälp av HTTP-förfrågningar. All den funktionalitet som du är bekant med i Digital Ocean kontrollpanelen är också tillgänglig via API, så att du kan skriva de komplexa åtgärder som din situation kräver.

För denna handledning integrerar vi utvecklaren Antoine Corcy Digital Ocean V2 PHP API-bibliotek till en Yii-baserad konsolansökan. Du behöver inte ha kunskap om Yii för att använda programmet, men du kan lära dig mer om det här: Introduktion till Yii Framework.

Digital Ocean API autentiserar ditt konto via OAuth och består av nära ett dussin höga områden:

  • konton: ger grundläggande information om ditt Digital Ocean-konto.
  • Åtgärder: En historisk logg över åtgärder på dropparna i ditt konto.
  • Domäner och domänrekord: låter dig hantera domäner som används på droppar i ditt konto samt de DNS-poster som är kopplade till dem.
  • Droppar & Droplet Actions: låter dig skapa, stänga av, starta om, snapshot och mer för dina droppar.
  • Bilder och bildåtgärder: låter dig räkna upp och hantera ögonblicksbilder som du har tagit med droppar på ditt konto. 
  • SSH Keys: låter dig registrera en SSH-nyckel för att installera när du skapar en droppe så att lösenordsäkerhet inte krävs.
  • regioner: summerar de geografiska områden som Digital Ocean-droppar kan skapas inom.
  • storlekar: räknar upp de droppstorlekar som du kan använda när du skapar droppar.

Nu när du vet lite om API: n, låt oss dyka in med vår egen ansökan.

Ställa in åtkomstnycklar

För att kunna använda API måste du aktivera Personliga Access-Tokens för ditt konto. Logga in på ditt konto och besök inställningsprogrammets sida: https://cloud.digitalocean.com/settings/applications. Klick Generera nytt tecken, enligt nedanstående:

Notera din access token nedan-Digital Ocean kommer bara visa den till dig en gång:

Nu, låt oss gå vidare till vår provkonsolansökan.

Vår konsolansökan

I den här handledningen kommer vi att undersöka en liten konsol-applikation som jag har byggt som utför några uppgifter relaterade till hantering av droppar. Du kan installera programmet själv från Tuts + GitHub-förvaret och anpassa eller utöka det för att implementera ytterligare API-funktioner som du önskar. Jag har lagt upp en detaljerad installationsguide för konsolprogrammet på min hemsida. Du kan också utforska min generiska installationsguide för Digital Ocean-appar.

Konfigurera API-åtkomst

Återigen använder vi Antoine Corcy Digital Ocean V2 PHP API-bibliotek för att komma åt API: n. 

Vi har byggt en komponent som heter Ocean.php som fungerar som en modell för att använda sitt bibliotek. Det är på /app/protected/components/Ocean.php.

Yii laddar din access token från Ocean.ini-filen, som beskrivs i installationshandboken för Digital Ocean Console, och instansierar en digitalOcean API-objekt.

adapter = ny BuzzAdapter (Yii :: app () -> params ['ocean'] ['access_key']); // skapa ett digitalt oceanobjekt med den tidigare adaptern $ this-> digitalOcean = nya DigitalOceanV2 ($ this-> adapteren); 

Hämta droppar

Nu hämtar vi en lista över våra aktiva droppar. I /app/protected/models/Droplet.php, vår synkronisera Metoden åberopar Ocean-komponenterna och får dropparna:

 synkronisering med offentlig funktion () $ ocean = new Ocean (); $ droplets = $ ocean-> getDroplets (); foreach ($ droppar som $ d) $ droplet_id = $ this-> lägg till ($ d);  

Här är vad havet getDroplets Metoden ser ut som: 

 allmän funktion getDroplets () // returnera åtgärden api $ action = $ this-> digitalOcean-> droplet (); // returnera en samling Action enhet $ actions = $ action-> getAll (); returnera $ actions;  

Notera: baskonsolansökan gör bara en enkelriktad nedladdningssynkronisering av våra dropplistningar. Du kan implementera fler funktioner på egen hand, inklusive att ta bort droppar som har tagits bort i molnet.

Här är vår Droplet-modell Lägg till fungera. Om droppen redan finns uppdaterar vi just posten:

public function add ($ dråp) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); om (tomt ($ d)) $ d = ny droppe;  $ d-> user_id = Yii :: app () -> använd-> id; $ d-> droplet_id = $ droplet-> id; $ d-> name = $ droplet-> name; $ d-> vcpus = $ droplet-> vcpus; $ d-> minne = $ droplet-> minne; $ d-> disk = $ droplet-> disk; $ d-> status = $ droplet-> status; $ d-> aktiv = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = new CDbExpression ('NU ()'); $ D-> Spara (); returnera $ d-> id; 

Om du vill utvidga modellens funktioner erbjuder Digital Ocean ett brett utbud av Droplet API-åtgärder och Corcy har en lista med tydliga exempel här.

Hämtar bilder

Därefter använder vi API för att hämta en lista över våra aktuella bilder. Bilder är ögonblicksbilder, i huvudsak säkerhetskopior, av en servernsinstans vid en given tidpunkt.

Vår Snapshot.php-modell har en synkronisera operation som begär en lista med dina bilder och lägger dem individuellt i databasen:

 synkronisering med offentlig funktion () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ ögonblicksbilder som $ i) $ image_id = $ this-> add ($ i); om ($ image_id! == false) echo $ image_id; lb (); pp ($ i);  

Här är Ocean-komponenten getSnapshots koda:

 offentlig funktion getSnapshots () // returnera åtgärden api $ action = $ this-> digitalOcean-> image (); // returnera en samling Action enhet $ actions = $ action-> getAll (); returnera $ actions;  

Här är snapshot-modellen Lägg till kod - vi ignorerar Digital Oceans stockapplikationsbilder som utmärks som offentliga:

 public function add ($ snapshot) $ i = Snapshot :: model () -> findByAttributes (array ('image_id' => $ snapshot-> id)); om (tomt ($ i)) $ i = ny ögonblicksbild; $ i-> created_at = ny CDbExpression ('NU ()');  om (isset ($ snapshot-> public) och $ snapshot-> public == 1) return false; // behöver inte spara offentliga bilder just nu else $ i-> user_id = Yii :: app () -> user-> id; $ i-> image_id = $ ögonblicksbild-> id; $ i-> namn = $ ögonblicksbild-> namn; $ i-> region = $ ögonblicksbild-> regioner [0]; $ i-> aktiv = 1; $ i-> modified_at = ny CDbExpression ('NU ()'); $ I-> Spara (); returnera $ i-> id;  

Automatisera ögonblicksbilder

Som vi diskuterade i Att bygga en appbild för att sälja om till Digital Ocean är det användbart att automatisera skapandet av ögonblicksbilder som du kan överföra till kunder och kunder. Tyvärr finns det för närvarande inget sätt att klona eller överföra en bild genom referens. varje gång du överför en ögonblicksbild till ett annat konto är den borta.

Eftersom Digital Ocean kräver att du instanserar en bild som en droppe och slår av den innan du tar en ny ögonblicksbild, är det en tidskrävande manuell process att skapa ögonblicksbilder. Det hjälper inte de Digital Ocean-krafterna på droppar igen efter att ha tagit ögonblicksbilder - detta fördröjer processen helt enkelt.

Eftersom API inte accepterar förfrågningar medan andra operationer väntar måste vi bygga ett bord för att spåra bakgrundsåtgärder och använda ett cron-jobb för att upprepa avstängning, stillbildsoperation. Så här fungerar det:

Besök Bilder sida och klicka Se för ögonblicksbilden som du skulle vilja klonera. Klicka sedan på Återskapa menyalternativ till höger. 

Detta skapar en droppe och lägger till en post i bakgrunden Åtgärdstabell med detta image_id och droplet_id. De end_stage är en konstant du kan ange vilket antal dubbletter du vill skapa.

Här är snapshotmodellen återskapa() metod:

 public function replicate ($ id) // slå upp bild_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // skapa droppen $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ snapshot-> namn, $ snapshot-> region, $ snapshot-> image_id); // lägg till kommando till handlingstabell med droplet_id och image_id $ a = ny åtgärd (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ ögonblicksbild-> image_id; $ a-> action = Action :: ACTION_SNAPSHOT; $ a-> status = Åtgärd :: STATUS_ACTIVE; $ a-> stadium = 0; // användare inställbar konstant för antal replikeringar för att göra $ a-> end_stage = Stillbild :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = ny CDbExpression ('NU ()'); $ a-> created_at = ny CDbExpression ('NU ()'); $ A-> Spara (); 

Cron-uppgiften pingar http://ocean.yourdomain.com/daemon/index för att regelbundet behandla åtgärdstabellen. Eventuella oavslutade förfallna föremål kommer att begära en annan stillbild.

Här är Action-modellen bearbeta() metod:

 allmän funktion process () set_time_limit (0); // leta efter försenade åtgärder $ todo = Åtgärd :: modell () -> försenad () -> hittaAllByAttributes (array ('status' => själv :: STATUS_ACTIVE)); foreach ($ todo som $ item) if ($ item-> action == self :: ACTION_SNAPSHOT) $ result = Snapshot :: model () -> ta ($ item-> id); 

Stillbildsprocessen stänger av droppen, pausar 20 sekunder för att vänta på att droppen ska stängas av och begära en ögonblicksbild.

Här är snapshotmodellen ta() metod:

 public function take ($ action_id) $ result = false; $ a = Åtgärd :: modell () -> findByPk ($ action_id); $ snapshot = Snapshot :: model () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ ocean = new ocean (); // försök avstängning // ta ögonblicksbild $ result = $ ocean-> ögonblicksbild ($ a-> stadium, $ a-> droplet_id, $ ögonblicksbild-> namn, $ ögonblicksbild-> region, $ ögonblicksbild-> bild_id); // om ögonblicksbilden lyckades om ($ resultat) // steg steg $ a-> stadium + = 1; // om sista snapshot replication complete, avsluta åtgärder om ($ a-> stadium> = $ a-> end_stage) $ a-> status = Åtgärd :: STATUS_COMPLETE;  // på något sätt, uppdatera last_checked $ a-> last_checked = time (); $ A-> Spara (); returnera $ resultat; 

Här är koden i Ocean-komponenten för att faktiskt göra API-samtal:

offentlig funktion snapshot ($ stadium, $ droplet_id, $ namn, $ region, $ image_id, $ begin = 1, $ count = 3, $ size = '512mb') $ no_sleep = false; $ name = str_replace ("_", "-", $ namn); $ droplet = $ this-> digitalOcean-> droplet (); försök echo "Stänga ner". $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id);  fångst (Undantag $ e) $ err = $ e-> getMessage (); echo "Fångat undantag:", $ e-> getMessage (), "\ n"; om (stristr ($ err, 'already powered off') === false) returnera false; annars $ no_sleep = true;  om (! $ no_sleep) echo 'Sova 20 sekunder för avstängning ...'; lb (); sömn (20);  echo "Ta snapshot of '. $ droplet_id.' namnet '. $ name''- copy -'. $ stage; lb (); försök $ snapshot = $ droplet-> ögonblicksbild ($ droplet_id, $ name .'- copy - '. $ stadium);  fångst (Undantag $ e) echo 'Fångat undantag:', $ e-> getMessage (), "\ n"; returnera false;  // avstängning och snapshot lyckad retur sant; 

Om du besöker webbplatsen Digital Ocean för att se droppen kommer du att se den pågående åtgärden:

Om ögonblicksbilden lyckas, återgår den till stillbildsmodellen för att öka scenen. När antalet scenreplikationer har slutförts är åtgärden klar.

Du kan besöka Bilder sida på Digital Ocean webbplats för att se dina replikerade ögonblicksbilder:

När bilderna har skapats kan du ta bort droppen manuellt - eller du kan förlänga koden för att göra det när STATUS_COMPLETE är nådd. Om du inte tar bort droppen kommer du att debiteras för den.

Observera att API: n inte erbjuder möjlighet att överföra en ögonblicksbild till en e-postadress, så du måste fortsätta att göra det manuellt via webbgränssnittet.

Vad kommer härnäst?

Jag hoppas att du har haft denna handledning och hitta Digital Ocean för att vara en användbar tjänst i din portfölj av verktyg och webbhotell. I nästa handledning utforskar vi Digital Ocean DNS-tjänsten.

Var snäll och posta dina frågor och kommentarer nedan. Du kan också nå mig på Twitter @ reifman eller maila mig direkt. Följ min Tuts + instruktörssida för att se framtida artiklar i den här serien.

relaterade länkar

  • Digital Ocean API
  • Digital Ocean V2 PHP API-bibliotek
  • Installationsguide för Digital Ocean Console