介绍
Terraform是一种以有组织的方式构建和管理基础设施的工具。您可以使用它来管理DigitalOcean Droplets、负载均衡器,甚至是DNS条目,除此之外,还可以管理其他提供商提供的各种服务。Terraform使用命令行界面,可以从您的桌面或远程服务器运行。
Terraform通过读取描述构成您的应用程序环境或数据中心的组件的配置文件来工作。根据配置,它生成一个执行计划,描述它将执行什么操作以达到所需状态。然后,您可以使用Terraform执行此计划来构建基础设施。当配置发生变化时,Terraform可以生成并执行增量计划,以将现有基础设施更新到新描述的状态。
在本教程中,您将安装Terraform,并使用它在DigitalOcean上创建一个由两个Nginx服务器组成的基础设施,这些服务器由一个DigitalOcean负载均衡器负载均衡。然后,您将使用Terraform在DigitalOcean上添加一个指向负载均衡器的DNS条目。这将帮助您开始使用Terraform,并让您了解如何使用它来管理和部署符合您自己需求的基于DigitalOcean的基础设施。
注意:此教程已使用Terraform 1.1.3
进行测试。
先决条件
要完成本教程,您需要:
- A DigitalOcean account. If you do not have one, sign up for a new account.
- A DigitalOcean Personal Access Token, which you can create via the DigitalOcean control panel. Instructions to do that can be found at: How to Create a Personal Access Token.
- A password-less SSH key added to your DigitalOcean account, which you can create by following How To Use SSH Keys with DigitalOcean Droplets. When you add the key to your account, remember the name you give it, as you’ll need it in this tutorial. (For Terraform to accept the name of your key, it must start with a letter or underscore and may contain only letters, digits, underscores, and dashes.)
- A personal domain pointed to DigitalOcean’s nameserver, which you can do by following the tutorial, How To Point to DigitalOcean Nameservers From Common Domain Registrars.
步骤1 — 安装 Terraform
Terraform 是一个命令行工具,您可以在您的桌面上或远程服务器上运行它。要安装它,您需要下载并将其放置在您的 PATH
中,以便您可以在您正在工作的任何目录中执行它。
首先,从 官方下载页面 下载适用于您的操作系统和架构的适当软件包。如果您使用的是 macOS 或 Linux,则可以使用 curl
下载 Terraform。
在 macOS 上,使用以下命令下载 Terraform 并将其放置在您的主目录中:
在 Linux 上,使用以下命令:
创建 ~/opt/terraform
目录:
然后,使用 unzip
命令将 Terraform 解压缩到 ~/opt/terraform
。在 Ubuntu 上,您可以使用 apt
安装 unzip
:
运行以下命令来将下载的存档文件解压缩到 ~/opt/terraform
目录中:
最后,将~/opt/terraform
添加到您的PATH
环境变量中,这样您就可以在执行terraform
命令时无需指定完整的可执行文件路径。
在Linux上,您需要重新定义PATH
在.bashrc
中,这会在新的shell打开时运行。通过运行以下命令打开它进行编辑:
注意:在macOS上,如果使用Bash,则将路径添加到文件.bash_profile
,如果使用ZSH,则添加到.zshrc
。
要将Terraform的路径追加到您的PATH中,请在文件末尾添加以下行:
完成后保存并关闭文件。
现在,您所有的新shell会话都能找到terraform
命令。如果您在Linux系统上使用Bash,请运行以下命令将新的PATH
加载到当前会话中:
如果您在macOS上使用Bash,请执行以下命令:
如果您使用ZSH,请运行以下命令:
要验证您是否已正确安装Terraform,请运行terraform
命令而不带参数:
您将看到类似以下的输出:
OutputUsage: terraform [global options] <subcommand> [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
All other commands:
console Try Terraform expressions at an interactive command prompt
fmt Reformat your configuration in the standard style
force-unlock Release a stuck lock on the current workspace
get Install or upgrade remote Terraform modules
graph Generate a Graphviz graph of the steps in an operation
import Associate existing infrastructure with a Terraform resource
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Show output values from your root module
providers Show the providers required for this configuration
refresh Update the state to match remote systems
show Show the current state or a saved plan
state Advanced state management
taint Mark a resource instance as not fully functional
test Experimental support for module integration testing
untaint Remove the 'tainted' state from a resource instance
version Show the current Terraform version
workspace Workspace management
Global options (use these before the subcommand, if any):
-chdir=DIR Switch to a different working directory before executing the
given subcommand.
-help Show this help output, or the help for a specified subcommand.
-version An alias for the "version" subcommand.
这些是Terraform接受的命令。输出会给您简要的描述,您将在本教程中了解更多相关信息。
现在,Terraform已安装完成,让我们配置它以与DigitalOcean的资源一起使用。
步骤2 — 配置 Terraform 用于 DigitalOcean
Terraform 通过你可以安装的 providers 支持各种服务提供商。每个提供商都有其自己的规范,通常映射到其相应服务提供商的 API。
DigitalOcean 提供商 允许 Terraform 与 DigitalOcean API 进行交互以构建基础设施。此提供商支持创建各种 DigitalOcean 资源,包括以下内容:
- digitalocean_droplet: Droplets(服务器)
- digitalocean_loadbalancer: 负载均衡器
- digitalocean_domain: DNS 域条目
- digitalocean_record: DNS 记录
Terraform 将使用你的 DigitalOcean 个人访问令牌与 DigitalOcean API 进行通信,并管理你帐户中的资源。请不要与他人分享此密钥,并将其排除在脚本和版本控制之外。通过运行以下命令将你的 DigitalOcean 个人访问令牌导出到名为 DO_PAT
的环境变量中:
这将使后续命令中的使用变得更加容易,并将其与你的代码分开。
注意:如果您经常使用Terraform和DigitalOcean,请使用与您在上一步中修改PATH
环境变量时相同的方法将此行添加到您的shell配置文件中。
通过运行以下命令创建一个将存储您的基础设施配置的目录:
导航到新创建的目录:
Terraform配置是以.tf
文件扩展名结尾的文本文件。它们是可读的,并支持注释。(Terraform还支持JSON格式的配置文件,但这里不涉及。)Terraform将以声明性的方式读取您工作目录中的所有配置文件,因此资源和变量定义的顺序并不重要。您的整个基础设施可以存在于单个配置文件中,但应按资源类型将配置文件分开以保持清晰度。
使用Terraform构建基础设施的第一步是定义您要使用的提供程序。
要在Terraform中使用DigitalOcean提供程序,您必须告诉Terraform并使用正确的凭据变量配置插件。创建一个名为provider.tf
的文件,该文件将存储提供程序的配置:
将以下行添加到文件中,告诉Terraform您要使用DigitalOcean提供程序,并指示Terraform在哪里找到它:
然后,在文件中定义以下变量,以便您可以在其余的配置文件中引用它们:
do_token
:您的DigitalOcean个人访问令牌。pvt_key
:私钥位置,以便Terraform可以使用它登录到新的Droplets并安装Nginx。
在运行时将这些变量的值传递给Terraform,而不是在这里硬编码这些值。这样可以使配置更具可移植性。
要定义这些变量,请将以下行添加到文件中:
然后,将以下行添加到配置DigitalOcean提供程序并通过将do_token
分配给提供程序的token
参数来指定您的DigitalOcean帐户的凭据:
最后,您会希望Terraform自动将您的SSH密钥添加到任何新创建的Droplets中。当您将SSH密钥添加到DigitalOcean时,您为其指定了一个名称。Terraform可以使用此名称检索公钥。添加以下行,将terraform
替换为您在DigitalOcean帐户中提供的密钥名称:
您完成的provider.tf
文件将如下所示:
完成后,请保存并关闭文件。
注意:将TF_LOG
环境变量设置为1
将启用对Terraform尝试执行的操作的详细记录。您可以通过运行以下命令来设置它:
通过运行以下命令为您的项目初始化Terraform:
这将读取您的配置并为您的提供程序安装插件。您将在输出中看到已记录的内容:
OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.16.0...
- Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8)
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/cli/plugins/signing.html
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
如果你遇到了困难,Terraform没有按照你的期望工作,你可以通过删除terraform.tfstate
文件并手动销毁已创建的资源(例如,通过控制面板)来重新开始。
现在已配置好Terraform,并可以连接到你的DigitalOcean账户。在下一步中,你将使用Terraform来定义一个将运行Nginx服务器的Droplet。
第3步 — 定义第一个Nginx服务器
你可以使用Terraform在DigitalOcean Droplet上创建并安装软件。在这一步中,你将使用Terraform来配置一个单独的Ubuntu 20.04 Droplet,并安装Nginx Web服务器。
创建一个名为www-1.tf
的新的Terraform配置文件,其中将保存Droplet的配置:
插入以下行来定义Droplet资源:
在上述配置中,第一行定义了一个名为www-1
的digitalocean_droplet资源。其余行指定了Droplet的属性,包括它将驻留在的数据中心以及标识要配置的Droplet大小的slug。在这种情况下,你使用的是s-1vcpu-1gb
,它将创建一个具有一个CPU和1GB RAM的Droplet。(访问此大小slug图表以查看可用的slug。)
ssh_keys
部分指定要添加到 Droplet 的公钥列表。在这种情况下,您正在指定在 provider.tf
中定义的密钥。确保此处的名称与您在 provider.tf
中指定的名称相匹配。
当您运行 Terraform 对 DigitalOcean API 进行操作时,它将收集有关 Droplet 的各种信息,例如其公共和私有 IP 地址。其他资源可以使用此信息在您的配置中。
如果您想知道 Droplet 资源需要哪些参数是必需的或可选的,请参阅官方 Terraform 文档:DigitalOcean Droplet Specification。
要设置 Terraform 可以使用的连接以通过 SSH 连接到服务器,请在文件末尾添加以下行:
这些行描述了 Terraform 如何连接到服务器,因此 Terraform 可以通过 SSH 连接来安装 Nginx。请注意私钥变量 var.pvt_key
的使用——在运行 Terraform 时,您将传递其值。
现在连接已设置,请配置 remote-exec
provisioner,您将使用它来安装 Nginx。将以下行添加到配置中来执行此操作:
请注意,inline
数组中的字符串是 root 用户将运行以安装 Nginx 的命令。
完成的文件如下所示:
保存文件并退出编辑器。你已经定义了服务器,并且准备部署它,现在你将执行部署。
步骤 4 — 使用 Terraform 创建 Nginx 服务器
你当前的 Terraform 配置描述了一个单独的 Nginx 服务器。你现在将按照定义的方式部署 Droplet。
运行 terraform plan
命令来查看执行计划,即 Terraform 将尝试执行的操作,以构建你描述的基础设施。你需要为你的 DigitalOcean 访问令牌和私钥路径指定值,因为你的配置使用这些信息来访问你的 Droplet 来安装 Nginx。运行以下命令来创建计划:
警告: terraform plan
命令支持一个 -out
参数来保存计划。然而,计划会存储 API 密钥,而 Terraform 不会对这些数据进行加密。当使用此选项时,你应该考虑加密此文件,如果你计划将其发送给其他人或将其静置一段时间。
你将看到类似于以下的输出:
+ 资源 "digitalocean_droplet" "www-1"
行表示 Terraform 将创建一个名为 www-1
的新 Droplet 资源,并带有随后的细节。 这正是应该发生的,所以运行 terraform apply
命令来执行当前计划:
你将得到与之前相同的输出,但这次,Terraform 会询问你是否要继续:
Output...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
输入 yes
并按 ENTER
键。Terraform 将为你的 Droplet 进行配置:
Outputdigitalocean_droplet.www-1: Creating...
稍等片刻,你将看到 Terraform 使用 remote-exec
provisioner 安装 Nginx,然后流程将完成:
Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'...
....
digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...
Terraform 已创建名为 www-1
的新 Droplet,并在其上安装了 Nginx。 如果你访问新 Droplet 的公共 IP 地址,你将看到 Nginx 的欢迎界面。 在创建 Droplet 时显示了公共 IP,但你始终可以通过查看 Terraform 的当前状态来查看它。 每次执行计划或刷新状态时,Terraform 都会更新状态文件 terraform.tfstate
。
要查看环境的当前状态,请使用以下命令:
这将显示你的 Droplet 的公共 IP 地址。
在浏览器中导航至 http://your_www-1_server_ip
以验证你的 Nginx 服务器是否正在运行。
注意:如果您在Terraform之外修改基础架构,则状态文件将过时。如果您的资源在Terraform之外被修改,则需要刷新状态文件以使其更新。此命令将从您的提供者那里获取更新的资源信息:
在此步骤中,您已部署了在Terraform中描述的Droplet。现在您将创建第二个。
步骤5 — 创建第二个Nginx服务器
现在您已经描述了一个Nginx服务器,您可以通过复制现有服务器的配置文件并替换Droplet资源的名称和主机名来快速添加第二个。
您可以手动执行此操作,但使用sed
命令从www-1.tf
文件中读取,将所有www-1
实例替换为www-2
,并创建一个名为www-2.tf
的新文件会更快。以下是执行此操作的sed
命令:
您可以访问使用sed了解更多关于sed
的信息。
再次运行terraform plan
以预览Terraform将进行的更改:
输出显示Terraform将创建第二个服务器www-2
:
再次运行terraform apply
来创建第二个Droplet:
与之前一样,Terraform会询问您是否确认继续。再次查看计划并输入yes
以继续。
一段时间后,Terraform将创建新的服务器并显示结果:
Outputdigitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Terraform创建了新的服务器,而不会更改现有的服务器。您可以重复此步骤以添加其他Nginx服务器。
现在您有两个正在运行Nginx的Droplet,您将定义并部署负载均衡器以在它们之间分配流量。
步骤 6 — 创建负载均衡器
您将使用 DigitalOcean 负载均衡器,它是官方 Terraform 提供者支持的,用于在两个 Web 服务器之间路由流量。
创建一个名为loadbalancer.tf
的新 Terraform 配置文件:
添加以下行来定义负载均衡器:
负载均衡器定义指定了它的名称、它所在的数据中心、用于平衡流量的端口、健康检查的配置,以及应该平衡的Droplets的ID,您使用Terraform变量获取这些信息。保存并关闭文件。
再次运行terraform plan
命令来查看新的执行计划:
您将看到几行输出,包括以下行:
这意味着 www-1
和 www-2
Droplets 已经存在,Terraform 将创建 www-lb
负载均衡器。
运行 terraform apply
来构建负载均衡器:
再次,Terraform 将要求您审查计划。 输入 yes
以继续批准计划。
一旦您这样做,您将看到输出,其中包含以下行,为简洁起见截断:
Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...
使用 terraform show terraform.tfstate
来查找负载均衡器的 IP 地址:
您将在 www-lb
条目下找到 IP:
在浏览器中导航至 http://your_load_balancer_ip
,您将看到一个 Nginx 欢迎页面,因为负载均衡器正在将流量发送到两个 Nginx 服务器中的一个。
您现在将学习如何使用 Terraform 配置您的 DigitalOcean 帐户的 DNS。
步骤 7 —— 创建 DNS 域和记录
除了Droplets和负载均衡器之外,Terraform还可以创建DNS域和记录域。例如,如果您想将您的域指向您的负载均衡器,您可以编写描述该关系的配置。
注意: 使用您自己的唯一域名,否则Terraform将无法部署DNS资源。确保您的域指向DigitalOcean的域名服务器。
创建一个新文件来描述您的DNS:
在文件中添加以下域资源,将your_domain
替换为您的域名:
完成后保存并关闭文件。
您还可以添加一个CNAME记录,将www.your_domain
指向your_domain
。为CNAME记录创建一个新文件:
将以下行添加到文件中:
完成后保存并关闭文件。
要添加DNS条目,请运行terraform plan
,然后运行terraform apply
,就像处理其他资源一样。
转到您的域名,您将看到一个Nginx欢迎页面,因为该域指向负载均衡器,负载均衡器正在将流量发送到两个Nginx服务器中的一个。
第8步 — 摧毁您的基础设施
虽然 Terraform 在生产环境中并不常用,但它也可以销毁所创建的基础设施。这在部署和销毁多次的开发环境中非常有用。
首先,通过使用 terraform plan -destroy
创建一个销毁基础设施的执行计划:
Terraform 将输出一个带有以红色标记的资源的计划,并带有减号前缀,表示它将删除基础设施中的资源。
然后,使用 terraform apply
来运行这个计划:
Terraform 将按照生成的计划继续销毁资源。
结论
在本教程中,你使用了 Terraform 在 DigitalOcean 上构建了一个负载均衡的 Web 基础设施,其中有两个运行在 DigitalOcean 负载均衡器后面的 Nginx Web 服务器。你知道如何创建和销毁资源,查看当前状态,并使用 Terraform 配置 DNS 记录。
现在你已经了解了 Terraform 的工作原理,你可以创建描述自己项目服务器基础设施的配置文件。本教程中的示例是一个很好的起点,演示了如何自动化服务器的部署。如果你已经使用了配置工具,你可以将它们与 Terraform 集成,以在创建过程中配置服务器,而不是使用本教程中使用的配置方法。
Terraform拥有许多其他功能,并且可以与其他提供商一起使用。查看官方Terraform文档,了解如何使用Terraform改进您自己的基础架构。
本教程是如何使用Terraform管理基础架构系列的一部分。该系列涵盖了许多Terraform主题,从首次安装Terraform到管理复杂项目。
Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean