使用 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. 打开开始菜单,键入“environment”,第一项应该是编辑系统环境变量选项。点击进入,您应该会看到这个窗口。
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 Subsystem,或称为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 提供程序创建 AWS 实例资源的典型 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 要使用哪个提供程序。针对所有主要云供应商都有提供程序,以及一些本地供应商。如果您更高级并且知道如何编写 Golang,则还可以编写自己的提供程序。

这个块告诉 Terraform 使用 AWS 提供程序,并访问 ~/.aws/credentials 文件中的访问密钥,文件位于配置了 AWS CLI 时使用的默认配置文件。此文件在设置 AWS CLI 时通过 aws config 命令创建,如先决条件中所述。

值得注意的是,~/ 是当前用户目录的缩写。如果您来自 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,你会发现一些参数是必需的,一些是可选的。在这种情况下,必需的参数是用于Ubuntu 18.04 LTS的AMI ID(ami-07d0cf3af28718ef8)和实例类型为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/