如何使用API从主快照部署Droplet
介绍
在本教程中,我们将使用我们的软件和配置创建一个主快照映像,然后使用 DigitalOcean API 使用此映像自动部署液滴。 本教程中的示例将使用 Ruby DropletKit 的官方 DigitalOcean API 客户端。
先决条件
- Ruby 应该安装在您将用来连接 API 的计算机上。
- DropletKit gem 也应该安装在这个环境中。
- 您应该已经 生成了一个 API 令牌 供您的脚本使用。
第一步:创建您的主映像
在本教程中,我们将基于 LAMP 一键式图像 创建主图像,设置我们的默认配置,然后使用它创建快照图像。 根据文件系统内的已用空间量,快照每月每 GB 的费用为 0.05 美元。 我们将能够使用 DigitalOcean API 部署我们定制的 LAMP 堆栈的多个实例。
创建一个新的液滴
我们将首先从控制面板中创建一个名为 lamp-master
的新液滴,在应用程序选项卡中选择 LAMP 图像。 该图像将为我们提供一个带有 Apache、MySQL 和 PHP 的预构建 Ubuntu 14.04 服务器。
在创建我们将用来生成主快照图像的液滴时,选择我们可以选择的最小液滴计划很重要。 一旦我们创建了快照,它就只能用于在同一计划或更大的计划上创建液滴。 例如,如果我们使用 1GB 的 droplet 创建主快照,我们可以使用它在 1GB、2GB 或其他更大的计划上启动 droplet,但我们将无法从该快照启动具有 512MB RAM 的 droplet。
创建新的 droplet 后,使用 SSH 客户端连接到它。
初始配置
现在我们已连接到新的 Droplet,我们可以配置任何设置或安装我们希望在从主映像部署的所有 Droplet 上拥有的任何包。 在这种情况下,我们将安装两个额外的 php 模块; 卷曲和 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 创建快照,我们需要获取主液滴的 id。 我们可以通过调用 API 的 droplets 端点来做到这一点。
droplets = client.droplets.all droplets.each do |droplet| if droplet.name == "lamp-master" puts droplet.id end end
这段代码将调用 API 的 droplets 端点,并在我们的帐户中循环查找名称为 lamp-master
的 droplets。 当它找到它时,脚本将显示此液滴的 ID 号。
现在我们有了我们的液滴 ID 号,我们可以告诉 API 通过将液滴 ID 传递给液滴端点的快照操作来创建此液滴的快照。 除了液滴 ID,我们还将传递一个快照名称,该名称将用于我们的新图像。 在这种情况下,我们决定将快照命名为 lamp-image
。
client.droplet_actions.snapshot(droplet_id: '1234567', name: 'lamp-image')
我们发出的快照请求将返回一个事件 ID 号,可用于跟踪快照过程的状态。 本教程将提供更多关于使用事件ID的信息。
第二步:从我们的快照部署 Droplet
我们现在已经创建了一个主快照映像,我们可以使用我们的配置来部署 Droplet。 正如我们对 Droplet 所做的那样,我们现在需要查询 API 以获取新快照的图像 ID。
images = client.images.all(public:false) images.each do |image| if image.name == "lamp-image" puts image.id end end
与上面的液滴识别示例一样,此代码将遍历我们帐户上的快照和备份图像,并显示名为 lamp-image
的图像的 ID。
现在我们有了图像的 ID 号,我们可以开始部署 Droplet。 以下代码将使用我们在纽约 3 区域的主快照创建一个新的 2GB 液滴。
请注意,我们的快照图像需要存在于我们为创建液滴指定的区域中。 您可以通过控制面板或 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)
在此示例中,我们只是在新的 droplet 中使用 echo
命令将一些 HTML 拖放到 Web 根目录中的 index.html 文件中。 通过使用其他命令,您可以选择直接在您的 droplet 上配置新的虚拟主机,从远程服务器下拉其他配置详细信息,或者执行您可以通过 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)
然后,我们为我们的液滴指定一些选项,包括区域、液滴大小和主快照图像的 ID。
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 "
在我们的 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)
下一步
使用 API,我们可以按需创建自定义液滴,并在创建时包含我们自己的设置或文件。 您可以选择通过向此脚本添加附加功能来扩展这些基础知识。 可能的改进包括。
- 使用 API 的 DNS 端点 为新的 Droplet 启动时自动配置 DNS 记录。
- 提示用户输入其他输入,例如区域或液滴大小。
- 使用用户数据 runcmd 调用将 Web 内容下载到新的 Droplet 或填充 MySQL 数据库。