使用Digital Ocean API管理云实例

最终产品图片
您将要创造的

什么是数字海洋?

Digital Ocean是增长最快的Web主机之一,部分原因在于其基于SSD的快速服务器和每月5美元的廉价托管计划。 在Digital Ocean上旋转实例以进行测试或长期使用是快速,轻松且价格合理的。

在“ 构建要在Digital Ocean上转售的应用程序映像”中 ,我向您介绍了如何启动WordPress(或其他应用程序 )实例并为客户端重复克隆该实例。 在本教程中,我将指导您使用Digital Ocean API以编程方式管理我们的实例(也称为Drops)并自动执行常见任务。 我还将提供一个示例代码库,用于运行用Yii Framework for PHP编写的非常基本的API操作; 您可以在Github上获得代码

数字海洋API

Digital Ocean API允许您使用HTTP请求以简单的编程方式管理Droplet和资源。 您还可以通过API获得Digital Ocean控制面板中您所熟悉的所有功能,从而使您可以编写脚本,根据情况进行复杂的操作。

在本教程中,我们将把开发人员Antoine CorcyDigital Ocean V2 PHP API库集成到基于Yii的控制台应用程序中。 您不需要具备Yii知识就可以使用该应用程序,但是您可以在这里了解更多信息: Yii Framework简介

Digital Ocean API通过OAuth对您的帐户进行身份验证,它由近十二个高级区域组成:

  • 帐户 :提供有关您的Digital Ocean帐户的基本信息。
  • 操作 :帐户中液滴操作的历史记录。
  • 域和域记录 :允许您管理帐户中的小滴上使用的域以及与之关联的DNS记录。
  • Droplet&Droplet Actions :允许您为液滴创建,关闭,重新启动,快照等。
  • 图片和图片操作 :允许您枚举和管理从帐户上的小滴拍摄的快照图像。
  • SSH密钥 :允许您在创建Droplet时注册要安装的SSH密钥,因此不需要密码安全性。
  • 区域 :枚举可以在其中创建数字海洋小滴的地理区域。
  • 大小 :枚举创建液滴时可以使用的液滴大小。

现在您对API有所了解,让我们开始使用我们自己的应用程序。

设置访问键

为了使用API​​,您需要为您的帐户激活个人访问令牌。 登录到您的帐户并访问设置应用程序页面: https : //cloud.digitalocean.com/settings/applications 。 点击生成新令牌 ,如下所示:

Digital Ocean API生成Acces令牌

在下面记下您的访问令牌-Digital Ocean仅向您显示一次:

Digital Ocean API您的新Acces令牌

现在,让我们进入示例控制台应用程序。

我们的控制台应用程序

在本教程中,我们将探索一个我构建的小型控制台应用程序,该应用程序执行一些与管理Drops有关的任务。 您可以自己从Tuts + GitHub存储库安装该应用程序,然后自定义或扩展它以实现所需的其他API功能。 我已经在我的网站上发布了控制台应用程序的详细安装指南 。 您也可以浏览我的Digital Ocean应用程序通用安装指南

配置API访问

同样,我们使用Antoine CorcyDigital Ocean V2 PHP API库来访问API。

我们已经构建了一个名为Ocean.php的组件,该组件充当使用其库的模型。 在/app/protected/components/Ocean.php

Yii从《 Digital Ocean Console应用程序安装指南》中所述的Ocean.ini文件中加载您的访问令牌,并实例化一个digitalOcean API对象。

<?php

use DigitalOceanV2\Adapter\BuzzAdapter;
use DigitalOceanV2\DigitalOceanV2;

class Ocean extends CComponent
{
  private $adapter;
  private $digitalOcean;
  
