Terraform基础

Terraform基础,第1张

概述

        用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内
  • ,表示一个值或者用表达式表达的一个值

provider

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版本

resource
resource "aws_instance" "web" {
  ami           = "ami-a1b2c3d4"
  instance_type = "t2.micro"
}

resource                        resource块

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

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

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

元参数 Meta-Arguments
depends_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
  ...
}

变量输入

变量输入有多种方式

  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 和 执行成功状态提示。

#配置阿里云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}"
}

执行结果

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874849.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存