大家好,欢迎!今天我们将带大家了解如何通过 Terraform 在 Digital Ocean 上创建一个服务器(也称为 droplet)。这是 Terraform 能够实现的最简单的事情之一,但它有助于阐明对基本概念的理解,例如基础设施即代码 (IaC)、Terraform 本身、Terraform 模块、云服务器以及基本的网络和安全实践。
iTip+
你可以在 Github 上找到本教程的代码库 此处。
事不宜迟,让我们直接开始吧 🚀
iTip+
为了能够使用 Terraform 做任何事情,我们首先需要在我们的系统上安装它。Terraform 官方文档中有一份详尽的列表,介绍了在不同系统上安装 Terraform 的不同方法。请参阅此指南 此处。
Acquire Digital Ocean Credentials
为了能够验证和授权 Terraform 在 Digital Ocean 上创建我们的服务器,我们需要适当的凭证。根据所使用的 Terraform 提供商,Terraform 需要不同类型的凭证。为了对负责应用我们配置的提供商进行身份验证和授权,我们将需要一个 Digital Ocean API Token,你可以从下方屏幕中获取。
iTip+
在已通过身份验证的 Digital Ocean 帐户上,其网页地址为 https://cloud.digitalocean.com/account/api/tokens。
iWarning+
在 Digital Ocean 上创建你的 API Token 时,请务必为你的令牌启用 Write 权限范围。如果没有这个权限,Terraform 将无法为你创建资源。别忘了同时设置一个合适的过期时间。
Setup the Digital Ocean Terraform provider
现在我们已经拥有了用于 Terraform 身份验证和授权的 API Token,我们可以开始创建我们的 Terraform 配置了。首先,我们将创建一个 providers.tf 文件。在这个文件内,我们将提供必要的配置来设置 Digital Ocean (digitalocean) 提供商。
iTip+
要了解有关 Terraform 提供商的更多信息,请访问 https://developer.hashicorp.com/terraform/language/providers
我们将以以下内容开始我们的文件:
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}这里设置了 terraform block。在这个区块中,我们将 digitalocean 提供商配置为必需的提供商。
iTip+
有关 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 步中获取的令牌相同。
iTip+
作为一项最佳实践,千万不要将帐户的机密信息直接作为值提供给你的 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 在执行我们的配置时都将能够找到我们变量的值。
iWarning+
如果你将通过 terraform.tfvars 文件向你的变量提供值,请确保 永远不要 将其提交到版本控制中。始终只能在本地使用此文件。
iTip+
如果没有使用上述任何一种方法将值传递给我们的变量,Terraform 在每次执行我们的配置时,都会在命令提示符处提示输入每个变量的值。
Initialize Terraform
在完成我们的提供商配置后,现在是时候初始化我们的 Terraform 配置了。
我们只需在命令行中运行以下命令即可:
terraform init在初始化期间,Terraform 会为我们的配置下载所需的提供商文件,并初始化我们的后端。
iTip+
为了使本教程保持简单,我们将使用默认的本地 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属性配置了我们希望服务器部署在世界上什么位置。
iTip+
你可能猜到了,这些属性可以具有许多其他非我们在此处指定的值。访问 Digital Ocean 文档将会产生更完整的值列表以供进一步使用。
iWarning+
这里你需要根据我们资源区块的要求创建 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。
iWarning+
恭喜你通过基础设施即代码在 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 证书。
