入門 Terraform Windows 和 Terraform EC2

在基礎設施即代碼(IaC)領域中,過去幾年中最有用的工具之一是 HashiCorp 的 Terraform Windows。對於任何 DevOps 和自動化工作流程來說,版本控制基礎設施、自動化資源供應以及在不同的雲供應商間執行都是非常重要的。

Terraform 在 CI/CD 中的一個使用案例是:Terraform 允許您:

我的最新視頻:

  • 創建測試環境
  • 部署應用程式
  • 執行整合測試
  • 摧毀測試環境

所有步驟都是自動執行的,而且不需要數據中心!

先決條件:

本文是關於如何運行 Terraform Windows 的演示。如果您想跟隨進行,請確保您已經具備以下先決條件:

  • A Windows 10 device
  • 一個 AWS 帳戶
  • 已在設備上安裝並配置了 AWS CLI。您可以在這裡了解如何安裝它:以及如何配置它:
  • (可選)安裝了 Terraform 擴展的 Visual Studio Code

安裝 Terraform Windows 應用程式

要充分利用Terraform的功能,您必須先在所選的操作系統上安裝它。在本文中,我將重點介紹Windows。但請知道,Terraform也可以在其他操作系統上運行。如果您不使用Windows,請查看安裝文檔

硬核方法

如果您無法使用套件管理器,或者想了解安裝過程的工作原理,可以手動安裝Terraform。您可以通過下載二進制文件並將其添加到系統路徑環境變量來安裝Terraform。如果這看起來很令人生畏,我向您保證,在下一節中您將學到更簡單的方法。

  1. HashiCorp的下載頁面下載適用於您的Terraform版本。在我的案例中,是Windows 64位版本。
  2. 在您的C:\驅動器上建立一個文件夾,用於放置Terraform執行文件。我更喜歡將安裝程序放在一個子文件夾中(例如C:\tools),以便您可以放置二進制文件。
  3. 下載完成後,打開文件總管,找到下載的zip文件,並將其解壓縮到第2步中創建的文件夾中。
  4. 打開“開始”菜單,輸入“環境”,第一個出現的應該是編輯系統環境變量選項。點擊它,您應該會看到這個窗口。
System Properties

5.   點擊底部的環境變數…,您會看到以下內容:

Windows environment variables

6.   在底部區域中找到 系統變數,找到一個名為 Path 的變數並點擊編輯。您將看到一個列出 Windows 可能需要的二進制文件位置的清單。

7.   點擊 新增,並將 terraform.exe 所在的文件夾路徑添加到列表底部。完成後應如下所示:

Editing the system path

8.   依次點擊您打開的每個選單上的 確定,直到沒有更多選單為止。

9.   為了確保 Windows 檢測到新的路徑,打開一個新的 CMD/PowerShell 提示符,輸入refreshenv

10.   通過輸入terraform --version來驗證安裝是否成功。如果返回一個版本號,則表示安裝成功。

簡單的方法

哇,這是一項艱巨的工作!每次在設備上安裝新軟件時都要這樣做真是太糟糕了。我們可以使用一個軟件包管理器來完成。有幾個軟件包管理器可用於在 Windows 上安裝 Terraform。對於 Windows,我最喜歡的是Chocolatey。它可以通過一行命令來安裝、卸載和更新軟件,Terraform也不例外。

要使用Chocolatey安裝 Terraform,請按照以下步驟操作:

  1. 以管理员身份打开CMD/PowerShell提示符,并使用安装页面中的命令安装Chocolatey。
  2. 完成后,运行choco install terraform。如果需要,也可以在命令末尾加上-y自动同意在设备上安装。

运行该命令后,会得到如下结果:

Chocolatey v0.10.13
2 validations performed. 1 success(es), 1 warning(s), and 0 error(s).

Installing the following packages:
terraform
By installing you accept licenses for the packages.
Progress: Downloading terraform 0.12.6... 100%

terraform v0.12.6 [Approved]
Downloading terraform 64 bit
  from 'https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_windows
Download of terraform_0.12.6_windows_amd64.zip (15.32 MB) completed.
--SNIP--

3. 输入terraform --version验证安装是否成功。

Linux方式

I can almost hear what you’re thinking. Wait a minute Chris, didn’t you say this was going to cover installing Terraform on Windows?

是的,现在也可以。但是Windows 10的一个功能是Windows for Linux子系统,即WSL。它允许你在Windows上运行Linux命令。

  1. 安装WSL。这里我不会详细介绍如何安装和设置WSL,但是如果你想跟着操作,而且还没有设置好的话,可以查看下面的TechSnips教学视频。

在WSL shell中运行apt-get install unzip,这样你就能够后续解压Terraform二进制文件了。

通过运行wget https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_linux_amd64.zip下载Terraform。记得用适合你设备的版本和架构替换链接中的版本信息。你可以在这里找到完整的Terraform版本列表。

4.   執行 unzip terraform_0.12.6_linux_amd64.zip terraform 解壓縮 ZIP 檔案的內容到一個名為 terraform 的資料夾中。

5.   一旦 ZIP 檔案被解壓縮,你需要將它移動到系統路徑可以存取的位置。幸運的是,Linux 預設有一個資料夾可以讓使用者添加可執行檔。執行 mv terraform /usr/local/bin/ 將 Terraform 可執行檔移動到該資料夾中。你的系統路徑已經設定好 /usr/local/bin

6.   執行 terraform --version 驗證安裝是否成功。

自動化 AWS Terraform EC2 實例

