Utilisation de l'API Digital Ocean pour gérer les instances dans le cloud

Ce que vous allez créer

Qu'est-ce que l'océan numérique??

Digital Ocean est l’un des hébergeurs Web à la croissance la plus rapide, en partie grâce à ses serveurs SSD rapides et à ses plans d’hébergement mensuels peu coûteux. La création d'instances sur Digital Ocean pour des tests ou une utilisation à long terme est rapide, facile et abordable. 

Dans Création d'une image d'application à revendre chez Digital Ocean, je vous ai expliqué comment lancer une instance de WordPress (ou d'une autre application) et le cloner à plusieurs reprises pour les clients. Dans ce didacticiel, je vais vous guider dans l'utilisation de l'API Digital Ocean pour gérer par programme nos instances, également appelées gouttelettes, et pour automatiser des tâches courantes. Je fournirai également un exemple de base de code pour l'exécution d'opérations d'API très basiques écrites dans le Framework Yii pour PHP; vous pouvez obtenir le code ici sur Github.

L'API Digital Ocean

L'API Digital Ocean vous permet de gérer les droplets et les ressources d'une manière simple et programmatique à l'aide de requêtes HTTP. Toutes les fonctionnalités que vous connaissez bien dans le panneau de commande de Digital Ocean sont également disponibles via l'API, vous permettant de créer un script pour les actions complexes requises par votre situation..

Pour ce didacticiel, nous allons intégrer la bibliothèque d'API PHP Digital Ocean V2 du développeur Antoine Corcy dans une application console basée sur Yii. Vous n'avez pas besoin de connaître Yii pour utiliser l'application, mais vous pouvez en apprendre plus à ce sujet ici: Introduction au framework Yii.

L'API Digital Ocean authentifie votre compte via OAuth et se compose d'une dizaine de zones de haut niveau:

  • Comptes: fournit des informations de base sur votre compte Digital Ocean.
  • actes: historique des actions sur les droplets de votre compte.
  • Domaines et enregistrements de domaine: permet de gérer les domaines utilisés sur les droplets de votre compte ainsi que les enregistrements DNS qui leur sont associés.
  • Actions de gouttelettes et de gouttelettes: vous permet de créer, d'arrêter, de redémarrer, d'instantané et plus pour vos gouttelettes.
  • Images et actions d'image: vous permet d'énumérer et de gérer les instantanés des gouttelettes prises sur votre compte.. 
  • Clés SSH: vous permet d’enregistrer une clé SSH à installer lors de la création d’un droplet afin que la sécurité par mot de passe ne soit pas requise.
  • Les régions: énumère les régions géographiques dans lesquelles des gouttelettes Digital Ocean peuvent être créées.
  • Tailles: énumère les tailles de gouttelettes que vous pouvez utiliser lors de la création de gouttelettes.

Maintenant que vous en savez un peu sur l'API, passons à notre propre application.

Configuration des clés d'accès

Pour utiliser l'API, vous devez activer les jetons d'accès personnel pour votre compte. Connectez-vous à votre compte et visitez la page de l'application des paramètres: https://cloud.digitalocean.com/settings/applications. Cliquez sur Générer un nouveau jeton, comme indiqué ci-dessous:

Notez votre jeton d'accès ci-dessous. Digital Ocean ne vous le montrera qu'une fois:

Passons maintenant à notre exemple d'application de console..

Notre application console

Dans ce tutoriel, nous allons explorer une petite application console que j'ai construite et qui effectue quelques tâches liées à la gestion des droplets. Vous pouvez installer l'application vous-même à partir du référentiel Tuts + GitHub et la personnaliser ou l'étendre pour implémenter les fonctionnalités supplémentaires de l'API que vous souhaitez. J'ai posté un guide d'installation détaillé pour l'application console sur mon site Web. Vous pouvez également explorer mon guide d'installation générique pour les applications Digital Ocean.

Configuration de l'accès à l'API

Encore une fois, nous utilisons la bibliothèque d’API PHP Digital Ocean V2 d’Antoine Corcy pour accéder à l’API.. 

Nous avons construit un composant appelé Ocean.php qui sert de modèle pour utiliser sa bibliothèque. C'est à /app/protected/components/Ocean.php.

Yii charge votre jeton d'accès à partir du fichier Ocean.ini, décrit dans le Guide d'installation de l'application Digital Ocean Console, et instancie une digitalOcean Objet API.

adaptateur = new BuzzAdapter (Yii :: app () -> params ['ocean'] ['clé_accès']); // crée un objet océan numérique avec l'adaptateur précédent $ this-> digitalOcean = new DigitalOceanV2 ($ this-> adapter); 

Récupération de gouttelettes

Maintenant, allons chercher une liste de nos gouttelettes actives. Dans /app/protected/models/Droplet.php, notre synchroniser La méthode appelle les composants Ocean et récupère les gouttelettes:

 fonction publique sync () $ ocean = new Ocean (); $ gouttelettes = $ océan-> getDroplets (); foreach ($ droplets as $ d) $ droplet_id = $ this-> add ($ d);  

Voici ce que l'océan getDroplets méthode ressemble à: 

 fonction publique getDroplets () // retourne l'action api $ action = $ this-> digitalOcean-> droplet (); // retourne une collection d'entités Action $ actions = $ action-> getAll (); retourne $ actions;  

Remarque: L'application console de base effectue simplement une synchronisation de téléchargement unidirectionnel de nos listes de droplets. Vous pouvez implémenter vous-même davantage de fonctionnalités, y compris la suppression des gouttelettes supprimées dans le cloud..

Voici notre modèle Droplet ajouter une fonction. Si le droplet existe déjà, il suffit de mettre à jour l'enregistrement:

fonction publique add ($ droplet) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); if (vide ($ d)) $ d = nouvelle Droplet;  $ d-> user_id = Yii :: app () -> user-> id; $ d-> droplet_id = $ droplet-> id; $ d-> nom = $ droplet-> nom; $ d-> vcpus = $ droplet-> vcpus; $ d-> mémoire = $ droplet-> mémoire; $ d-> disque = $ droplet-> disque; $ d-> status = $ droplet-> status; $ d-> actif = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = new CDbExpression ('NOW ()'); $ d-> save (); retourne $ d-> id; 

