数字海洋 - 如何在创建后启用Droplet时收到通知

时间:2016-02-17 11:08:18

标签: api digital-ocean

我正在使用DO API和Ansible开发自动化脚本。我可以创造很多水滴但是如何知道创建的水滴是否已经活跃?

第一种(幼稚)方法使用以下过程:

A. Create droplet with the Digital Ocean API
B. Call the API to get the created droplet informations
    1. is active ?
        yes : 
        no : go to B

在最好的世界中,在创建了Droplet之后,我会收到通知(就像创建Droplet时执行的webhoock)。有可能吗?

非常感谢

2 个答案:

答案 0 :(得分:3)

查看API文档https://developers.digitalocean.com/documentation/v2/

您应该能够看到Droplet的状态(参见水滴部分)。

使用你的逻辑你可以:

  1. 创建Droplet并将id存储在变量
  2. 睡1分钟
  3. 使用id / v2 / drops / $ DROPLET_ID调用Droplet。
  4. 测试响应状态(表示Droplet实例状态的状态字符串。这可能是" new"," active"," off",或者"存档"。)
  5. 如果status == new doing something
  6. <强>更新

    另一种方法是在创建Droplet时修改它。使用Digital ocean,您可以传递User Data,之前我已经使用它自动配置服务器,这是一个示例。

    $user_data = <<<EOD
    #!/bin/bash
    
    apt-get update 
    apt-get -y install apache2 
    apt-get -y install php5 
    apt-get -y install php5-mysql 
    apt-get -y install unzip 
    service apache2 restart 
    cd /var/www/html 
    mkdir pack 
    cd pack 
    wget --user {$wgetUser} --password {$wgetPass} http://x.x.x.x/pack.tar.gz
    tar -xvf pack.tar.gz 
    php update.php
    EOD;
    
    
        //Start of the droplet creation
        $data = array(
                        "name"=>"AutoRes".$humanProv.strtoupper($lang), 
                        "region"=>randomRegion(), 
                        "size"=>"512mb", 
                        "image"=>"ubuntu-14-04-x64",
                        "ssh_keys"=>$sshKey,
                        "backups"=>false,
                        "ipv6"=>false,
                        "user_data"=>$user_data,
                        "private_networking"=>null,
                        );
    
        $chDroplet = curl_init('https://api.digitalocean.com/v2/droplets');
        curl_setopt($chDroplet, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($chDroplet, CURLOPT_POSTFIELDS, json_encode($data)  );
        curl_setopt($chDroplet, CURLOPT_HTTPHEADER, array(
            'Authorization: Bearer '.$apiKey,
            'Content-Type: application/json',
            'Content-Length: ' . strlen(json_encode($data)),
        ));
    

    基本上,一旦Droplet处于活动状态,它将运行这些命令,然后从我的服务器下载tar.gz文件并执行它,您可能会创建update.php来调用您的服务器,从而更新Droplet在线。

答案 1 :(得分:1)

对于第一种方法,DigitalOcean的API也会返回Action items。这些可用于检查您采取的不同操作的状态。返回的json看起来像:

{
  "action": {
    "id": 36804636,
    "status": "completed",
    "type": "create",
    "started_at": "2014-11-14T16:29:21Z",
    "completed_at": "2014-11-14T16:30:06Z",
    "resource_id": 3164444,
    "resource_type": "droplet",
    "region": "nyc3",
    "region_slug": "nyc3"
  }
}

以下是如何使用它们的简单示例:

import os, time
import requests

token = os.getenv('DO_TOKEN')
url = "https://api.digitalocean.com/v2/droplets"

payload = {'name': 'example.com', 'region': 'nyc3', 'size': '512mb', "image": "ubuntu-14-04-x64"}
headers = {'Authorization': 'Bearer {}'.format(token)}

r = requests.post(url, headers=headers, json=payload)

action_url = r.json()['links']['actions'][0]['href']

r = requests.get(action_url, headers=headers)
status = r.json()['action']['status']

while status != u'completed':
    print('Waiting for Droplet...')
    time.sleep(2)
    r = requests.get(action_url, headers=headers)
    status = r.json()['action']['status']

print('Droplet ready...')