大家好,欢迎!今天我们将带大家了解如何通过 Terraform 在 Digital Ocean 上创建一个服务器(也称为 droplet)。这是 Terraform 能够实现的最简单的事情之一,但它有助于阐明对基本概念的理解,例如基础设施即代码 (IaC)、Terraform 本身、Terraform 模块、云服务器以及基本的网络和安全实践。
你可以在 Github 上找到本教程的代码库 此处。
事不宜迟,让我们直接开始吧 🚀
为了能够使用 Terraform 做任何事情,我们首先需要在我们的系统上安装它。Terraform 官方文档中有一份详尽的列表,介绍了在不同系统上安装 Terraform 的不同方法。请参阅此指南 此处。
Acquire Digital Ocean Credentials
为了能够验证和授权 Terraform 在 Digital Ocean 上创建我们的服务器,我们需要适当的凭证。根据所使用的 Terraform 提供商,Terraform 需要不同类型的凭证。为了对负责应用我们配置的提供商进行身份验证和授权,我们将需要一个 Digital Ocean API Token,你可以从下方屏幕中获取。

在已通过身份验证的 Digital Ocean 帐户上,其网页地址为 https://cloud.digitalocean.com/account/api/tokens。
在 Digital Ocean 上创建你的 API Token 时,请务必为你的令牌启用 Write 权限范围。如果没有这个权限,Terraform 将无法为你创建资源。别忘了同时设置一个合适的过期时间。

Setup the Digital Ocean Terraform provider
现在我们已经拥有了用于 Terraform 身份验证和授权的 API Token,我们可以开始创建我们的 Terraform 配置了。首先,我们将创建一个 providers.tf 文件。在这个文件内,我们将提供必要的配置来设置 Digital Ocean (digitalocean) 提供商。
要了解有关 Terraform 提供商的更多信息,请访问 https://developer.hashicorp.com/terraform/language/providers
我们将以以下内容开始我们的文件:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}这里设置了 terraform block。在这个区块中,我们将 digitalocean 提供商配置为必需的提供商。
有关 digitalocean 提供商的详细信息,可以在其文档页面中找到 https://registry.terraform.io/providers/digitalocean/digitalocean/latest/docs
接下来,我们将通过将以下代码追加到我们的 providers.tf 文件中来配置提供商本身:
# Configure the DigitalOcean Provider
provider "digitalocean" {
token = var.do_token
}这段代码使用访问令牌 token 来配置 digitalocean 提供商。这与我们在第 1 步中获取的令牌相同。
作为一项最佳实践,千万不要将帐户的机密信息直接作为值提供给你的 Terraform 配置文件,因为这会使其完全暴露在潜在的恶意使用中。在上面我们的代码中,我们将 API 密钥作为 Terraform 变量 var.do_token 提供。
有几种方法可以将我们 API 密钥的真实值提供给 Terraform。
- 我们可以创建一个
terraform.tfvars文件,并像这样填入我们变量的值:
do_token=real_key_value- 我们可以 在我们的主机上创建一个名为
TF_VAR_do_token的环境变量,并将其值设置为我们密钥的值,如下所示:
export TF_VAR_do_token=real_key_value在每种情况下,请将 real_key_value 替换为你的 API 密钥的适当值。
通过这两种方法,Terraform 在执行我们的配置时都将能够找到我们变量的值。
如果你将通过 terraform.tfvars 文件向你的变量提供值,请确保 永远不要 将其提交到版本控制中。始终只能在本地使用此文件。
如果没有使用上述任何一种方法将值传递给我们的变量,Terraform 在每次执行我们的配置时,都会在命令提示符处提示输入每个变量的值。
Initialize Terraform
在完成我们的提供商配置后,现在是时候初始化我们的 Terraform 配置了。
我们只需在命令行中运行以下命令即可:
terraform init在初始化期间,Terraform 会为我们的配置下载所需的提供商文件,并初始化我们的后端。
为了使本教程保持简单,我们将使用默认的本地 Terraform 后端。要了解有关 Terraform 后端的更多信息,请访问 https://developer.hashicorp.com/terraform/language/settings/backends/configuration
Setup the server deploy configuration
在 Terraform 初始化之后,是时候真正创建部署我们服务器(在 Digital Ocean 术语中也称为 droplet)的配置了。
我们将从创建一个新文件 server.tf 开始。我们的配置如下:
resource "digitalocean_vpc" "server_vpc" {
name = "server-vpc"
region = var.do_region
ip_range = "10.10.10.0/24"
}
resource "digitalocean_droplet" "server" {
name = "server"
size = "s-1vcpu-1gb"
image = "ubuntu-22-04-x64"
region = var.do_region
vpc_uuid = digitalocean_vpc.server_vpc.id
}我们的代码创建了两个 Terraform 资源区块。第一个是 digitalocean_vpc 资源,它创建了我们服务器在 Digital Ocean 上将驻留的虚拟专用网络。
name属性配置了我们 vpc 网络的名称region属性通过var.do_region变量,配置了我们希望 vpc 部署在世界上的哪个区域ip_range属性配置了我们网络首选的 IP 地址范围vpc_uuid属性指示我们的服务器被放置在我们第一步创建的server-vpc网络中
第二个区块创建了一个 Terraform 的 digitalocean_droplet 资源,并为其配置了 name、size、image 和 region 属性。这些属性对于在 Digital Ocean 上创建我们的服务器来说是强制性的。
顾名思义:
name属性配置了我们在 Digital Ocean 上的服务器的名称size属性配置了我们服务器的处理器 (cpu) 和内存 (RAM) 组合image属性配置了我们希望服务器自带的特定操作系统镜像region属性配置了我们希望服务器部署在世界上什么位置。
你可能猜到了,这些属性可以具有许多其他非我们在此处指定的值。访问 Digital Ocean 文档将会产生更完整的值列表以供进一步使用。
这里你需要根据我们资源区块的要求创建 var.do_region 变量。根据你选择向 terraform 传递变量值的方法,你需要创建第二个变量。
如果你选择通过文件配置,请将以下行包含到你的 terraform.tfvars 文件中;
do_region=fra1或者按照如下方式创建一个额外的环境变量;
export TF_VAR_do_region=fra1注意: fra1 指的是 Digital Ocean 的法兰克福数据中心。访问 Digital Ocean 文档以找出可以使用的可能替代数据中心。
Apply the Terraform configuration
现在是时候应用我们的 terraform 配置并在 Digital Ocean 上创建我们的资源了。为了确认我们将做的事情正如我们所愿,我们将首先运行 terraform plan 命令。
此命令的输出应类似于以下内容;

