介紹
Terraform是一個用於以有組織的方式構建和管理基礎設施的工具。您可以使用它來管理DigitalOcean Droplets、負載均衡器,甚至是DNS記錄,除了其他提供者提供的各種服務。Terraform使用命令行界面,可以從您的桌面或遠程服務器運行。
Terraform的工作原理是讀取描述構成應用環境或數據中心的組件的配置文件。根據配置,它生成一個執行計劃,描述了為達到所需狀態將要執行的操作。然後,您可以使用Terraform執行此計劃以構建基礎設施。當配置發生變化時,Terraform可以生成並執行增量計劃,以將現有基礎設施更新為新描述的狀態。
在本教程中,您將安裝Terraform並使用它在DigitalOcean上創建一個基礎設施,該基礎設施包括由一個DigitalOcean負載均衡器負載平衡的兩個Nginx服務器。然後,您將使用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 通過您可以安裝的 提供者 支持各種服務提供商。每個提供者都有其自己的規範,通常與其相應服務提供商的 API 相對應。
DigitalOcean 提供者 讓 Terraform 能夠與 DigitalOcean API 進行交互,以構建基礎架構。該提供者支持創建各種 DigitalOcean 資源,包括以下:
- digitalocean_droplet: Droplets(服務器)
- digitalocean_loadbalancer: Load Balancers(負載均衡器)
- digitalocean_domain: DNS domain entries(DNS 域名條目)
- digitalocean_record: DNS records(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,并在Droplet启动后在其上安装软件。在此步骤中,您将使用Terraform提供一个单独的Ubuntu 20.04 Droplet,并安装Nginx Web服务器。
创建一个名为www-1.tf
的新Terraform配置文件,其中将保存Droplet的配置:
插入以下行以定义Droplet资源:
在上述配置中,第一行定义了一个名为digitalocean_droplet的资源,名称为www-1
。其余行指定了Droplet的属性,包括其所在的数据中心和标识您要配置的Droplet大小的slug。在这种情况下,您将使用s-1vcpu-1gb
,这将创建一个具有一个CPU和1GB RAM的Droplet。(访问此大小slug图表以查看可用的slug)
ssh_keys
部分指定了您想要添加到 Droplet 的公钥列表。在这种情况下,您正在指定您在 provider.tf
中定义的密钥。确保此处的名称与您在 provider.tf
中指定的名称匹配。
当您针对 DigitalOcean API 运行 Terraform 时,它将收集有关 Droplet 的各种信息,例如其公共和私有 IP 地址。这些信息可以被配置中的其他资源使用。
如果您想知道 Droplet 资源的哪些参数是必需的或可选的,请参阅官方 Terraform 文档:DigitalOcean Droplet Specification。
为了设置 Terraform 可以用来通过 SSH 连接到服务器的连接,请在文件末尾添加以下行:
这些行描述了 Terraform 如何连接到服务器,因此 Terraform 可以通过 SSH 连接安装 Nginx。请注意私钥变量 var.pvt_key
的使用——您将在运行 Terraform 时传递其值。
现在您已经设置了连接,请配置 remote-exec
配置程序,您将使用它来安装 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
供应程序安装 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的Droplets,您將定義並部署一個負載平衡器來在它們之間分配流量。
第6步 — 創建負載平衡器
您將使用官方Terraform提供程序支持的 DigitalOcean負載平衡器 來在兩個Web伺服器之間路由流量。
創建一個名為 loadbalancer.tf
的新Terraform配置文件:
添加以下行來定義負載平衡器:
負載平衡器定義指定其名稱、所在的資料中心、應該監聽以平衡流量的埠、健康檢查的配置,以及它應該平衡的Droplets的ID,您使用Terraform變數來獲取這些ID。保存並關閉文件。
再次運行 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 基礎設施,其中有兩個 Nginx Web 伺服器在 DigitalOcean 負載均衡器後運行。您知道如何創建和摧毀資源,查看當前狀態,並使用 Terraform 配置 DNS 記錄。
現在您已經了解了 Terraform 的工作原理,您可以創建描述自己項目伺服器基礎設施的配置文件。本教程中的示例是一個很好的起點,演示了您如何自動化伺服器的部署。如果您已經使用配置工具,您可以將它們與 Terraform 集成,以便在創建過程中配置伺服器,而不是使用本教程中使用的配置方法。
Terraform擁有更多功能,並且可以與其他提供商一起使用。查看官方 Terraform文檔 以了解如何使用Terraform改進您自己的基礎設施。
本教程是 如何使用Terraform管理基礎設施 系列的一部分。該系列涵蓋了許多Terraform主題,從首次安裝Terraform到管理複雜項目。
Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-with-digitalocean