Uso de la API de Digital Ocean para administrar instancias en la nube

Lo que vas a crear

¿Qué es el océano digital??

Digital Ocean es uno de los hosts web de más rápido crecimiento, en parte debido a sus servidores rápidos basados ​​en SSD y sus planes de hospedaje mensuales económicos de $ 5. Acelerar las instancias en Digital Ocean para pruebas o uso a largo plazo es rápido, fácil y asequible. 

Al crear una imagen de aplicación para revender en Digital Ocean, le expliqué cómo lanzar una instancia de WordPress (u otra aplicación) y la cloné repetidamente para los clientes. En este tutorial, lo guiaré en el uso de la API de Digital Ocean para administrar programáticamente nuestras instancias, también conocidas como droplets, y para automatizar tareas comunes. También proporcionaré una base de código de muestra para ejecutar operaciones de API muy básicas escritas en Yii Framework for PHP; Puedes obtener el código aquí en Github.

La API de Digital Ocean

La API de Digital Ocean le permite administrar Droplets y recursos de una manera sencilla y programática utilizando solicitudes HTTP. Todas las funciones con las que está familiarizado en el panel de control de Digital Ocean también están disponibles a través de la API, lo que le permite escribir las acciones complejas que su situación requiere.

Para este tutorial, integraremos la biblioteca de la API de PHP Digital Ocean V2 del desarrollador Antoine Corcy en una aplicación de consola basada en Yii. No necesita tener conocimientos de Yii para usar la aplicación, pero puede obtener más información aquí: Introducción al marco de trabajo de Yii.

La API de Digital Ocean autentica su cuenta a través de OAuth y está compuesta por cerca de una docena de áreas de alto nivel:

  • Cuentas: proporciona información básica sobre su cuenta de Digital Ocean.
  • Comportamiento: un registro histórico de acciones en las gotas de su cuenta.
  • Dominios y registros de dominio: le permite administrar los dominios utilizados en los droplets en su cuenta, así como los registros DNS asociados a ellos.
  • Gotitas y acciones de gota: le permite crear, cerrar, reiniciar, instantáneas y más para sus droplets.
  • Imágenes y acciones de imagen: le permite enumerar y administrar las imágenes de instantáneas que ha tomado de las gotas en su cuenta. 
  • Claves SSH: le permite registrar una clave SSH para instalar al crear un droplet para que no se requiera la seguridad de la contraseña.
  • Regiones: enumera las regiones geográficas en las que se pueden crear gotitas de océano digital dentro de.
  • Tamaños: enumera los tamaños de gota que puede utilizar al crear gotas.

Ahora que sabe un poco sobre la API, analicemos con nuestra propia aplicación.

Configuración de las teclas de acceso

Para utilizar la API, debe activar los tokens de acceso personal para su cuenta. Inicie sesión en su cuenta y visite la página de la aplicación de configuración: https://cloud.digitalocean.com/settings/applications. Hacer clic Generar nuevo token, Como se muestra abajo:

Tome nota de su token de acceso debajo: Digital Ocean solo se lo mostrará una vez:

Ahora, pasemos a nuestra aplicación de consola de muestra..

Nuestra aplicación de consola

En este tutorial, vamos a explorar una pequeña aplicación de consola que he construido y que realiza algunas tareas relacionadas con la administración de los droplets. Puede instalar la aplicación usted mismo desde el repositorio de Tuts + GitHub y personalizarla o ampliarla para implementar las características de API adicionales que desee. He publicado una guía de instalación detallada para la aplicación de consola en mi sitio web. También puedes explorar mi guía de instalación genérica para aplicaciones de Digital Ocean.

Configurando el acceso API

Nuevamente, estamos usando la biblioteca de la API de PHP Digital Ocean V2 de Antoine Corcy para acceder a la API. 

Hemos construido un componente llamado Ocean.php que actúa como modelo para usar su biblioteca. Está en /app/protected/components/Ocean.php.

Yii carga su token de acceso desde el archivo Ocean.ini, que se describe en la Guía de instalación de la aplicación de la consola de Digital Ocean, y crea una instancia de digitalocean Objeto API.

adapter = new BuzzAdapter (Yii :: app () -> params ['ocean'] ['access_key']); // crear un objeto digital oceánico con el adaptador anterior $ this-> digitalOcean = new DigitalOceanV2 ($ this-> adapter); 

Recogiendo gotitas

Ahora, vamos a buscar una lista de nuestras gotas activas. En /app/protected/models/Droplet.php, nuestro sincronizar El método invoca los componentes del océano y obtiene las gotas:

 función pública sync () $ ocean = new Ocean (); $ droplets = $ ocean-> getDroplets (); foreach ($ droplets as $ d) $ droplet_id = $ this-> add ($ d);  

Esto es lo que el océano getDroplets método se ve como 

 función pública getDroplets () // devuelve la acción api $ action = $ this-> digitalOcean-> droplet (); // devuelve una colección de la entidad Action $ actions = $ action-> getAll (); devuelve $ acciones;  

