DevOps - Terraform

在本章中,我们将了解 Terraform 的基本思想。我们将讨论其结构、配置文件以及我们如何管理状态。我们还将研究为什么使用 Terraform 模块有利于可重用性。我们将了解如何在 CI/CD 管道中使用 Terraform。最后,我们将分享最佳实践,以便在我们的 DevOps 工作流中充分利用 Terraform。

了解基础设施即代码 (IaC)

基础设施即代码或 IaC 是一种重要的 DevOps 实践。它帮助我们用代码管理我们的基础设施,而不是手动操作。使用 IaC,我们可以使用简单的配置语言定义、创建和管理我们的基础设施。这为我们提供了更多的一致性、可重复性和发展能力。

常见的 IaC 工具

以下是一些常见的 IaC 工具 −

  • Terraform − 用于构建、更改和跟踪基础设施的工具。
  • Ansible − 用于管理配置和编排的工具。
  • CloudFormation − 用于 AWS 设置资源的特殊 IaC 工具。

当我们使用 IaC 时,我们可以拥有更快的部署周期和更好地管理我们的基础设施。

Terraform 架构和组件

我们将讨论 Terraform 的工作原理。它使用客户端-服务器结构,其中包含一些重要部分。这有助于我们更好地管理基础设施。

以下是 Terraform 架构的关键组件:

  • Terraform CLI 是我们用来运行 Terraform 命令的命令行工具。我们可以在这里管理我们的基础设施并使用配置文件。
  • Providers 是帮助 Terraform 连接到不同云服务(如 AWS、Azure 或 Google Cloud)的插件。每个提供商都有我们可以使用的自己的资源。
  • Resources 是 Terraform 中的基本构建块。它们代表云中的服务或基础设施的一部分。例如,我们可以创建 EC2 实例或 S3 存储桶。以下是示例配置 −
resource "aws_instance" "example" {
   ami = "ami-0c55b159cbfafe01e"
   instance_type = "t2.micro"
}

状态文件 − 这些是 JSON 文件,用于跟踪我们基础设施的当前状态。它们对于将现实世界的资源链接到我们的配置非常重要。

模块 − 这些是我们一起使用的资源组。它们帮助我们重用代码并保持井然有序。以下是示例 −

module "vpc" {
    source = "./modules/vpc"
    cidr_block = "10.0.0.0/16"
}

后端 − 这是我们存储状态文件的地方。它可以是本地的,也可以是远程的,比如 S3 或 Terraform Cloud。这有助于我们协同工作和管理状态。

了解这些部分对于我们在 DevOps 设置中很好地使用 Terraform 非常重要。

编写 Terraform 配置文件

我们使用 HashiCorp 配置语言 (HCL) 编写 Terraform 配置文件。这种语言易于人类阅读,也适用于机器。这些文件帮助我们定义我们想要创建和管理的基础设施资源。

Terraform 配置通常具有这些主要部分 −

提供商块 − 这显示我们正在使用哪个云提供商。例如,我们可以使用 AWS 或 Azure。

provider "aws" {
   region = "us-west-2"
}

资源块 − 这部分告诉我们要创建哪些资源。

resource "aws_instance" "web" {
    ami = "ami-0c55b159cbfafe1f0"
    instance_type = "t2.micro"
}

输出块 −这显示了我们运行配置后的信息。

    output "instance_ip" {
    value = aws_instance.web.public_ip
}

变量和输入

我们可以定义变量以使我们的配置更易于重用 −

variable "instance_type" {
   description = "Type of instance"
   default = "t2.micro"
}

我们可以在资源定义中使用这些变量 −

resource "aws_instance" "web" {
   ami = "ami-0c55b159cbfafe1f0"
   instance_type = var.instance_type
}

管理 Terraform 状态

管理 Terraform 状态非常重要。它帮助我们跟踪配置创建的资源并让我们正确地更改它们。Terraform 保留一个名为 terraform.tfstate 的状态文件。此文件显示我们基础设施的当前状态。如果我们管理得当,我们可以保持一切一致并避免配置漂移。

让我们了解它的一些关键概念 −

  • 状态文件 − 这是一个 JSON 文件。它将我们配置中的资源与现实世界的项目联系起来。
  • 远程状态 −当我们远程存储状态文件时,例如在 AWS S3、Azure Blob Storage 或 Terraform Cloud 中,它可以帮助我们更好地协作并防止我们丢失数据。

状态管理的最佳实践

使用远程后端 − 这有助于我们进行锁定和版本控制。以下是 AWS S3 的示例配置 −

