Terraform 语法简介

网友投稿 1702 2022-05-30

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

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

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

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(...)`:对象中的每个元素可以有各自的类型,其语法可以表示为`{ = , = , ... }`。

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

特殊类型

`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的基本使用语法,更多使用例子可以参考这里。

参考资料

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

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

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

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

容器 弹性云服务器 ECS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python办公自动化(三) | 借助服务器定时爬数据发邮件
下一篇:微信小程序商城免费对接快递单号查询接口
相关文章