   function __construct() {     
     // create an adapter with your access token which can be
     // generated at https://cloud.digitalocean.com/settings/applications
     $this->adapter = new BuzzAdapter(Yii::app()->params['ocean']['access_key']);
     // create a digital ocean object with the previous adapter
     $this->digitalOcean = new DigitalOceanV2($this->adapter);
  }

提取液滴

Digital Ocean API控制台管理您的液滴

现在,让我们获取活动液滴的列表。 在/app/protected/models/Droplet.php ,我们的sync方法调用Ocean组件并获取液滴:

public function sync() {
    $ocean = new Ocean();
    $droplets = $ocean->getDroplets();
    foreach ($droplets as $d) {
      $droplet_id = $this->add($d);
    }	      
  }

这是Ocean getDroplets方法的外观:

public function getDroplets() {
    // return the action api
    $action  = $this->digitalOcean->droplet();
    // return a collection of Action entity
    $actions = $action->getAll();    
    return $actions;
  }

注意:基本控制台应用程序只是对我们的Droplet列表进行单向下载同步。 您可以自己实现更多功能,包括删除云中已删除的液滴。

这是我们的Droplet模型的add函数。 如果小滴已经存在,我们只需更新记录:

public function add($droplet) {
     $d = Droplet::model()->findByAttributes(array('droplet_id'=>$droplet->id));
    if (empty($d)) {
      $d = new Droplet;
    }
    $d->user_id = Yii::app()->user->id;
      $d->droplet_id = $droplet->id;
      $d->name = $droplet->name;
      $d->vcpus = $droplet->vcpus;
      $d->memory = $droplet->memory;
      $d->disk = $droplet->disk;
      $d->status = $droplet->status;
      $d->active =1;
     $d->created_at = $d->created_at;
     $d->modified_at =new CDbExpression('NOW()');          
     $d->save();
    return $d->id;
   }

如果您想扩展模型的功能,Digital Ocean提供了各种各样的Droplet API操作 ,Corcy 此处提供了一系列清晰的示例

获取图像

接下来,我们将使用API​​来获取当前图像的列表。 映像是在给定时间点从服务器实例获取的快照,本质上是备份。

Digital Ocean API控制台管理您的图像

我们的Snapshot.php模型具有sync操作,该操作会请求您的图像列表并将其分别添加到数据库中:

public function 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);        
       }
     }          
   }

这是Ocean组件的getSnapshots代码:

public function getSnapshots() {
    // return the action api
    $action  = $this->digitalOcean->image();
    // return a collection of Action entity
    $actions = $action->getAll();    
    return $actions;
  }

这是Snapshot模型的add代码-我们忽略了Digital Ocean的公开应用程序图像,这些图像被区分为公开图像:

public function 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) and $snapshot->public ==1) {
       return false; // no need to save public images right now
     } else 
       $i->user_id = Yii::app()->user->id;       
       $i->image_id = $snapshot->id;
       $i->name = $snapshot->name;
       $i->region = $snapshot->regions[0];
       $i->active =1;
       $i->modified_at =new CDbExpression('NOW()');          
      $i->save();
    return $i->id;
    }

自动快照

正如我们在Digital Ocean上构建要转售的应用程序映像中所讨论的,自动化创建快照可以将其传输给客户和客户非常有用。 不幸的是,目前尚无办法通过引用克隆或传输图像。 每次将快照转移到另一个帐户时,快照都消失了。

由于Digital Ocean要求您将图像实例化为Droplet并关闭电源,然后再拍摄新快照,因此重复创建快照是一项耗时的手动过程。 拍摄快照后,Digital Ocean再次启动液滴将无济于事–这只会减慢该过程。

由于API在其他操作处于待处理状态时不接受请求,因此我们必须构建一个表来跟踪后台操作,并使用cron作业重复关闭电源,执行快照操作。 运作方式如下:

访问“ 图像”页面,然后单击“ 查看”以获取要克隆的快照。 然后,单击右侧的“ 复制”菜单选项。

查看图像快照并复制

这将创建一个小滴,并使用此image_iddroplet_id将一个条目添加到后台操作表中。 end_stage是可以设置的常量,指示要创建的重复项的数量。

动作表中代表后台进程的行

这是Snapshot模型的replicate()方法:

