更新时间:2022-02-10 GMT+08:00

基本语法

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(...)集合类型,类似于列表类型,但是集合中的元素是没有任何辅助标识符或顺序,且元素具有唯一性。
映射类型使用 {} 封装,其表示形式非常灵活:键值对可以使用等号"="或冒号":"连接;如果key不以数字开头,可以不加双引号;对于多行映射,键值对之间可以使用换行符或者逗号进行分隔。推荐使用等号连接键值对并用换行符进行分隔,例如:
# 推荐格式
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
      }
    }