terraform {
   backend "s3" {
      bucket  = "my-terraform-state"
      key = "terraform.tfstate"
      region = "us-east-1"
      dynamodb_table = "terraform-locks"
   }
}

状态锁定 − 这会同时停止可能扰乱状态的多个操作。

状态加密 − 我们应确保在存储状态文件中的敏感数据时对其进行加密。

状态命令

  • terraform state list − 此命令向我们显示状态中的资源。
  • terraform state show <resource> − 此命令提供有关特定资源的详细信息。
  • terraform state rm <resource> −此命令从状态中删除资源,但不会销毁它。

Terraform 模块和可重用性

Terraform 模块是容纳我们一起使用的不同资源的盒子。它们帮助我们制作可以重复使用的部分。这使我们的代码更易于管理,我们不必一遍又一遍地编写相同的内容。

一个 模块 通常具有以下三个文件 −

  • tf − 此文件具有资源定义。
  • tf − 此文件定义输入变量。
  • tf − 此文件显示模块的输出。

您可以通过在我们的 Terraform 配置文件中编写模块块来使用模块 −

module "vpc" {
   source = "./modules/vpc"
   cidr_block = "10.0.0.0/16"
   availability_zones = ["us-west-2a", "us-west-2b"]
}

简单模块示例

# modules/vpc/main.tf
resource "aws_vpc" "main" {
    cidr_block = var.cidr_block
}
# modules/vpc/variables.tf
variable "cidr_block" {
    description = "VPC 的 CIDR 块"
    type = string
}
# modules/vpc/outputs.tf
output "vpc_id" {
    value = aws_vpc.main.id
}

正确使用模块可以简化我们的 Terraform 设置,并帮助我们遵循管理基础设施的良好做法。

在 CI/CD 管道中实现 Terraform

我们可以在 CI/CD 管道中使用 Terraform 来自动化我们设置基础设施的方式。这有助于我们保持一致性,并允许我们快速部署。以下是将 Terraform 添加到我们的 CI/CD 工作流中的简单方法:

现在让我们了解集成 Terraform 的步骤 −

  • 首先,确保您的 CI/CD 工具(如 Jenkins、GitLab CI 或 GitHub Actions)可以访问正确的凭据。这将使其与我们的云提供商对话。
  • 将您的 Terraform 配置文件 保存在 Git 等版本控制的存储库中。使用环境变量或机密管理工具来管理 API 密钥等敏感数据是个好主意。
  • 运行 terraform plan 以制定执行计划。这向我们展示了在不应用它们的情况下会发生哪些变化。
terraform init
terraform plan -out=tfplan

我们可以添加一个步骤来手动批准重要更改。然后,运行 terraform apply 来设置基础架构。

terraform apply tfplan

您应该在部署基础架构后添加测试来检查它是否正常工作。如果需要,请使用 terraform destroy 清理资源。

CI/CD 工具集成示例

GitHub Actions −

name: Terraform CI
on:
  push:
    branches:
      - main
jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Set up Terraform
        uses: hashicorp/setup-terraform@v1
        with:
          terraform_version: 1.0.0
      - name: Terraform Init
        run: terraform init
      - name: Terraform Plan
        run: terraform plan

DevOps 中 Terraform 的最佳实践

我们需要在 DevOps 环境中很好地使用 Terraform。这意味着我们应该遵循一些最佳实践。这有助于我们保持工作易于管理、发展和协同工作。以下是一些重要提示 −

组织配置文件 − 我们应该以清晰的方式安排我们的 Terraform 文件。它有助于为每个环境(如开发、暂存和生产)使用不同的文件夹。

├── main.tf
├── variables.tf
├── outputs.tf
├── dev/
│   ├── main.tf
├── prod/
│   ├── main.tf

您可以为基础设施的通用部分制作可重用模块。这有助于我们遵循 DRY 原则,即不要重复自己。

使用远程状态存储(如 AWS S3)和 DynamoDB 进行锁定非常重要。这有助于我们安全地协同工作并避免问题。以下是后端设置示例 −

terraform {
   backend "s3" {
      bucket = "my-terraform-state"
      key = "statefile.tfstate"
      region = "us-east-1"
      dynamodb_table = "terraform-locks"
   }
}

您应该经常运行 terraform fmt 和 terraform verify 命令。这样可以保持代码质量良好且易于阅读。

结论

在本章中,我们研究了 DevOps 框架中 Terraform 的重要部分。我们讨论了基础设施即代码 (IaC) 原则。我们还介绍了 Terraform 架构、如何编写配置、状态管理、模块可重用性以及如何将其集成到 CI/CD 管道中。