基本语法
Terraform配置语言主要基于HCL语法,具有配置简单,可读性强等特点,并且兼容JSON语法。本文主要介绍Terraform配置语言的基本语法及常见函数。
Terraform配置语言主要由参数(Argument),块(Block),表达式(Experssion)和函数(Functions)组成。
参数 (Argument)
使用等号将一个值或表达式赋值给指定的参数名称,参数名称可以使用字母、数字、下划线(_)和连接符(-)表示,且首字母不能是数字,例如:
image_id = "ad091b52-742f-469e-8f3c-fd81cadf0743"
块 (Block)
resource "huaweicloud_compute_instance" "myinstance" { name = "myinstance" ...... network { uuid = "55534eaa-533a-419d-9b40-ec427ea7195a" } }
在使用块时必须先声明其对应的类型,样例中resource和network 均为块类型,其中resource为顶层块类型,network为嵌套块类型。Terraform支持的顶层块类型包括:provider,resource,data,variable,output,module,locals等关键字。
块标签在块类型之后定义,且数量由块类型决定,样例中resource块类型包含两个标签:huaweicloud_compute_instance和myinstance,嵌套的network类型没有块标签。块主体定义在块最后,由 { 和 } 字符进行封装,在块主体内可以嵌套其他类型以实现不同的层级结构。
更多详细信息,请参见Terraform的 配置语法文档。
参数类型
Terraform支持以下参数类型:
基本类型
- string:字符串类型,由一个或多个Unicode字符组成,例如 "hello"。
- number:数字类型,可以表示整数和浮点数。
- bool:布尔类型,只能是 true 或 false。
Terraform能够根据参数类型自动将number和bool类型转换为string类型。如果一个字符串能够表示为一个数字或布尔类型的值,Terraform也可以进行反向转换。字符串、数字和布尔类型的参数可以直接赋值,例如:
disk_type = "SSD" disk_size = 40 enable = true # 支持使用字符串表示数字和布尔类型 disk_size = "40" enable = "true"
集合类型
- map(...):映射类型,以键值对(key-value pair) 的方式组合起来的数据元素集合,其中key为string类型,对应的值可以是string,number,bool等类型,且所有元素的值必须是同一类型。
- list(...):列表类型,具有同类型的数据元素集合,元素可以是基本类型和块类型,列表索引从0开始。
- set(...):集合类型,类似于列表类型,但是集合中的元素是没有任何辅助标识符或顺序,且元素具有唯一性。
# 推荐格式 tags = { foo = "bar" key = "value" } # 其他格式 tags = {"foo" = "bar", "key" = "value"} tags = {"foo" : "bar", "key" : "value"} tags = {foo = "bar", key = "value"} tags = {foo : "bar", key : "value"} tags = { foo : "bar" key : "value" }
列表类型和集合类型的表示方式相同,其中元素为基本类型的列表/集合使用 [] 封装,元素为块类型的列表/集合使用重复块的形式表示,例如:
# 基本类型的列表 security_groups = ["default", "internal"] # 块类型的列表 network { uuid = "55534eaa-533a-419d-9b40-ec427ea7195a" } network { uuid = "ad091b52-742f-469e-8f3c-fd81cadf0743" }
特殊类型
- null:空类型,如果将一个参数设置为null,表示这个参数未填写,Terraform会自动忽略该参数,并使用默认值。null在条件表达式中较为常见,如 var.test=="" ? null : var.test,表示当var.test的值为""时,就将其忽略。
其他语法
- 单行注释以#或//开头;
- 多行注释以/*开始,以*/结束,不支持嵌套块注释。
- Terraform配置文件使用UTF-8编码,对于标识符、注释和字符串都支持非ASCII字符。
- 多行字符串在一行末尾以<<EOF开头,中间是字符串内容,最后以EOF结尾。EOF也可以替换为其他字符。例如:
resource "huaweicloud_obs_bucket" "web_bucket" { ... website { ... routing_rules = <<EOF [{ "Condition": { "KeyPrefixEquals": "docs/" }, "Redirect": { "ReplaceKeyPrefixWith": "documents/" } }] EOF } }