如何使用API​​来部署Droplet从主快照

了解如何使用API​​ DigitalOcean旋转起来基于主快照映像的Droplet。

介绍

在本教程中,我们将使用我们的软件和配置创建主快照映像,然后使用DigitalOcean API使用此映像自动部署Droplet。 在本教程中的示例将使用Ruby的官方DigitalOcean API客户端DropletKit

先决条件

  • Ruby应安装要使用连接到API的计算机上。
  • DropletKitGem应安装在这样的环境下也是如此。
  • 你应该生成API令牌为脚本,以使用。

第一步:创建您的主映像

在本教程中,我们将创建一个基于主映像LAMP一键图片 ,建立我们的默认配置,然后用它来创建一个快照映像。 根据文件系统中使用的空间量,快照每月每GB费用为0.05美元。 我们将能够使用DigitalOcean API部署我们定制的LAMP的多个实例。

创建新的Droplet

我们将通过创建一个新的名为Droplet启动lamp-master从控制面板中的应用程序选项卡中选择LAMP形象。 这个镜像将为我们提供一个预先构建的带有Apache,MySQL和PHP的Ubuntu 14.04服务器。

当创建Droplet时,我们将使用生成我们的主快照图像,重要的是选择最小的Droplet计划。 一旦我们创建了快照,它只能用于在同一计划或更大的计划上创建Droplet。 例如,如果我们使用1GBDroplet创建主快照,我们可以使用它在1GB,2GB或其他更大的计划上启动Droplet,但是我们无法从该快照启动具有512MB RAM的Droplet。

一旦我们的新Droplet创建,使用SSH客户端连接到它。

初始配置

现在我们连接到我们的新Droplet,我们可以配置任何设置或安装我们想要从我们的主映像部署的所有Droplet的任何包。 在这种情况下,我们将安装两个额外的php模块; curl和Imagemagick。

sudo apt-get update
sudo apt-get install php5-curl php5-imagick

创建快照

现在我们已经添加了我们想要的附加软件,我们可以关闭我们的Droplet并创建我们的快照。 虽然可以拍摄正在运行的系统的快照,但关闭电源可确保文件系统处于一致状态:

sudo poweroff

虽然我们可以从控制面板创建我们的快照,但为了本教程的目的,我们将使用API​​从这一点开始使用我们的DigitalOcean帐户。 这些例子可以通过交互式Ruby(运行irb )或添加到脚本,并与运行ruby命令。 第一步将包括DropletKit客户端。

require 'droplet_kit'
token='[your api token]'
client = DropletKit::Client.new(access_token: token)

为了从API创建快照,我们需要获取主Droplet的ID。 我们可以通过调用API的Droplet端点来做到这一点。

droplets = client.droplets.all
droplets.each do |droplet|
  if droplet.name == "lamp-master"
    puts droplet.id
  end
end

这段代码将使该API和遍历我们的帐户Droplet的Droplet端点的通话寻找一个名为lamp-master 当它找到它,脚本然后将显示此Droplet的ID号。

现在我们有我们的DropletID号,我们可以告诉API通过将DropletID传递到Droplet端点的快照动作来创建这个Droplet的快照。 除了DropletID,我们还将传递一个快照名称,将用于我们的新图像。 在这种情况下,我们决定命名为快照lamp-image

client.droplet_actions.snapshot(droplet_id: '1234567', name: 'lamp-image')

我们做了返回可用于跟踪快照过程的状态的事件ID号快照的要求。 本教程将提供使用事件ID的更多信息。

第二步:从我们的快照部署Droplets

我们现在创建了一个主快照映像,我们可以使用它来配置我们的配置。 正如我们对我们的Droplet,我们现在需要查询API以获取我们的新快照的图像ID。

images = client.images.all(public:false)
images.each do |image|
  if image.name == "lamp-image"
    puts image.id
  end
end

正如我们上面通过我们的帐户快照和备份映像此代码将循环Droplet识别的例子,显示图像命名为ID lamp-image

现在我们有我们的图像的ID号码,我们可以开始部署Droplet。 以下代码将使用我们在纽约3地区的主快照创建一个新的2GBDroplet。

请注意,我们的快照图像需要存在于我们为Droplet创建指定的区域中。 您可以通过控制面板或通过API的图像传输到更多区域的图像端点

droplet = DropletKit::Droplet.new(name: 'my-lamp-server', region: 'nyc3', size: '2gb', image: '1234567')
client.droplets.create(droplet)

第三步:使用用户数据进行定制

我们现在可以使用API​​通过我们的自定义配置部署新的Droplet,但我们可能需要进一步自定义我们的新Droplet单独。 当我们创建它们时,我们可以通过发送用户数据到我们的Droplet来执行额外的定制。

对于这个例子,我们将在我们的新的Droplet上预先加载一个自定义的index.html文件,包括它的名字。

sitename = "example.org"
userdata = "
#cloud-config

runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
droplet = DropletKit::Droplet.new(name: sitename, region: 'nyc3', size: '2gb', image: '1234567', user_data: userdata)
client.droplets.create(droplet)

在这个例子中,我们只是利用echo我们新的Droplet内部命令一些HTML拖放到Web根index.html文件。 通过使用其他命令,你可以选择直接在你的Droplet配置新virtualhosts,从远程服务器拉下其他配置细节或做任何事情,你可以通过ssh连接做的。 您可以了解更多有关用户的数据在这里

第四步:把它放在一起

现在,我们可以通过API部署基于我们的快照图像的Droplet,并自定义其内容,让我们进一步,创建一个交互式脚本,以基于我们的图像启动新的Droplet。 以下脚本假定我们已经创建了快照映像并且它的ID可用。

require 'droplet_kit'
token='[Your API Token]'
client = DropletKit::Client.new(access_token: token)
region = 'nyc3'
image_id = '1234567'
droplet_size = '2gb'

puts "Enter a name for your new droplet:"
sitename = gets.chomp

userdata = "
#cloud-config

runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
sitename.gsub!(/\s/,'-')
droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
client.droplets.create(droplet)

代码细分

此脚本首先包括DropletKit客户端,并使用您提供的API令牌初始化新的客户端连接。

require 'droplet_kit'
token='[Your API Token]'
client = DropletKit::Client.new(access_token: token)

然后,我们为我们的Droplet指定几个选项,包括区域,Droplet大小和主快照图像的ID。

region = 'nyc3'
image_id = '1234567'
droplet_size = '2gb'

然后我们提示用户为新的Droplet提供一个名称,并将这些信息包括在我们的脚本将提供给创建过程的用户数据中。

puts "Enter a name for your new droplet:"
sitename = gets.chomp

userdata = "
#cloud-config

runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"

一旦我们在我们的index.html页面中包含我们的网站名称,我们需要对其进行清理,以确保它可以用作Droplet名称。 由于Droplet名称中不能有空格,因此我们将用虚线替换任何空格。

sitename.gsub!(/\s/,'-')

然后我们把所有这些变量放在一起,并提交我们的请求创建新的Droplet。

droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
client.droplets.create(droplet)

下一步

使用API​​,我们可以根据需要创建自定义Droplet,并在创建时包括我们自己的设置或文件。 您可以选择通过向此脚本添加其他功能来扩展这些基础知识。 可能的改进包括。

  • 使用DNS端点的API来自动配置DNS记录为您的新的Droplet它们启动时。

  • 提示用户输入其他输入,例如区域或Droplet大小。

  • 使用用户数据runcmd调用将Web内容下载到新的Droplet或填充MySQL数据库。