Nota: la aplicación de consola básica solo hace una sincronización de descarga de una sola vía de nuestros listados de gotas. Podría implementar más funciones por su cuenta, incluida la eliminación de las gotas que se han eliminado en la nube..

Aquí está nuestro modelo Droplet añadir función. Si la gota ya existe, solo actualizamos el registro:

función pública add ($ droplet) $ d = Droplet :: model () -> findByAttributes (array ('droplet_id' => $ droplet-> id)); if (vacío ($ d)) $ d = gotita nueva;  $ d-> user_id = Yii :: app () -> user-> id; $ d-> droplet_id = $ droplet-> id; $ d-> nombre = $ droplet-> nombre; $ d-> vcpus = $ droplet-> vcpus; $ d-> memory = $ droplet-> memory; $ d-> disk = $ droplet-> disk; $ d-> status = $ droplet-> status; $ d-> activo = 1; $ d-> created_at = $ d-> created_at; $ d-> modified_at = new CDbExpression ('NOW ()'); $ d-> guardar (); devuelve $ d-> id; 

Si desea ampliar las características del modelo, Digital Ocean ofrece una amplia variedad de acciones de la API de Droplet y Corcy tiene una lista de ejemplos claros aquí.

Obteniendo Imágenes

A continuación, usaremos la API para obtener una lista de nuestras imágenes actuales. Las imágenes son instantáneas, esencialmente copias de seguridad, tomadas de una instancia de servidor en un momento dado.

Nuestro modelo Snapshot.php tiene un sincronizar Operación que solicita una lista de sus imágenes y las agrega individualmente a la base de datos:

 función pública sync () $ ocean = new Ocean (); $ snapshots = $ ocean-> getSnapshots (); foreach ($ snapshots as $ i) $ image_id = $ this-> add ($ i); if ($ image_id! == false) echo $ image_id; lb (); pp ($ i);  

Aquí está el componente del océano getSnapshots código:

 función pública getSnapshots () // devuelve la acción api $ action = $ this-> digitalOcean-> image (); // devuelve una colección de la entidad Action $ actions = $ action-> getAll (); devuelve $ acciones;  

Aquí está el modelo de instantánea añadir código: ignoramos las imágenes de aplicaciones de Digital Ocean que se distinguen como públicas:

 función pública add ($ snapshot) $ i = Snapshot :: model () -> findByAttributes (array ('id_imagen' => $ snapshot-> id)); if (vacío ($ i)) $ i = nueva instantánea; $ i-> created_at = new CDbExpression ('NOW ()');  if (isset ($ snapshot-> public) y $ snapshot-> public == 1) return false; // no hay necesidad de guardar imágenes públicas ahora else $ i-> user_id = Yii :: app () -> user-> id; $ i-> image_id = $ snapshot-> id; $ i-> nombre = $ snapshot-> nombre; $ i-> region = $ snapshot-> regiones [0]; $ i-> activo = 1; $ i-> modified_at = new CDbExpression ('NOW ()'); $ i-> guardar (); devuelve $ i-> id;  

Automatizar instantáneas

Como comentamos en Construir una imagen de aplicación para revender en Digital Ocean, es útil automatizar la creación de instantáneas que puede transferir a clientes y clientes. Desafortunadamente, actualmente no hay manera de clonar o transferir una imagen por referencia; Cada vez que transfieres una instantánea a otra cuenta, desaparece..

Debido a que Digital Ocean requiere que cree una imagen como una gota y la apague antes de tomar una nueva instantánea, crear instantáneas de forma repetitiva es un proceso manual que requiere mucho tiempo. No ayuda que Digital Ocean vuelva a alimentar las gotas después de tomar instantáneas; esto solo ralentiza el proceso.

Dado que la API no acepta solicitudes mientras que otras operaciones están pendientes, tenemos que crear una tabla para rastrear las acciones en segundo plano y usar un trabajo cron para repetir la operación de apagado, instantánea. Así es como funciona:

Visita el Imágenes página y haga clic Ver para la instantánea que le gustaría clonar. Luego, haga clic en Reproducir exactamente opción de menú a la derecha. 

Esto creará una gota y agregará una entrada a la tabla de acción de fondo con este image_id y droplet_id. los Etapa final es una constante que puede establecer indicando el número de duplicados para crear.