public function replicate($id) {
        // look up image_id
      $snapshot = Snapshot::model()->findByAttributes(array('id'=>$id));
  	  // create the droplet 
      $ocean = new Ocean();
      $droplet_id = $ocean->launch_droplet($snapshot->name,$snapshot->region,$snapshot->image_id);
  	  // add command to action table with droplet_id and 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;
    // user settable constant for number of replications to make
      $a->end_stage = Snapshot::NUMBER_REPLICATIONS;
      $a->last_checked = 0;
      $a->modified_at =new CDbExpression('NOW()');          
      $a->created_at =new CDbExpression('NOW()');          
      $a->save(); 
    }

cron任务会ping http://ocean.yourdomain.com/daemon/index以定期处理操作表。 任何未完成的过期项目将请求另一个快照。

这是Action模型的process()方法:

public function process() {
	  set_time_limit(0);
	  // look for overdue actions	  
	  $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);          
	    }
	  }
	}

快照过程将关闭Droplet,暂停20秒以等待Droplet关闭,然后请求快照。

液滴关闭睡眠和快照

这是Snapshot模型的take()方法:

public function take($action_id) {
    $result = false;
      $a = Action::model()->findByPk($action_id);
    $snapshot = Snapshot::model()->findByAttributes(array('image_id'=>$a->snapshot_id));
    $ocean = new Ocean();
    // attempt shutdown
    // take snapshot
    $result = $ocean->snapshot($a->stage,$a->droplet_id,$snapshot->name,$snapshot->region,$snapshot->image_id);
    // if snapshot was successful
    if ($result) {
      // increment stage
      $a->stage+=1;
      // if last snapshot replication complete, end action
      if ($a->stage >= $a->end_stage)  
        $a->status = Action::STATUS_COMPLETE;
    } 
	  // either way, update last_checked
    $a->last_checked = time();
    $a->save();              
	  return $result;
  }

这是Ocean组件中用于实际进行API调用的代码:

public function snapshot($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 'Shutting down '.$droplet_id;lb();
        $shutdown = $droplet->shutdown($droplet_id);
      } catch (Exception $e) {
          $err = $e->getMessage();
          echo 'Caught exception: ',  $e->getMessage(), "\n";
          if (stristr ( $err , 'already powered off')===false)
            return false;
          else
            $no_sleep = true;
      }
    if (!$no_sleep) {
      echo 'Sleep 20 seconds for power off...';lb();
      sleep(20);              
    }
    echo 'Take snapshot of '.$droplet_id.' named '.$name.'-copy-'.$stage;lb();
    try {
      $snapshot = $droplet->snapshot($droplet_id, $name.'-copy-'.$stage); 
    } catch (Exception $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
        return false;
    }
    // shutdown and snapshot successful
    return true;
  }

如果您访问Digital Ocean网站查看液滴,您将看到正在进行的操作:

正在进行液滴快照

如果快照成功,它将返回到快照模型以增加阶段。 阶段复制数完成后,操作即告完成。

您可以访问Digital Ocean网站上的“ 图像”页面以查看复制的快照:

快照的克隆副本

创建图像后,您可以手动删除小滴,也可以在达到STATUS_COMPLETE时扩展代码来删除小滴。 如果不删除小滴,则需要付费。

请注意,目前,该API不提供将快照传输到电子邮件地址的功能,因此您将需要继续通过Web界面手动执行此操作。

下一步是什么?

我希望您喜欢本教程,并发现Digital Ocean在您的工具和托管提供商组合中是一项有用的服务。 在下一个教程中,我们将探索Digital Ocean DNS服务。

请随时在下面发表您的问题和评论。 您也可以通过Twitter @reifman 联系或直接给我发送电子邮件 。 关注我的Tuts +讲师页面,以查看本系列的后续文章。

相关链接

翻译自: https://code.tutsplus.com/tutorials/using-the-digital-ocean-api-to-manage-cloud-instances--cms-22864

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值