介绍
在本教程中,我们将使用我们的软件和配置创建一个主瞬间图像,然后使用使用此图像的DigitalOcean API自动部署滴滴。
前提条件
- Ruby应该安装在你将使用的计算机上连接到API上。
- DropletKit宝石也应该安装在这个环境中。
步骤一:创建你的主图像
在本教程中,我们将基于 LAMP One-Click Image创建主图像,设置我们的默认配置,然后使用它来创建一张快照图像。 快照每月每 gigabyte 费用为 0.05 美元,根据文件系统中使用的空间量。
创建一个新的滴滴
我们将从控制面板中创建一个名为lamp-master
的新滴滴,从应用程序卡中选择LAMP图像,这张图像将为我们提供一个预先构建的Ubuntu 14.04服务器,具有Apache,MySQL和PHP。
当我们创建滴滴时,我们将使用它来生成我们的主滴图像,重要的是选择我们可以做的最小的滴滴计划。一旦我们创建了我们的滴滴,它只能用于在同一平面或更大的平面上创建滴滴。
一旦我们的新滴已经创建,使用SSH客户端连接到它。
初始配置
现在我们已经连接到我们的新滴滴,我们可以配置任何设置或安装我们想要在我们的主图像部署的所有滴滴上所需的任何包。
1sudo apt-get update
2sudo apt-get install php5-curl php5-imagick
创建 Snapshot
现在我们已经添加了我们想要的额外的软件,我们可以关闭我们的滴滴并创建我们的快照. 虽然可以拍摄运行系统的快照,但下电确保文件系统处于一致的状态:
1sudo poweroff
虽然我们可以从控制面板创建我们的快照,但为本教程的目的,我们将从此开始使用API与我们的DigitalOcean帐户一起工作. 这些示例可以使用交互式Ruby(irb')运行,或添加到脚本中并使用
ruby`命令运行。
1require 'droplet_kit'
2token='[your api token]'
3client = DropletKit::Client.new(access_token: token)
为了从API中创建一个快照,我们需要获得我们的主滴的ID,我们可以通过拨打API的滴端点来做到这一点。
1droplets = client.droplets.all
2droplets.each do |droplet|
3 if droplet.name == "lamp-master"
4 puts droplet.id
5 end
6end
此代码片段将调用 API 的 dropplets 终端点,并通过我们的帐户中的 dropplets 寻找一个名为lamp-master
。
现在我们有滴滴 ID 号码,我们可以告诉 API 通过将滴滴 ID 传递给滴滴终端的滴滴拍动作来创建此滴滴的 snapshot. 除了滴滴 ID,我们还会传递一个 snapshot 名称,用于我们的新图像。
1client.droplet_actions.snapshot(droplet_id: '1234567', name: 'lamp-image')
我们提出的 snapshot 请求将返回一个事件 ID 号码,可用于跟踪 snapshot 过程的状态。
第二步:从我们的快照中部署滴滴
我们现在已经创建了一个主 snapshot 图像,我们可以用来部署滴滴与我们的配置. 就像我们用我们的滴滴一样,我们现在需要查询 API 以获取我们新 snapshot 的图像 ID。
1images = client.images.all(public:false)
2images.each do |image|
3 if image.name == "lamp-image"
4 puts image.id
5 end
6end
与上面的滴滴识别示例一样,这个代码将循环通过我们的帐户上的快照和备份图像,并显示名为灯光图像
的图像ID。
现在我们有我们的图像的ID号码,我们可以开始部署滴滴。下面的代码将使用我们在纽约3地区的主片段创建一个新的2GB滴滴。
请注意,我们的快照图像必须存在于我们为创建滴滴所指定的区域,您可以通过控制面板或API的 图像终端将图像传输到其他区域。
1droplet = DropletKit::Droplet.new(name: 'my-lamp-server', region: 'nyc3', size: '2gb', image: '1234567')
2client.droplets.create(droplet)
第三步:使用用户数据定制
现在我们可以使用我们的自定义配置使用API部署新滴滴,但我们可能希望进一步个性化我们的新滴滴。
对于这个例子,我们将预先加载一个自定义 index.html 文件,包括它的名称。
1sitename = "example.org"
2userdata = "
3#cloud-config
4
5runcmd:
6- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
7"
8droplet = DropletKit::Droplet.new(name: sitename, region: 'nyc3', size: '2gb', image: '1234567', user_data: userdata)
9client.droplets.create(droplet)
在这个例子中,我们只是在使用我们新 dropplet 中的echo
命令,将一些 HTML 放入 web root 中的 index.html 文件中。
第四步:把它放在一起
现在我们可以通过API基于我们的快照图像部署滴滴,并定制其内容,使其更进一步,并创建一个交互式脚本,以基于我们的图像发射新的滴滴。
1require 'droplet_kit'
2token='[Your API Token]'
3client = DropletKit::Client.new(access_token: token)
4region = 'nyc3'
5image_id = '1234567'
6droplet_size = '2gb'
7
8puts "Enter a name for your new droplet:"
9sitename = gets.chomp
10
11userdata = "
12#cloud-config
13
14runcmd:
15- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
16"
17sitename.gsub!(/\s/,'-')
18droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
19client.droplets.create(droplet)
代码破解
此脚本首先包括DropletKit客户端,并使用您提供的API代币初始化新客户端连接。
1require 'droplet_kit'
2token='[Your API Token]'
3client = DropletKit::Client.new(access_token: token)
然后我们为我们的滴滴指定几个选项,包括区域,滴滴大小和我们主拍照图像的ID。
1region = 'nyc3'
2image_id = '1234567'
3droplet_size = '2gb'
然后我们要求用户为新滴提供一个名称,并将此信息纳入我们的脚本将为创建过程提供的用户数据中。
1puts "Enter a name for your new droplet:"
2sitename = gets.chomp
3
4userdata = "
5#cloud-config
6
7runcmd:
8- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
9"
一旦我们在 index.html 页面中包含了我们的网站名称,我们需要清理它,以确保它可以作为滴滴名称使用。
1sitename.gsub!(/\s/,'-')
然后我们将所有这些变量聚合在一起,并提交我们的请求来创建新滴。
1droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
2client.droplets.create(droplet)
下一步
使用API,我们可以根据需求创建自定义滴滴,并在创建时包括我们自己的设置或文件。
- 使用 API 的 DNS 端点自动配置您的新 dropplets 的 DNS 记录,当它们启动时。
- 提示用户提供额外的输入,如区域或 dropplet 尺寸。