Terraform 语法简介

举报
Dance-Monkey 发表于 2020/05/07 17:44:43 2020/05/07
【摘要】 Terraform的配置语言为HCL(HashiCorp Configuration Language),它是HashiCorp发明的一种声明式语言,能够以更加简短和人性化的方式来描述资源。本文主要介绍HCL配置语言的基本语法及使用,语法采用当前最新版本0.12。

Terraform的配置语言为HCL(HashiCorp Configuration Language),它是HashiCorp发明的一种声明式语言,能够以更加简短和人性化的方式来描述资源。本文主要介绍HCL配置语言的基本语法及使用,语法采用当前最新版本0.12。

基本组成

HCL文件以.tf结尾,Terraform执行时会读取该目录下所有的HCL文件。由于HCL是声明式语言,因此对资源和变量的引用不依赖于定义的顺序。通常tf文件包含provider,resource和data source,例如下面的代码创建一个ECS实例:

provider "huaweicloud" {
    user_name   = "the iam user name"
    password    = "xxxxxxxxxxxxx"
    domain_name = "the account name"
    tenamt_id   = "project id"
    region      = "cn-north-1"
    auth_url    = "https://iam.myhwclouds.com:443/v3"
}

data "huaweicloud_images_image_v2" "ubuntu" {
  name        = "Ubuntu 16.04"
  visibility  = "public"
  most_recent = true
}

resource "huaweicloud_ecs_instance_v1" "server_1" {
  name              = "server_1"
  availability_zone = "cn-north-1a"
  image_id          = data.huaweicloud_images_image_v2.ubuntu.id
  flavor            = "s3.medium"
  key_name          = "KeyPair-test"
  vpc_id            = "8eed4fc7-e5e5-44a2-b5f2-23b3e5d46235"
  security_groups   = ["default"]

  nics {
    network_id = "55534eaa-533a-419d-9b40-ec427ea7195a"
  }
}


  • provider对应一个云厂商的基础设施,它提供了云厂商对应的resource和data source。使用provider需要设置对应的密钥、地区等,这些参数名称可以在各个云厂商的插件文档中找到,比如华为云的文档在这里。执行`terraform init`时会根据provider来下载需要使用的插件,默认会从terraform官方仓库下载最新版本的插件,也可以在provider中使用`version`来指定版本。

  • resource是Teraform中最重要的组成元素,每个resource块代表一个云服务实例,如ECS、VPC等实例。

  • data source用来查询一些信息给其他的resource配置使用,比如上面通过data source查询ubuntu的公共镜像的ID,然后在ECS实例中引用它。

配置语法

Terraform 语法是围绕参数和块结构构建的。

参数(Argument)

image_id = "abc123"

参数将一个值或表达式赋给指定的参数名称,等号前的标识符是参数名称,等号后的表达式是参数的值。

块(Block)

resource "aws_instance" "example" {
  ami = "abc123"

  network_interface {
    # ...
  }
}

块是参数的容器,由块类型,标签和块主体构成。块主体在块类型关键字和标签之后定义,由`{`和`}`字符分隔。在块主体内,可以嵌套其他块类型以实现不同的层级结构。

块标签的数量由块类型关键字值决定。上面例子中的resource块类型包含两个标签:`aws_instance`和`example`。嵌套的`network_interface`块类型,可以不需要任何标签。

注释

Terraform 支持单行注释和多行注释:

  • 单行注释以`#`或者`//`开始,在行尾结束。`#`是单行注释的默认风格;

  • 多行注释以`/*`开始,以`*/`结束;

样式约定

Terraform有一些惯用的样式约定,建议用户遵循这些约定,以确保不同团队编写的文件和模块之间的一致性。

  • 每个嵌套级别缩进两个空格;

  • 当多个单行的参数在同一嵌套级别连续出现时,建议将等号对齐:

