对Word文档进行拼写和语法检查的方法(word2013拼写和语法检查)
1741
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有一些惯用的样式约定,建议用户遵循这些约定,以确保不同团队编写的文件和模块之间的一致性。
每个嵌套级别缩进两个空格;
当多个单行的参数在同一嵌套级别连续出现时,建议将等号对齐:
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小时内删除侵权内容。