资源编排ROS配置语言兼容HCL语法,具有配置简单、可读性强等特点,并且兼容JSON语法。本文主要介绍HCL语言的基本语法及常见函数。支持Terraform 1.0.0 - 1.5.7。
资源编排ROS配置语言主要由参数(Argument)、块(Block)、表达式(Experssion) 和函数(Functions) 组成。
参数 (Argument)
使用等号将一个值或表达式赋值给指定的参数名称,参数名称可使用字母、数字、下划线(_)和连接符(-)表示,且首字母不能是数字。示例如下:
image_id = "965424eaa-533a-419d-9b40-ad091b52"块 (Block)
块将多个参数聚合在一起,并支持嵌套。块由块类型、块标签和块主体构成,格式如下:
resource "ctyun_ecs_backup_policy" "test" {
name = "test"
...
adv_retention {
adv_day = 3
}
}在使用块时必须先声明其对应的类型,上述样例中 resource 和 adv_retention 均为块类型:
resource为顶层块类型,adv_retention为嵌套块类型。HCL语言支持的顶层块类型包括:
provider、resource、data、variable、output、module、locals等关键字。
块标签在块类型之后定义,且数量由块类型决定:
上述样例中
resource块类型包含两个标签:ctyun_ecs_backup_policy和test。嵌套的
adv_retention类型没有块标签。块主体定义在块最后,由
{和}字符封装,在块主体内可嵌套其他类型以实现不同的层级结构。
参数类型
HCL支持以下参数类型,按类别分为基本类型、集合类型和特殊类型。
基本类型
string:字符串类型,由一个或多个Unicode字符组成,例如
"hello"。number:数字类型,可表示整数和浮点数。
bool:布尔类型,只能是
true或false。
HCL支持自动类型转换:
可自动将
number和bool类型转换为string类型。若一个字符串能表示为数字或布尔类型的值,也可进行反向转换。
基本类型参数可直接赋值,示例如下:
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(...):集合类型,类似列表类型,但元素无辅助标识符或顺序,且具有唯一性。
映射类型(map)
使用 { } 封装,表示形式灵活,规则如下:
键值对可使用等号
=或冒号:连接。若
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"
}列表类型(list)与集合类型(set)
列表类型和集合类型表示方式相同:
元素为基本类型的列表/集合:使用
[ ]封装。元素为块类型的列表/集合:使用重复块的形式表示。
示例如下:
# 基本类型的列表(集合表示方式相同)
security_groups = ["default", "internal"]
# 块类型的列表(集合表示方式相同)
network {
uuid = "55534eaa-533a-419d-9b40-ec427ea7195a"
}
network {
uuid = "ad091b52-742f-469e-8f3c-fd81cadf0743"
}特殊类型
null:空类型。若将参数设置为
null,表示该参数未填写,HCL会自动忽略该参数并使用默认值。null在条件表达式中较为常见,示例如下:
var.test=="" ? null : var.test
# 含义:当var.test的值为""时,忽略该参数;否则使用var.test的值其他语法
注释规则
单行注释:以
#或//开头。多行注释:以
/*开始、以*/结束,不支持嵌套块注释。
编码格式
Terraform配置文件使用UTF-8编码,标识符、注释和字符串均支持非ASCII字符.
多行字符串
以 <<EOF 开头,中间为字符串内容,最后以 EOF 结尾( EOF 可替换为其他字符)。示例如下:
resource "ctyun_obs_bucket" "web_bucket" {
...
website {
...
routing_rules = <<EOF
[{
"Condition": {
"KeyPrefixEquals": "docs/"
},
"Redirect": {
"ReplaceKeyPrefixWith": "documents/"
}
}]
EOF
}
}