name              = "abc123"
availability_zone = "cn-north-1a"
  • 当块主体同时包含参数和块时,建议将所有参数放在顶部,嵌套块放在参数的下面并用空行隔开;

  • 使用空行分隔块中的逻辑参数组。

  • 当块主体同时包含参数和”元参数“(meta-arguments)时,建议先列出元参数,并用空行将它们与其他参数隔开。将元参数块放在最后,并用空行将他们与其他块分开。

resource "aws_instance" "example" {
  count = 2 # meta-argument first

  ami           = "abc123"
  instance_type = "t2.micro"

  network_interface {
    # ...
  }

  lifecycle { # meta-argument block last
    create_before_destroy = true
  }
}
  • 顶层块应始终用空行将彼此隔开。具有相同类型的嵌套块可以放在一起,不同类型的嵌套的块建议用空行隔开。

  • 避免将相同类型的多个块与其他不同类型的块分开。

类型

基本类型

  • `string`:字符串类型,由一个或多个Unicode字符组成,例如"hello"。

  • `number`: 数字类型,可以表示整数,也可以表示浮点数。

  • `bool`:布尔类型,只能是`true`或`false`。


数字类型和布尔类型在配置中都可以自动转换为字符串类型,相反,只要字符串值能代表有效的数字或布尔类型,都可以自动转换。比如:

  • `true`可以转换为字符串`"true"`,`"true"`也可以转换为`true`。

  • `15`可以转换为字符串`"15"`,`"15"`也可以转换为数字`15`。

复合类型

复合类型分为两类:集合类型(元素类型相同)和结构类型(元素类型可以不同)

集合类型

  • `list(...)`:列表类型,它的所有元素类型必须是**相同类型**,索引从0开始。当tf文件中表示对象的列表时写法为

data_disks {
  type = "SATA"
  size = "100"
}
data_disks {
  type = "SAS"
  size = "200"
}
  • `map(...)`: 包含多个`key: value`形式。在tf文件中的写法为

tags = {
    test = "test1"
}
  • `set(...)`:不具有任何辅助标识符或者索引的集合,集合中的元素值。


结构类型

  • `object(...)`:对象中的每个元素可以有各自的类型,其语法可以表示为`{ <KEY> = <TYPE>, <KEY> = <TYPE>, ... }`。

  • `tuple(...)`:元组是从零开始标识的元素序列,其中每个元素都有自己的类型。其语法可以表示为`[<TYPE>, <TYPE>, ...]`

特殊类型

  • `null`:表示空,如果将一个参数设置为null,表示这个参数未填写,Terraform会完全忽略这个参数。null在条件表达式中比较有用,比如当 var.test 的值为""忽略该字段可以这样写:`name = var.test == "" ? null : var.test`

变量引用

Terraform中resource和data source之间通常会引用属性值,引用方式如下:

  • 引用resource属性:可以直接引用resource属性,比如引用上面示例中ecs的id,`huaweicloud_ecs_instance_v1.server_1.id`。

  • 引用data source属性:可以使用`data.`引用data source属性,比如引用上面实例中镜像的id, `data.huaweicloud_images_image_v2.ubuntu.id`

  • 当创建多个实例时,resource中的count不为1,可以使用`count.index`引用实例的索引

  • 引用对象列表的所有的name可以使用`huaweicloud_ecs_instance_v1.server_1.data_disks[*].size`表示ecs的所有data_disks的size所组成的列表

表达式

运算符

terraform支持的运算符包括:

  • 算术运算符: `+`, `-`, `*`, `/`, `%`, `-a`

  • 比较运算符: `==`, `!=`, `<` , `<=`, `>`, `>=`

  • 逻辑运算符: `||`, `&&`, `!a`

条件表达式

terraform支持条件表达式,表示如果条件为真,结果时true_val, 否则结果为false_val。

condition ? true_val : false_val

总结

以上就是terraform的基本使用语法,更多使用例子可以参考这里

参考资料

  1. https://www.terraform.io/docs/configuration/syntax.html

  2. https://www.terraform.io/docs/configuration/style.html

  3. https://www.terraform.io/docs/configuration/types.html

  4. https://cloud.tencent.com/developer/article/1600047


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。