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

概述

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

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/<LOCAL NAME>

版本约束        =>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}"
}

执行结果

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,您需要确保已经创建了ECS集群和服务。然后,您可以使用Terraform编写一个自动扩展组件,以便在需要时自动扩展ECS任务。 以下是一个示例Terraform配置文件,其中包含自动扩展组件的定义: ``` resource "aws_autoscaling_group" "ecs" { name = "ecs-autoscaling-group" launch_configuration = aws_launch_configuration.ecs.id min_size = 1 max_size = 10 desired_capacity = 1 vpc_zone_identifier = [aws_subnet.private.*.id] tag { key = "Name" value = "ecs-autoscaling-group" propagate_at_launch = true } lifecycle { create_before_destroy = true } depends_on = [ aws_security_group_rule.egress, aws_security_group_rule.ingress, ] } resource "aws_launch_configuration" "ecs" { name_prefix = "ecs-launch-config" image_id = data.aws_ami.ecs.id instance_type = "t2.micro" iam_instance_profile = "${aws_iam_instance_profile.ecs.id}" security_groups = [aws_security_group.ecs.id] user_data = <<-EOF #!/bin/bash echo ECS_CLUSTER=${var.ecs_cluster_name} >> /etc/ecs/ecs.config EOF } data "aws_ami" "ecs" { most_recent = true filter { name = "name" values = ["amazon-ecs-optimized"] } owners = ["amazon"] } resource "aws_iam_instance_profile" "ecs" { name = "ecs-instance-profile" role = "${aws_iam_role.ecs.id}" } resource "aws_iam_role" "ecs" { name = "ecs-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "ec2.amazonaws.com" } } ] }) } resource "aws_security_group" "ecs" { name_prefix = "ecs-security-group" ingress { from_port = 0 to_port = 65535 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 0 to_port = 65535 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_security_group_rule" "ingress" { security_group_id = "${aws_security_group.ecs.id}" type = "ingress" from_port = 0 to_port = 65535 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } resource "aws_security_group_rule" "egress" { security_group_id = "${aws_security_group.ecs.id}" type = "egress" from_port = 0 to_port = 65535 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ``` 这个配置文件会创建一个自动扩展组件,其中包含一个启动配置和一个安全组。它还使用了一个IAM角色和IAM实例配置文件,以便ECS任务可以访问必要的资源。 在这个示例中,自动扩展组件将最小容量设置为1,最大容量设置为10。您可以根据需要调整这些值。 要应用此配置,请使用以下命令: ``` terraform init terraform apply ``` 这将创建自动扩展组件并将其应用于ECS集群。如果您需要更新配置,请使用`terraform apply`命令进行更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值