当前位置:   article > 正文

Terraform基础(四)-Terraform配置文件基础语法&格式_terraform data

terraform data

概述

        用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 语言的语法仅包含几个基本元素:

  1. <BLOCK TYPE> "<BLOCK LABEL>" "<BLOCK LABEL>" {
  2. # Block body
  3. <IDENTIFIER> = <EXPRESSION> # Argument
  4. }
  • <BOLCK>是其他内容的容器,通常表示某种对象的配置。包括:<BOLCK TYPE>(如resource);可以有零个或多个<BOLCK LABEL>;主体可以包含任意数量的参数和嵌套块。
  • Argument 参数——由<IDENTIFIER>和<EXPRESSION>组成,存在于BLOCK内
  • <EXPRESSION>,表示一个值或者用表达式表达的一个值

provider

Terraform依赖的组件成为providers。Terraform配置必须声明需要哪些providers,以便可以安装和使用它们。

provider一般会提供 resource的类型 和 DATA SOURCE

Terraform具体支持哪些provider可以在这里查看:Terraform Registry

示例

  1. provider "alicloud" {
  2. access_key = "your_ak_xxx"
  3. secret_key = "your_sk_xxx"
  4. region = "cn-shenzhen"
  5. }

alias:同一提供者的多个配置

        可以选择为同一个提供者定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域等场景。

  1. # The default provider configuration; resources that begin with `aws_` will use
  2. # it as the default, and it can be referenced as `aws`.
  3. provider "aws" {
  4. region = "us-east-1"
  5. }
  6. # Additional provider configuration for west coast region; resources can
  7. # reference this as `aws.west`.
  8. provider "aws" {
  9. alias = "west"
  10. region = "us-west-2"
  11. }

resource和module不指定提供者时,默认以alias值的第一个单词推断默认的provider

多配置下,resource可以用provider参数指定使用哪个提供者

  1. resource "aws_instance" "foo" {
  2. provider = aws.west
  3. # ...
  4. }

多配置下,子模块可以用providers参数指定使用哪些提供者

  1. module "aws_vpc" {
  2. source = "./aws_vpc"
  3. providers = {
  4. aws = aws.west
  5. }
  6. }

required_providers

Terraform0.13以及更高版本中,provider块的version参数已启用。取而代之的似乎使用required_providers块指定provider的版本。

required_providers由本地名称、源位置、版本约束组成:

本地名称(mycloud)、源位置(source)、版本约束(version)

  1. terraform {
  2. required_providers {
  3. mycloud = {
  4. source = "mycorp/mycloud"
  5. version = "~> 1.0"
  6. }
  7. }
  8. }
  9. provider "mycloud" {
  10. # ...
  11. }

本地名称        优先使用provider建议的首选本地名称

源位置            缺省时,默认为 registry.terraform.io/hashicorp/<LOCAL NAME>

版本约束        =>1.0 定义最低使用1.0版本;~>1.0定义 最高使用1.0版本

resource

  1. resource "aws_instance" "web" {
  2. ami = "ami-a1b2c3d4"
  3. instance_type = "t2.micro"
  4. }

resource                        resource块

"aws_instance"              资源类型,由provider决定有哪些资源类型

"web"                             本地名称,仅用于在当前模块中引用此资源

{...}                                 参数,大多数参数取决于资源类型。系统也有元参数

元参数 Meta-Arguments

  1. depends_on 用于指定隐藏的依赖项
  2. count 用于根据计数创建多个资源实例
  3. for_each 根据映射或字符串集创建多个实例
  4. provider 用于选择非默认提供程序配置
  5. lifecycle 用于生命周期自定义
  6. provisioner 用于在资源创建后采取额外的行动

data

data块可以根据provider提供的DATA SOURCE,填写对应的参数。搜索到相对应的基础设施的信息,然后data块可以作为数据源提供相关数据信息。

示例

resource中引用本地名称为"web"的data source的id。

data块中的各种参数只是为了找到对应的基础设施资源。

  1. data "aws_ami" "web" {
  2. filter {
  3. name = "state"
  4. values = ["available"]
  5. }
  6. filter {
  7. name = "tag:Component"
  8. values = ["web"]
  9. }
  10. most_recent = true
  11. }
  1. resource "aws_instance" "web" {
  2. ami = data.aws_ami.web.id
  3. instance_type = "t1.micro"
  4. }

variable

变量定义

variable块只能声明变量,并不能指定变量的值

  1. variable "image_id" {
  2. type = string
  3. description = "This is image id"
  4. default = "abcxxxx"
  5. }

支持参数

  1. default - 然后使变量可选的默认值。
  2. type - 此参数指定变量接受的值类型。
  3. description - 这指定输入变量的文档。
  4. validation - 定义验证规则的块,通常除了类型约束。
  5. sensitive - 在配置中使用变量时限制 Terraform UI 输出。
  6. nullable - 指定变量是否可以为空。

使用变量

  1. resource "some_resource" "a" {
  2. name = var.image_id
  3. ...
  4. }

变量输入

变量输入有多种方式

  1. terraform apply执行时交互式输入
  2. terraform apply -var"image_id=value"
  3. 环境变量输入,格式:TF_VAR_image_id='value'
  4. 最佳实践:通过.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 和 执行成功状态提示。

  1. #配置阿里云provider
  2. provider "alicloud" {
  3. access_key = "your_ak_xxx"
  4. secret_key = "your_sk_xxx"
  5. region = "cn-shenzhen"
  6. }
  7. #创建阿里云vpc
  8. resource "alicloud_vpc" "liqi-vpc-test" {
  9. vpc_name = "liqi-vpc-test"
  10. cidr_block = "10.100.0.0/16"
  11. }
  12. output "apply_state" {
  13. value = "apply successful"
  14. }
  15. output "new_vpc_id" {
  16. value = "${alicloud_vpc.liqi-vpc-test.id}"
  17. }

执行结果

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号