Aquí está el modelo de instantánea reproducir exactamente() método:

 función pública replicate ($ id) // buscar image_id $ snapshot = Snapshot :: model () -> findByAttributes (array ('id' => $ id)); // crear la gota $ ocean = new Ocean (); $ droplet_id = $ ocean-> launch_droplet ($ snapshot-> name, $ snapshot-> region, $ snapshot-> image_id); // agregar comando a la tabla de acciones con droplet_id e image_id $ a = new Action (); $ a-> droplet_id = $ droplet_id; $ a-> snapshot_id = $ snapshot-> image_id; $ a-> action = Action :: ACTION_SNAPSHOT; $ a-> status = Acción :: STATUS_ACTIVE; $ a-> etapa = 0; // constante configurable por el usuario para el número de repeticiones para hacer $ a-> end_stage = Snapshot :: NUMBER_REPLICATIONS; $ a-> last_checked = 0; $ a-> modified_at = new CDbExpression ('NOW ()'); $ a-> created_at = new CDbExpression ('NOW ()'); $ a-> guardar (); 

La tarea cron hará ping a http://ocean.yourdomain.com/daemon/index para procesar regularmente la tabla de acciones. Cualquier artículo vencido sin terminar solicitará otra instantánea.

Aquí está el modelo de acción proceso() método:

 proceso de función pública () set_time_limit (0); // buscar acciones vencidas $ todo = Acción :: modelo () -> vencidas () -> findAllByAttributes (array ('status' => self :: STATUS_ACTIVE)); foreach ($ todo como $ item) if ($ item-> action == self :: ACTION_SNAPSHOT) $ result = Snapshot :: model () -> take ($ item-> id); 

El proceso de instantáneas cerrará la gota, hará una pausa de 20 segundos para esperar a que se cierre la gota y solicitará una instantánea.

Aquí está el modelo de instantánea tomar() método:

 función pública take ($ action_id) $ result = false; $ a = Action :: model () -> findByPk ($ action_id); $ snapshot = Snapshot :: model () -> findByAttributes (array ('image_id' => $ a-> snapshot_id)); $ ocean = new Ocean (); // intentar cerrar // tomar una instantánea $ resultado = $ ocean-> instantánea ($ a-> etapa, $ a-> droplet_id, $ snapshot-> nombre, $ snapshot-> región, $ snapshot-> image_id); // si la instantánea tuvo éxito si ($ resultado) // incrementa etapa $ a-> etapa + = 1; // si se completa la última replicación de instantáneas, finaliza la acción si ($ a-> stage> = $ a-> end_stage) $ a-> status = Action :: STATUS_COMPLETE;  // de cualquier manera, actualice last_checked $ a-> last_checked = time (); $ a-> guardar (); devuelve $ resultado; 

Aquí está el código en el componente Ocean para hacer las llamadas a la API:

instantánea de la función pública ($ stage, $ droplet_id, $ name, $ region, $ image_id, $ begin = 1, $ count = 3, $ size = '512mb') $ no_sleep = false; $ name = str_replace ("_", "-", $ name); $ droplet = $ this-> digitalOcean-> droplet (); intente echo 'Shutting down'. $ droplet_id; lb (); $ shutdown = $ droplet-> shutdown ($ droplet_id);  catch (Excepción $ e) $ err = $ e-> getMessage (); echo 'Caught exception:', $ e-> getMessage (), "\ n"; if (stristr ($ err, 'ya apagado') === falso) devuelve falso; else $ no_sleep = true;  if (! $ no_sleep) echo 'Sleep 20 segundos para apagar ...'; lb (); dormir (20);  echo 'Toma una instantánea de'. $ droplet_id. ' llamado '. $ nombre.' - copia - '. $ etapa; lb (); intente $ snapshot = $ droplet-> snapshot ($ droplet_id, $ name .'- copy - '. $ stage);  catch (Exception $ e) echo 'Caught excepción:', $ e-> getMessage (), "\ n"; falso retorno;  // el cierre y la instantánea se devuelven correctamente; 

Si visita el sitio web de Digital Ocean para ver la gota, verá la acción en curso:

Si la instantánea es exitosa, regresa al modelo de instantánea para incrementar la etapa. Cuando el número de repeticiones de la etapa ha finalizado, la acción se completa.

Puedes visitar el Imágenes página en el sitio web de Digital Ocean para ver sus instantáneas replicadas:

Una vez creadas las imágenes, puede eliminar el droplet manualmente o puede extender el código para hacerlo cuando STATUS_COMPLETE es alcanzado. Si no elimina la gota, se le cobrará.

Tenga en cuenta que en este momento, la API no ofrece la posibilidad de transferir una instantánea a una dirección de correo electrónico, por lo que deberá continuar haciendo esto manualmente a través de la interfaz web..

Que sigue?

Espero que haya disfrutado de este tutorial y que Digital Ocean sea un servicio útil en su cartera de herramientas y proveedores de alojamiento. En el siguiente tutorial exploraremos el servicio DNS de Digital Ocean..

Por favor, siéntase libre de publicar sus preguntas y comentarios a continuación. También puedes contactarme en Twitter @reifman o enviarme un correo electrónico directamente. Sigue la página de mi instructor Tuts + para ver los futuros artículos de esta serie.

enlaces relacionados

  • La API de Digital Ocean
  • Biblioteca de API de PHP de Digital Ocean V2
  • Guía de instalación de la aplicación Digital Ocean Console