用Terraform的语言编写配置文件,告诉Terraform需要安装哪些插件、创建哪些基础设施。
文件和目录结构- terroform的主配置文件必须是在工作目录的顶级目录中所有的.tf文件。顶级目录的子目录被视为独立的模块,并且不会自动包含到配置中。
- 默认情况下terraform会加载工作目录下所有.tf文件,并期望不同的.tf文件定义不同的资源。如果不同的.tf文件尝试定义同一个对象,那么Terraform将会报错。
- 如果确实有需要定义配置文件覆盖的场景,可以将文件命名为"override.tf / override.tf.json"或以"_override.tf / _override.tf.json"结尾。
配置文件的后缀通常为.tf,或者使用json格式编写配置文件时其后缀为.tf.json。配置文件的编码必须为UTF-8。
terraform init初始化工作空间后目录下会出现以下文件。
- .terraform 目录下存放了依赖的providers的缓存文件
- .terraform.locl.hcl 依赖锁文件,锁定terraform配置依赖的适配的providers的版本
- terraform.tfstate 记录terraform基础设施资源当前的状态
- terraform.tfstate.backup 记录terraform基础设施资源上一个状态
- xxx.tf 自定义的配置文件。理解为你期望的terraform基础设施资源的状态
Terraform 语言的语法仅包含几个基本元素:
"" "" {
# Block body
= # Argument
}
是其他内容的容器,通常表示某种对象的配置。包括: (如resource);可以有零个或多个 ;主体可以包含任意数量的参数和嵌套块。 - Argument 参数——由
和 组成,存在于BLOCK内 ,表示一个值或者用表达式表达的一个值
Terraform依赖的组件成为providers。Terraform配置必须声明需要哪些providers,以便可以安装和使用它们。
provider一般会提供 resource的类型 和 DATA SOURCE
Terraform具体支持哪些provider可以在这里查看:Terraform Registry
示例
provider "alicloud" {
access_key = "your_ak_xxx"
secret_key = "your_sk_xxx"
region = "cn-shenzhen"
}
alias:同一提供者的多个配置
可以选择为同一个提供者定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域等场景。
# The default provider configuration; resources that begin with `aws_` will use
# it as the default, and it can be referenced as `aws`.
provider "aws" {
region = "us-east-1"
}
# Additional provider configuration for west coast region; resources can
# reference this as `aws.west`.
provider "aws" {
alias = "west"
region = "us-west-2"
}
resource和module不指定提供者时,默认以alias值的第一个单词推断默认的provider
多配置下,resource可以用provider参数指定使用哪个提供者
resource "aws_instance" "foo" {
provider = aws.west
# ...
}
多配置下,子模块可以用providers参数指定使用哪些提供者
module "aws_vpc" {
source = "./aws_vpc"
providers = {
aws = aws.west
}
}
required_providers
Terraform0.13以及更高版本中,provider块的version参数已启用。取而代之的似乎使用required_providers块指定provider的版本。
required_providers由本地名称、源位置、版本约束组成:
本地名称(mycloud)、源位置(source)、版本约束(version)
terraform {
required_providers {
mycloud = {
source = "mycorp/mycloud"
version = "~> 1.0"
}
}
}
provider "mycloud" {
# ...
}
本地名称 优先使用provider建议的首选本地名称
源位置 缺省时,默认为 registry.terraform.io/hashicorp/
版本约束 =>1.0 定义最低使用1.0版本;~>1.0定义 最高使用1.0版本
resourceresource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}
resource resource块
"aws_instance" 资源类型,由provider决定有哪些资源类型
"web" 本地名称,仅用于在当前模块中引用此资源
{...} 参数,大多数参数取决于资源类型。系统也有元参数
元参数 Meta-Argumentsdepends_on 用于指定隐藏的依赖项
count 用于根据计数创建多个资源实例
for_each 根据映射或字符串集创建多个实例
provider 用于选择非默认提供程序配置
lifecycle 用于生命周期自定义
provisioner 用于在资源创建后采取额外的行动
data
data块可以根据provider提供的DATA SOURCE,填写对应的参数。搜索到相对应的基础设施的信息,然后data块可以作为数据源提供相关数据信息。
示例
resource中引用本地名称为"web"的data source的id。
data块中的各种参数只是为了找到对应的基础设施资源。
data "aws_ami" "web" {
filter {
name = "state"
values = ["available"]
}
filter {
name = "tag:Component"
values = ["web"]
}
most_recent = true
}
resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}
variable
变量定义
variable块只能声明变量,并不能指定变量的值
variable "image_id" {
type = string
description = "This is image id"
default = "abcxxxx"
}
支持参数
default - 然后使变量可选的默认值。
type - 此参数指定变量接受的值类型。
description - 这指定输入变量的文档。
validation - 定义验证规则的块,通常除了类型约束。
sensitive - 在配置中使用变量时限制 Terraform UI 输出。
nullable - 指定变量是否可以为空。
使用变量
resource "some_resource" "a" {
name = var.image_id
...
}
变量输入
变量输入有多种方式
- terraform apply执行时交互式输入
- terraform apply -var"image_id=value"
- 环境变量输入,格式:TF_VAR_image_id='value'
- 最佳实践:通过.tfvars文件赋值,terraform apply -var-file="vars_file_path"
编辑xx.tfvars文件
image_id = "value"
命令行引用tfvars文件
terraform apply -var-file="xx.tfvars"
output
output就像函数的retrun返回值。执行完terraform apply之后输出的返回值。
示例
创建一个vpc,使用output输出vpc的id 和 执行成功状态提示。
#配置阿里云provider
provider "alicloud" {
access_key = "your_ak_xxx"
secret_key = "your_sk_xxx"
region = "cn-shenzhen"
}
#创建阿里云vpc
resource "alicloud_vpc" "liqi-vpc-test" {
vpc_name = "liqi-vpc-test"
cidr_block = "10.100.0.0/16"
}
output "apply_state" {
value = "apply successful"
}
output "new_vpc_id" {
value = "${alicloud_vpc.liqi-vpc-test.id}"
}
执行结果
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)