天天看點

終極指南!Terraform的進階技巧

作者:Seal軟體

如果您已經對 Terraform 了如指掌,并期望自己的 IaC 技能有進一步提升的話,這篇文章很适合您!在本文中,我們将分享一些 Terraform 的進階使用技巧。從使用子產品(module)、工作區(workspace)到管理遠端狀态存儲、自定義 provider等技巧,幫助您輕松、高效地管理基礎設施。無論您管理的是小型網站還是大規模的雲基礎設施,這些技巧都将讓您對 Terraform 的掌控力再上一層樓。

太長不看版

  • Terraform 子產品是可複用的 Terraform 代碼包,其中封裝了一組資源并且能在多個 Terraform 配置中使用。
  • 遠端狀态存儲允許使用者在共享位置存儲狀态,比如 S3 bucket 或者 Terraform 雲工作區,這使得協作和管理基礎設施更友善。
  • Terraform 工作區允許使用者管理單個 Terraform 配置的多個執行個體,每個執行個體都有其狀态。
  • 自定義 provider 可以讓使用者管理那些不被 Terraform 原生支援的資源,比如自定義 API 或某些自研的技術。
  • 在建立資源後,Terraform provisioner 可以在上面運作腳本或者指令。對于在新建立的資源上配置軟體或運作測試,Provisioner十分有用。

Tips & Tricks:Terraform 進階技能

Terraform 是管理 IaC 的強大工具,常用常新。在這一部分我們将探索 Terraform 的進階技能,包括 Terraform 子產品、遠端狀态存儲、Terraform 工作區以及自定義 Provider。

1、Terraform 子產品

Terraform 子產品是可複用的 Terraform 代碼包,其中封裝了一組資源并且能在多個 Terraform 配置中使用。子產品可以将基礎設施的複雜度抽象出來,并且代碼可以重複使用,進而允許使用者以子產品化和可組合的方式定義基礎設施。

要建立一個 Terraform 子產品,你需要在單獨的目錄中定義一組資源,并該目錄有自己的main.tf檔案。然後,您可以在主要的 Terraform 配置中使用子產品塊(module block)和傳遞任何必要的變量來調用子產品。例如,這裡有一個簡單的Terraform子產品,定義了一個AWS EC2執行個體:

# modules/ec2/main.tf
resource "aws_instance" "example" {
 ami = var.ami
 instance_type = var.instance_type
 tags = var.tags
}

# main.tf
module "ec2" {
 source = "./modules/ec2"
 ami = "ami-1234567890"
 instance_type = "t2.micro"
 tags = {
 Name = "example-instance"
 }
}
           

2、遠端狀态存儲

預設情況下, Terraform 在磁盤上将狀态存儲到本地,但如果在團隊環境中工作或有多個 Terraform 配置時,會導緻一些問題出現。遠端狀态存儲可以讓使用者将狀态存儲在一個共享的位置,比如 S3 bucket 或者 Terraform 雲工作區,這使得協作和管理基礎設施更友善。

要使用遠端狀态存儲,您需要在 Terraform 配置中配置一個後端,以下是一個簡單的示例,展示如何使用 S3 Bucket 來進行遠端狀态存儲:

terraform {
 backend "s3" {
 bucket = "my-bucket"
 key = "terraform.tfstate"
 region = "us-west-2"
 }
}
           

3、Terraform 工作區

Terraform 工作區允許使用者管理單個 Terraform 配置的多個執行個體,每個執行個體都有其狀态。當您需要在同個 Terraform 代碼庫中管理多個環境時(如 dev、staging、生産環境),這一功能十分有用。

使用terraform workspace new指令建立一個新工作區;要在工作區之間切換,使用terraform workspace select指令。以下示例是如何使用工作空間來管理一個開發和一個生産環境:

terraform workspace new dev
terraform apply

terraform workspace new prod
terraform apply
           

4、自定義 Provider

自定義 provider 可以讓使用者管理那些不被 Terraform 原生支援的資源,比如自定義 API 或某些自研的技術。盡管 Terraform 内置大量 provider,但有時還是需要使用自定義的 provide。

首先,需要寫一個 provider 插件,它是一個符合 Terraform插件協定的 Go 二進制檔案。完成 Provider 插件建構之後,您可以在 Terraform 配置中使用 Provider 塊對它進行配置。例如,以下配置是使用一個自定義的 provider 來管理專有雲平台的資源:

provider "mycloud" {
 api_key = "my-api-key"
 endpoint = "https://api.mycloud.com"
}

resource "mycloud_instance" "example" {
 name = "example-instance"
 image = "ubuntu-18.04"
 size = "small"
}
           

5、Terraform Provisioners

在建立資源後,Terraform provisioner 可以在上面運作腳本或者指令。對于在新建立的資源上配置軟體或運作測試,Provisioner十分有用。

在 Terraform 中有2種類型的 provisioner:local-exec 和 remote-exec。Local-exec 在運作Terraform的機器上本地運作指令,remote-exec 在資源上運作指令。下方示例配置使用了 local-exec provisioner 來在 AWS EC2 執行個體上運作腳本:

resource "aws_instance" "example" {
 ami = "ami-1234567890"
 instance_type = "t2.micro"

provisioner "local-exec" {
 command = "echo 'Hello, World!' > /tmp/hello.txt"
 }
}
           

總結

Terraform 是一款管理 IaC 的強大工具,這些進階技能可以進一步點亮您的 Terraform 技能樹。通過使用上述提到的技巧,您能夠以子產品化、可擴充以及高效的方式來管理您的基礎設施。無論您是在管理小型網站還是大規模的雲基礎設施,Terraform 所具備的靈活性以及功能都能滿足您的需求。

原文連結:

https://faun.pub/the-ultimate-guide-to-advanced-terraform-techniques-for-devops-b202b6845170

繼續閱讀