Si vous souhaitez étendre les fonctionnalités du modèle, Digital Ocean propose une grande variété d'actions de l'API Droplet et Corcy propose une liste d'exemples clairs ici..

Récupération des images

Ensuite, nous allons utiliser l’API pour récupérer une liste de nos images actuelles. Les images sont des instantanés, essentiellement des sauvegardes, prises d'une instance de serveur à un moment donné..

Notre modèle Snapshot.php a un synchroniser opération qui demande une liste de vos images et les ajoute individuellement à la base de données:

 fonction publique sync () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ instantanés en tant que $ i) $ image_id = $ ceci-> add ($ i); if ($ image_id! == faux) echo $ image_id; lb (); pp ($ i);  

Voici la composante océan getSnapshots code:

 fonction publique getSnapshots () // retourne l'action api $ action = $ this-> digitalOcean-> image (); // retourne une collection d'entités Action $ actions = $ action-> getAll (); retourne $ actions;  

Voici le modèle Snapshot ajouter code-nous ignorons les images d’application stock de Digital Ocean qui se distinguent comme publiques:

 fonction publique add ($ snapshot) $ i = Snapshot :: model () -> findByAttributes (array ('image_id' => $ snapshot-> id)); if (vide ($ i)) $ i = nouvel instantané; $ i-> created_at = new CDbExpression ('NOW ()');  if (isset ($ snapshot-> public) et $ snapshot-> public == 1) return false; // pas besoin de sauvegarder les images publiques pour le moment else $ i-> id_utilisateur = Yii :: app () -> utilisateur-> id; $ i-> image_id = $ snapshot-> id; $ i-> nom = $ snapshot-> nom; $ i-> région = $ instantané-> régions [0]; $ i-> actif = 1; $ i-> modified_at = new CDbExpression ('NOW ()'); $ i-> save (); retourne $ i-> id;  

Automatisation des instantanés

Comme nous l'avons expliqué dans Création d'une image d'application pour la revente chez Digital Ocean, il est utile d'automatiser la création d'instantanés que vous pouvez transférer aux clients. Malheureusement, il n’existe actuellement aucun moyen de cloner ou de transférer une image par référence; chaque fois que vous transférez un instantané vers un autre compte, il disparaît.

Parce que Digital Ocean nécessite l'instanciation d'une image en tant que gouttelette et sa mise hors tension avant de prendre un nouvel instantané, la création répétitive d'instantanés est un processus manuel fastidieux. Après avoir pris des instantanés, Digital Ocean active à nouveau les gouttelettes; cela ne ralentit pas le processus..

Puisque l'API n'accepte pas les demandes alors que d'autres opérations sont en attente, nous devons créer une table pour suivre les actions en arrière-plan et utiliser un travail périodique pour répéter l'opération de mise hors tension et de capture instantanée. Voici comment ça fonctionne:

Visiter le Images page et cliquez Vue pour l'instantané que vous souhaitez cloner. Puis cliquez sur le Reproduire option de menu à droite. 

