使用Terraform 在DigitalOcean上创建Droplet
因为想要创建一个用于各种实验的远程服务器,所以我使用了HashiCorp的Terraform工具在DigitalOcean上快速创建了一个服务器(droplet)。
以下是教程的内容。
执行环境
-
- Ubuntu 14.04 64bit (on Vagrant)
※最初は Bash on Windows で試していましたが、どうしても terraform コマンドが失敗して動きませんでした…
Terraform 0.8.6
请安装Terraform。
下载哈希公司的Terraform软件。
从上面的URL中,下载适用于您的平台版本的Terraform。由于我使用的是Ubuntu 14.04(64位),所以我选择了”Linux 64-bit”。
$ wget https://releases.hashicorp.com/terraform/0.8.6/terraform_0.8.6_linux_amd64.zip
$ mkdir -p ~/opt/terraform
$ unzip terraform_0.8.6_linux_amd64.zip -d ~/opt/terraform/
$ echo "export PATH=$PATH:~/opt/terraform" >> ~/.bashrc
$ source ~/.bashrc
$ terraform version
# => "Terraform v0.8.6" と表示されればOK
为了方便查看 DigitalOcean 的响应结果(JSON),我们先安装 jq。
$ sudo curl -o /usr/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && sudo chmod +x /usr/local/bin/jq
数字海洋侧设置
在Digital Ocean上注册SSH公钥
为了使用DigitalOcean的API,需要事先将执行Terraform的机器的公钥注册到DigitalOcean。
首先,我们需要创建并复制一个公钥。
$ ssh-keygen -t rsa
# 対話プロンプトで聞かれる答えは全てそのままで Enter
$ cat ~/.ssh/id_rsa.pub
# 出力結果をコピーする
接下来,我们将在DigitalOcean中注册公钥。具体步骤如下:
-
- 在DigitalOcean管理页面右上角的头像中点击“Settings”
-
- 点击“Security”
-
- 点击“Add SSH Key”
- 将刚刚复制的公钥保存并取一个适当的名称

创建 Digital Ocean API 令牌
接下来,我们将发行API令牌。
-
- 点击菜单中的 “API”
- 点击 “生成新令牌”,并输入一个合适的名称来创建令牌

请把这个令牌复制下来,之后会写入 tf 文件。
获取与SSH公钥对应的ID。
接下来,我们将获取与此公钥对应的DigitalOcean端的ID。为此,首先我们需要确认公钥的SSH指纹。
$ ssh-keygen -lf ~/.ssh/id_rsa.pub | awk '{print $2}'
1a:7c:d5:6c:bf:d6:cf:93:49:39:66:cc:dc:ed:c5:04
获取对应的DigitalOcean ID。
$ curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer <上で発行したAPIトークン>" "https://api.digitalocean.com/v2/account/keys" | jq .
{
"ssh_keys": [
{
"id": 1685442, // <- この値をメモしておく
"fingerprint": "1a:7c:d5:6c:bf:d6:cf:93:49:39:66:cc:dc:ed:c5:04",
"public_key": "...",
"name": "mojamoja"
},
...
]
}
请把这个复制一份,因为我以后会用到。
Terraform的安装和执行设置
创建 Terraform 模板
我們將創建一個名為main.tf的文件,內容如下。
# Configure the DigitalOcean Provider
provider "digitalocean" {
token = "<上で発行したAPIトークン>"
}
resource "digitalocean_droplet" "web" {
image = "ubuntu-14-04-x64"
name = "web-1"
region = "sfo1"
size = "512mb"
ssh_keys = [1685442] # <- 公開鍵に対応するID
}
使用terraform plan来确认即将创建的服务器。
由于对直接创建服务器(droplet)感到害怕,让我们首先进行实验。
$ terraform plan
如果成功返回以下所制定的服务器信息,则表示配置成功。
+ digitalocean_droplet.web
disk: "<computed>"
image: "ubuntu-14-04-x64"
ipv4_address: "<computed>"
ipv4_address_private: "<computed>"
ipv6_address: "<computed>"
ipv6_address_private: "<computed>"
locked: "<computed>"
name: "web-1"
region: "sfo1"
resize_disk: "true"
size: "512mb"
ssh_keys.#: "1"
ssh_keys.0: "6362450"
status: "<computed>"
vcpus: "<computed>"
Plan: 1 to add, 0 to change, 0 to destroy.
使用Terraform apply 进行创建
时间到了。让我们创建一个服务器吧。
$ terraform apply
请等一会儿,创建过程可能需要些时间。如果最终能够按照以下方式输出,那就是成功的。
digitalocean_droplet.web: Creating...
disk: "" => "<computed>"
image: "" => "ubuntu-14-04-x64"
ipv4_address: "" => "<computed>"
ipv4_address_private: "" => "<computed>"
ipv6_address: "" => "<computed>"
ipv6_address_private: "" => "<computed>"
locked: "" => "<computed>"
name: "" => "web-1"
region: "" => "sfo1"
resize_disk: "" => "true"
size: "" => "512mb"
ssh_keys.#: "" => "1"
ssh_keys.0: "" => "6362450"
status: "" => "<computed>"
vcpus: "" => "<computed>"
digitalocean_droplet.web: Still creating... (10s elapsed)
digitalocean_droplet.web: Still creating... (20s elapsed)
digitalocean_droplet.web: Still creating... (30s elapsed)
digitalocean_droplet.web: Creation complete
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.
State path: terraform.tfstate
我们可以在管理界面中确认已成功创建。

另外,您可以通过使用公钥登录到使用公钥创建的服务器。因为没有生成密码,所以无法使用用户名和密码登录。
$ ssh -i ~/.ssh/id_rsa root@192.241.225.19
使用terraform show命令来确认服务器信息。
您可以使用 ‘terraform show’ 命令来查看已创建服务器的信息。
$ terraform show
digitalocean_droplet.web:
id = 39676265
disk = 20
image = ubuntu-14-04-x64
ipv4_address = 192.241.225.19
locked = false
name = web-1
region = sfo1
resize_disk = true
size = 512mb
ssh_keys.# = 1
ssh_keys.0 = 6362450
status = active
tags.# = 0
vcpus = 1
使用terraform destroy命令来删除服务器。
实验已经完成了。由于服务器费用太高,我们应该把它删除掉。
附带提及,运行 “terraform plan -destroy” 可以事先确认要删除哪些服务器。
$ terraform plan -destroy
...
digitalocean_droplet.web: Refreshing state... (ID: 39676265)
...
- digitalocean_droplet.web
在实际进行删除时,请使用 `terraform destroy` 命令。本次操作将使用 `-force` 选项,无需确认即可强制删除。
$ terraform destroy -force
digitalocean_droplet.web: Refreshing state... (ID: 39676265)
digitalocean_droplet.web: Destroying...
digitalocean_droplet.web: Still destroying... (10s elapsed)
digitalocean_droplet.web: Destruction complete
Destroy complete! Resources: 1 destroyed.
搞定了!
请提供使用权。
如果这篇文章对您有帮助的话,请务必从 https://m.do.co/c/30c30cfa4783 链接注册DigitalOcean。我将获得25美元,而您将获得10美元的使用权。
请提供一些上述问题的中文译文。
-
- Terraform簡易チュートリアル on AWS – Qiita
-
- terraformでDigitalOceanに簡単ドロップレット作成 – Hack Your Design!
-
- Provider: DigitalOcean – Terraform by HashiCorp
-
- DigitalOcean: digitalocean_droplet – Terraform by HashiCorp
- jq コマンドの Linux への速攻インストール – Qiita