我总结了使用AWS的Terraform的方法(4/10)
变量(概述)
变量分为两种类型:局部变量和外部变量。
- 本地变量是在Terraform的HCL代码中定义的,仅在同一文件中使用的变量。通过使用本地变量,您可以在HCL代码中定义可重复使用的值。本地变量在locals块中定义。
本地变量的示例
locals {
region = "us-west-2"
vpc_id = "vpc-1234567890abcdefg"
subnet_ids = [
"subnet-1234567890abcdefg",
"subnet-0987654321hgfedcba"
]
}
- 外部变量是Terraform HCL代码外部传入的变量,可以从terraform.tfvars文件、命令行标志、环境变量或远程状态中获取。使用外部变量可以在每次运行Terraform HCL代码时更改变量的值。外部变量在variable块内被定义。
外部变量的示例
variable "region" {
description = "The region to deploy the infrastructure"
type = string
}
variable "vpc_id" {
description = "The ID of the VPC"
type = string
}
variable "subnet_ids" {
description = "The IDs of the subnets"
type = list(string)
}
可以在 terraform.tfvars 文件中设置外部变量的值。例如,可以按照以下方式为外部变量 region 设置值。
region = "us-west-2"
此外,您还可以使用命令行标志或环境变量,在Terraform执行时设置外部变量。例如,您可以按照以下方式为region外部变量设置值。
terraform plan -var="region=us-west-2"
在这种情况下,Terraform将使用通过命令行传递的值,而不是在terraform.tfvars文件中定义的值。
为了使用Terraform的外部变量,提供以下示例代码。
首先,我们需要创建一个名为variables.tf的文件来定义外部变量。
variable "aws_access_key" {
description = "AWS access key"
}
variable "aws_secret_key" {
description = "AWS secret key"
}
variable "region" {
description = "AWS region"
}
接下来,我们将创建一个名为main.tf的文件,以便在Terraform代码中使用这些变量。
provider "aws" {
access_key = var.aws_access_key
secret_key = var.aws_secret_key
region = var.region
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
在这段代码中,我们使用AWS提供商来创建EC2实例。AWS访问密钥、秘密密钥和区域通过使用在variables.tf中定义的外部变量进行传递。
最后,我们将创建一个文件来传递外部变量的值。在这里,我们将使用一个名为terraform.tfvars的文件来传递变量的值。
aws_access_key = "YOUR_AWS_ACCESS_KEY"
aws_secret_key = "YOUR_AWS_SECRET_KEY"
region = "us-west-2"
现在,我们已经准备好在Terraform代码中使用外部变量了。当执行terraform apply命令时,将从terraform.tfvars文件中读取变量的值,并创建EC2实例。
变量(详细)
- 字符串变量:用于表示字符串的变量
variable "region" {
type = string
default = "us-east-1"
}
- 数字变量:表示数字的变量
variable "instance_count" {
type = number
default = 1
}
- 布尔变量: 表示真假值的变量
variable "is_production" {
type = bool
default = false
}
- 列出变量:具有多个值的变量
variable "availability_zones" {
type = list(string)
default = ["us-east-1a", "us-east-1b"]
}
- 地图变量:具有键和值对的变量
variable "instance_tags" {
type = map(string)
default = {
environment = "dev"
owner = "John Doe"
}
}
- 对象变量:表示对象的变量。
variable "instance_details" {
type = object({
instance_type = string
ami_id = string
subnet_id = string
})
default = {
instance_type = "t2.micro"
ami_id = "ami-0c55b159cbfafe1f0"
subnet_id = "subnet-1234567890abcdef0"
}
}
通过使用这些变量,您可以灵活地构建Terraform代码,并在不更改参数的情况下在不同的环境中进行重用。
利用terraform工具来使用变量的例子是 ${var.変数名}。
例1:创建EC2实例
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
}
在上述的Terraform代码中,我们创建了一个aws_instance资源。在创建过程中,使用了Terraform变量来指定AMI ID和实例类型。具体来说,有两个变量,分别是ami_id和instance_type。
在这种情况下,您可以通过执行terraform apply命令来使用传递给Terraform变量的值来创建EC2实例。
terraform apply -var="ami_id=ami-0c55b159cbfafe1f0" -var="instance_type=t2.micro"
创建S3存储桶
resource "aws_s3_bucket" "example" {
bucket = var.bucket_name
}
在上述的Terraform代码中,我们创建了一个aws_s3_bucket资源。在这个过程中,使用了Terraform变量来指定存储桶的名称。
在这种情况下,通过执行terraform apply命令,可以使用传递给Terraform变量的值来创建S3存储桶。
terraform apply -var="bucket_name=my-example-bucket"
通过利用terraform ${var.变量名},可以更容易地重用Terraform代码,并在运行时灵活指定值。