引言
Terraform是基础设施即代码的标准工具。本文介绍Terraform的使用和实践。
1.1 安装
1 2 3 4 5 6 7
| wget https://releases.hashicorp.com/terraform/1.3.0/terraform_1.3.0_linux_amd64.zip unzip terraform_1.3.0_linux_amd64.zip mv terraform /usr/local/bin/
terraform version
|
1.2 基本命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| terraform init
terraform fmt
terraform validate
terraform plan
terraform apply
terraform destroy
|
二、AWS资源管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| # provider.tf terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } }
provider "aws" { region = "us-west-2" }
# vpc.tf resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" tags = { Name = "main-vpc" } }
resource "aws_subnet" "public" { vpc_id = aws_vpc.main.id cidr_block = "10.0.1.0/24" tags = { Name = "public-subnet" } }
# ec2.tf resource "aws_instance" "web" { count = 2 ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" subnet_id = aws_subnet.public.id tags = { Name = "web-${count.index}" } }
|
三、变量和输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| # variables.tf variable "instance_type" { description = "EC2 instance type" type = string default = "t2.micro" }
variable "instance_count" { description = "Number of instances" type = number default = 2 }
# outputs.tf output "instance_ips" { description = "Instance public IPs" value = aws_instance.web[*].public_ip }
|
1 2 3
| # terraform.tfvars instance_type = "t2.small" instance_count = 3
|
四、模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| # modules/vpc/main.tf resource "aws_vpc" "this" { cidr_block = var.cidr_block tags = { Name = var.name } }
# modules/vpc/variables.tf variable "cidr_block" { type = string }
variable "name" { type = string }
# modules/vpc/outputs.tf output "vpc_id" { value = aws_vpc.this.id }
# 使用模块 module "vpc" { source = "./modules/vpc" cidr_block = "10.0.0.0/16" name = "my-vpc" }
|
五、状态管理
1 2 3 4 5 6 7 8 9 10 11
| # backend.tf terraform { backend "s3" { bucket = "my-terraform-state" key = "prod/terraform.tfstate" region = "us-west-2" dynamodb_table = "terraform-locks" encrypt = true } }
|
六、实战案例:Kubernetes集群
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # eks.tf module "eks" { source = "terraform-aws-modules/eks/aws" version = "18.0.0" cluster_name = "my-cluster" cluster_version = "1.24" vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnets eks_managed_node_groups = { default = { min_size = 1 max_size = 3 desired_size = 2 instance_types = ["t3.medium"] } } }
|
总结
Terraform核心概念:
- 声明式:描述期望状态
- Provider:云平台接口
- 资源:基础设施组件
- 状态管理:记录资源状态
- 模块:代码复用
参考资料