現在你已經安裝了 Terraform,可以開始使用它。在本文中,我將演示如何使用簡單的 AWS Terraform EC2 實例進行構建。但請知道 Terraform 可以配置數百種不同類型的基礎結構。

首先,你需要一個目錄來運行 Terraform EC2 腳本。對於每個環境,有一個獨立的目錄是很重要的。在我撰寫這篇文章的時候,Terraform 沒有一種過濾運行內容的方式。它會運行當前工作目錄中的每個腳本。

設置 TF 腳本

  1. 在你以系統管理員身份運行的 cmd 或 PowerShell 控制台中,執行 mkdir hello-terraform 然後執行 cd ./hello-terraform
  2. 一旦你有了一个目录,你就需要一个 Terraform 脚本。下面是一个你可以使用的示例。这是一个使用 AWS provider 创建 AWS 实例 resource 的典型 Terraform 脚本。

如果你想要整个脚本,将其复制到下面。如果你想要了解这个脚本正在做什么,请继续阅读。

# Terraform HCL

provider "aws" {
  region = "us-east-1"
  shared_credentials_file = "~/.aws/credentials"
  profile = "default"
}

resource "aws_instance" "ubuntu" {
  ami           = "ami-07d0cf3af28718ef8"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloTerraform"
  }
}

# Terraform HCL

3. 将上面的脚本保存为 main.tf,保存到你的工作目录中。

理解 TF 脚本

#Terraform HCL

provider "aws" {
  region = "us-east-1"
  shared_credentials_file = "~/.aws/credentials"
  profile = "default"
}

在继续之前,看一下下面的块及其声明。

#Terraform HCL

该块告诉 Terraform EC2 使用哪个 provider。所有主要的云供应商都有提供者,还有一些本地供应商。如果你更高级并且知道如何编写 Golang,你也可以编写自己的 provider。

该块告诉 Terraform 使用 AWS provider,并使用位于 ~/.aws/credentials 文件中的访问密钥,文件中的配置文件名为 default。当你使用预备条件中所述的 aws config 命令设置 AWS CLI 时,会创建该文件。

值得注意的是,~/ 是当前用户目录的简写。如果你来自 Windows 背景,这相当于 $env:USERPROFILE%USERPROFILE%。但是 Terraform 在撰写本文时不支持该表示法。

#Terraform HCL

resource "aws_instance" "ubuntu" {
  ami           = "ami-07d0cf3af28718ef8"
  instance_type = "t2.micro"

  tags = {
    Name = "HelloTerraform"
  }
}

下面的模塊描述了一個Terraform EC2實例以及要使用的建置內容。如果您查看Terraform文檔中的aws_instance,您可以看到一些參數是必需的,一些是可選的。在這種情況下,必需的參數是AMI ID(ami-07d0cf3af28718ef8)用於Ubuntu 18.04 LTS,以及實例類型為t2.micro

通過傳遞一個標籤塊,其中鍵為Name,值為HelloTerraform,此標籤也將分配給創建的實例。這是可選的。

terraform init

#Terraform HCL

Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

------------------------------------------------------------------------

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  建立AWS Terraform EC2實例:測試
  + resource "aws_instance" "ubuntu" {
      + ami                          = "ami-07d0cf3af28718ef8"
      + arn                          = (known after apply)
      + associate_public_ip_address  = (known after apply)
      + availability_zone            = (known after apply)
      + cpu_core_count               = (known after apply)
      + cpu_threads_per_core         = (known after apply)
      + get_password_data            = false
...
--SNIP--

Plan: 1 to add, 0 to change, 0 to destroy.

------------------------------------------------------------------------

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

現在腳本已經設置完成,通過從工作目錄運行terraform init來調用它。這將下載所有依賴項和提供程序到名為.terraform的文件夾中。如果一切順利,您應該會得到類似以下的結果:

在進行任何更改之前,Terraform EC2允許您運行terraform plan來查看將要創建的內容。這是它的輸出:

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:    

#將創建aws_instance.ubuntu

aws_instance.ubuntu: Creating...
aws_instance.ubuntu: Still creating... [10s elapsed]
aws_instance.ubuntu: Still creating... [20s elapsed]
aws_instance.ubuntu: Still creating... [30s elapsed]
aws_instance.ubuntu: Creation complete after 33s [id=i-07cefd2a426a179b5]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

建立AWS EC2實例:正在創建

現在,您已經準備好運行它了,只需運行terraform apply即可。下面您將看到類似於terraform plan的輸出,但增加了確認是否確實要應用這些更改的提示。

一旦键入“是”,Terraform EC2 将通过调用凭据文件中的访问密钥,开始使用AWS API提供Terraform EC2实例。这可能需要一些时间。完成后,您将看到类似下面的内容:

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: 

销毁AWS EC2实例

aws_instance.ubuntu: Destroying... [id=i-07cefd2a426a179b5]
aws_instance.ubuntu: Still destroying... [id=i-07cefd2a426a179b5, 10s elapsed]
aws_instance.ubuntu: Still destroying... [id=i-07cefd2a426a179b5, 20s elapsed]
aws_instance.ubuntu: Still destroying... [id=i-07cefd2a426a179b5, 30s elapsed]
aws_instance.ubuntu: Destruction complete after 30s

Destroy complete! Resources: 1 destroyed.

完成测试环境后,您可以销毁该实例。

在您的cmd/PowerShell控制台中,键入terraform destroy。与apply命令类似,您将看到Terraform将要销毁的资源列表,然后才会提示进行实际销毁。

一旦您键入“是”,Terraform EC2将开始销毁实例,并在完成时进行确认。

Source:
https://adamtheautomator.com/terraform-windows/