查看输出底部,将会显示 2 to add, 0 to change, 0 to destroy。这意味着我们一切正常,因为我们将添加两个资源,不更改任何资源,也不销毁任何资源。
如果我们的输出与上面图示匹配,那么我们可以继续运行 terraform apply 来应用我们的配置。
将会出现一个类似于下方的确认屏幕,我们应该回答 yes。

成功后,我们应该会从 Terraform 获得类似如下的输出;

太棒了!!🎉 🎉 你已通过 Terraform 成功地将服务器部署到 Digital Ocean。
恭喜你通过基础设施即代码在 Digital Ocean 上创建你的服务器。重要的是,你要记得在不再使用服务器时销毁它,以避免对你的支付信息产生意外计费。
在你不再需要服务器的那一刻,请运行 terraform destroy 命令并确认 yes 以销毁你的服务器。
希望你觉得这篇文章有帮助!再见!!
继续阅读
Self Hosting 项目 (从零开始的 DevOps 基础设施)
使用 Terraform、Ansible 和 Docker 从零开始构建自托管 DevOps 基础设施的全面指南。
通过 Github Pull Requests、Actions、Bot、Environments 和远程后端(Remote Backend)协作实现 Terraform 核心工作流。
使用 GitHub Actions、pull requests 和远程后端为生产团队实现协作式 Terraform 工作流。
通过 Ansible 将 Jenkins 自动部署到远程服务器(带有免费 SSL)(操作指南)
了解如何使用 Ansible 自动部署自托管的 Jenkins 服务器,并配有免费的自动续订 SSL 证书。