Ceci créera un droplet et ajoutera une entrée à la table Action en arrière-plan avec cette image_id et droplet_id. le étape finale est une constante que vous pouvez définir en indiquant le nombre de doublons à créer.

Voici le modèle Snapshot reproduire() méthode:

 fonction publique replicate ($ id) // recherche l'image_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // crée la gouttelette $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ snapshot-> nom, $ snapshot-> région, $ snapshot-> image_id); // ajouter une commande à la table d'actions avec droplet_id et image_id $ a = new Action (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ snapshot-> image_id; $ a-> action = Action :: ACTION_SNAPSHOT; $ a-> status = Action :: STATUS_ACTIVE; $ a-> stage = 0; // constante configurable par l'utilisateur pour le nombre de réplications à faire $ a-> end_stage = Snapshot :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = new CDbExpression ('NOW ()'); $ a-> created_at = new CDbExpression ('NOW ()'); $ a-> save (); 

La tâche périodique se connecte à http://ocean.votredomaine.com/daemon/index pour traiter régulièrement le tableau des actions. Tous les articles en retard non terminés demanderont un autre instantané.

Voici le modèle d'action processus() méthode:

 fonction publique processus () set_time_limit (0); // recherche les actions en retard $ 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); 

Le processus de capture instantanée arrêtera le droplet, mettra en pause 20 secondes pour attendre la fermeture du droplet et demandera un instantané..

Voici le modèle Snapshot prendre() méthode:

 fonction publique take ($ action_id) $ result = false; $ a = Action :: model () -> findByPk ($ action_id); $ snapshot = Snapshot :: model () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ océan = nouvel océan (); // tentative d'arrêt // capture instantanée $ resultat = $ océan-> capture instantanée ($ a-> étape, $ a-> droplet_id, $ capture instantanée-> nom, $ capture instantanée-> région, $ capture instantanée-> image_id); // si l'instantané a réussi if ($ result) // incrémente stage $ a-> stage + = 1; // si la dernière réplication de capture instantanée est terminée, termine l'action if ($ a-> étape> = $ a-> étape_fin) $ a-> status = Action :: STATUS_COMPLETE;  // Dans tous les cas, mettez à jour last_checked $ a-> last_checked = time (); $ a-> save (); return $ result; 

Voici le code dans le composant Ocean pour effectuer les appels d'API:

capture instantanée de fonction publique ($ 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 'Fermeture'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id);  catch (Exception $ e) $ err = $ e-> getMessage (); echo 'Exception capturée:', $ e-> getMessage (), "\ n"; if (stristr ($ err, 'déjà éteint') === false) renvoie false; else $ no_sleep = true;  if (! $ no_sleep) echo 'Veille 20 secondes pour éteindre…'; lb (); dormir (20);  echo 'Prendre un instantané de'. $ droplet_id. ' nommé '. $ nom.' - copie - '. $ stage; lb (); try $ snapshot = $ droplet-> snapshot ($ droplet_id, $ name. '- copy -'. $ stage);  catch (Exception $ e) echo 'Exception capturée:', $ e-> getMessage (), "\ n"; retourne faux;  // arrêt et instantané réussis return true; 

Si vous visitez le site Web de Digital Ocean pour voir la gouttelette, vous verrez l'action en cours:

Si l'instantané réussit, il retourne au modèle Instantané pour incrémenter la scène. Lorsque le nombre de réplications d'étape est terminé, l'action est terminée..

Vous pouvez visiter le Images sur le site Web de Digital Ocean pour voir vos instantanés répliqués:

Une fois les images créées, vous pouvez supprimer le droplet manuellement. Vous pouvez également étendre le code pour le faire lorsque STATUS_COMPLETE est atteint. Si vous ne supprimez pas la gouttelette, elle vous sera facturée..

Notez que pour le moment, l'API n'offre pas la possibilité de transférer un instantané vers une adresse électronique. Vous devrez donc continuer à le faire manuellement via l'interface Web..

Et après?

J'espère que vous avez apprécié ce tutoriel et que Digital Ocean est un service utile dans votre portefeuille d'outils et de fournisseurs d'hébergement. Dans le prochain tutoriel, nous allons explorer le service DNS Digital Ocean.

N'hésitez pas à poster vos questions et commentaires ci-dessous. Vous pouvez également me joindre sur Twitter @reifman ou m'envoyer un courriel directement. Suivez la page de mon instructeur Tuts + pour voir les prochains articles de cette série..

Liens connexes

  • L'API Digital Ocean
  • Bibliothèque API PHP Digital Ocean V2
  • Guide d'installation de l'application Digital Ocean Console