文档章节

Terraform配置文件(Terraform configuration)

buddie
 buddie
发布于 2018/12/11 00:31
字数 1835
阅读 23
收藏 0

Terraform配置文件

翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。

配置文件的格式,支持两种方式:Terraform格式和JSON格式。Terraform格式更易于阅读,而且支持注释。大多部情况下,我们推荐使用Terraform格式。JSON格式,适用于机器创建、修改和更新。当然,如果你坚持,也可以使用JSON格式(原文:The JSON format is meant for machines to create, modify, and update, but can also be done by Terraform operators if you prefer.)。Terraform格式以.tf结尾,JSON格式以.tf.json结尾。

加载顺序和语法

当调用任何加载Terraform配置文件的命令时,Terraform将以字母表的顺序加载指定文件夹下所有的配置文件。 配置文件的文件名必须以.tf或.tf.json结尾,并且这可以直观的看出配置文件使用得是哪种格式。除此之外的文件,都将被忽略。Terraform格式的配置文件和JSON格式的配置文件,可以同时存放在同一个文件夹下。甚至你的配置文件,可以一个使用Terraform格式,另一个使用JSON格式。

Override文件是一个例外。它们是在其它文件(非Override文件)加载完成后,按字母顺序加载的。

被加载配置文件中的配置,是以相互追加的。这与“合并”形成了的鲜明的对比。这意味着,当两个配置文件中的资源使用了相同的名字,将不会被合并,而是报一个验证失败异常。这与override的合并,形成了鲜明的对比。

配置文件中定义的变量、资源顺序,是不关紧要的。Terraform的配置是声明式的,因此对其它变量、资源的引用,不依赖于它的定义顺序。

配置文件语法

Terraform配置的语法,叫做HashiCorp Configuration Language(HCL)。它在易读性、可编辑性,及机器友好性方面,取得了平衡。在机器友好性方面,Terraform也可以读取JSON配置文件。然后,对于大多部场景下,我们仍然推荐使用HCL语法,也就是前面说的Terraform格式。

Terraform 语法

下面是Terraform的HCL语法的[示例][示例]:

# An AMI
variable "ami" {
  description = "the AMI to use"
}

/* A multi
   line comment. */
resource "aws_instance" "web" {
  ami               = "${var.ami}"
  count             = 2
  source_dest_check = false

  connection {
    user = "root"
  }
}

基本要点参考:

  • 单选注释以 # 开始
  • 双行注释在 /* ... */ 之间
  • 使用 key = value 的语法进行赋值(空格可以忽略)。value 可以是任意基本类型(字符串、数字、布尔),列表或Map。
  • 字符串使用双引号
  • 可以使用${}的语法来将字符串插入到其它值当中,比如${var.foo}。插值语法的详细文档在下面。
  • 跨行的字符串,可以使用shell-style的"here doc"语法,字符串可以使用像 <<EOF 开头,然后以EOF结尾。字符串行和结尾符所在的行,一定不能缩进。
  • 数字默认基于十进制。如果使用0x作为数字的前缀,则将其视为十六进制数字。
  • 布尔值:true, false
  • 基本类型的列表,可以使用中括号[]。比如,["foo", "bar", "baz"]。
  • Map可以使用大括号 {} 和冒号 : ,比如,{"foo":"bar", "bar":"baz"}。key值上的双引号,可以省略。但当key值是数字时,则需要双引号。单行Map,在每一组键值对(key:value)之间,需要逗号 , 分隔。多行Map,换行可以做为每一组键值对的分隔,不必再使用逗号 , 分隔。

除了以上的基本语法,还支持配置片段层次结构语法。比如上面的示例中,"resource" 和 "variable"。这些片段与Map类似,但比Map定直观。例如下面两段配置,几乎相等:

variable "ami" {
	description = "the AMI to use"
}

等价于:

variable = [{
	"ami" : {
		"description" : "the AMI to use",
	}
}]

有没有注意到顶部片段看起来好多了?通过重复variable片段,它构建出了变更列表。请尽可能的使用片段,因为这样确实更清晰、易读。

JSON语法

Terraform也支持JSON格式配置文件的读取。上面的示例转化为JSON就是:

{
  "variable": {
    "ami": {
      "description": "the AMI to use"
    }
  },

  "resource": {
    "aws_instance": {
      "web": {
        "ami": "${var.ami}",
        "count": 2,
        "source_dest_check": false,

        "connection": {
          "user": "root"
        }
      }
    }
  }
}

JSON格式的缺点是可读性差,并且缺少注释。否则,两者完全可以互操作。

插值语法(Interpolation Syntax)

无论你使用的是Terraform语法,还是JSON语法,你都可以在字符串中,插入其它的值。插值包含在 ${} 中, 比如 ${var.foo} 。

插值语法功能强大,你可以使用它来引用变量,资源属性,调用方法等。

你可以使用插值语法来执行简单的数学运算,比如你可以使用这样的表达式${count.index + 1}。你还可以基于某种逻辑,使用条件来判断一个值。

你可以使用双美元符号($$)来转义插值。比如 $${foo} 输出的就是文字 ${foo} 。

可用变量

您可以使用各种可用的变量引用。

  • 用户字符串变量 使用 var. 开头,后面加上你的变量名。例如,${var.foo} 将插入变量foo的值。

  • 用户键值对(Map)变量 语法是 var.MAP["KEY"]。例如,${var.amis["us-east-1"]} 将返回Map变量amis中,键(key)值为 us-east-1的值(value)。

  • 用户列表变量 语法是 var.LIST 。例如,${var.subnets} 将以列表的形式,返回列表subnets中的所有值。你也可以获取列表中指定索引位置的值:${var.subnets[idx]}。

  • 自己的资源属性 语法是 self.ATTRIBUTE 。例如 ${self.private_ip} 将插入这个资源的私有IP地址。

语法 self.ATTRIBUTE 只在资源提供者内被允许使用且有效。

  • 其它资源的属性 语法是 TYPE.NAME.ATTRIBUTE 。例如,${aws_instance.web.id}返回插入aws_instance资源中,资源名字为web的,资源ID。如果这个资源中有一个 count 属性集合,你可以通过索引值来访问这些属性,索引值是以0为起点的。比如${aws_instance.web.0.id}.你也可以使用splat语法来获取所有资源的某属性的列表,比如 ${aws_instance.web.*.id}。

  • 数据源的属性 语法是 data.TYPE.NAME.ATTRIBUTE 。例如${data.aws_ami.ubuntu.id}将插入aws_ami中,名称为ubunbu的数据源的,ID属性。如果这个数据源有count属性集合,你可以通过基于零的索引位置,来访问单个的属性。比如,${data.aws_subnet.example.0.cidr_block}。你也可以使用splat语法来获取所有资源的某属性的列表,比如 ${data.aws_subnet.example.*.cidr_block}。

  • 模型输出 语法是 MODULE.NAME.OUTPUT 。例如 ${module.foo.bar} 将插入模型foo的bar输出。

  • 计数信息 语法是 count.FIELD 。例如 ${count.index} 将插入一个多计数资源(一类资源可以有多个实例)的当前索引值。关于 count 的更多信息,可以查看资源配置页

  • 路径信息 语法是 path.TYPE。 TYPE 可以是 cwd, module, 或者root。

未完待续

© 著作权归作者所有

共有 人打赏支持
buddie
粉丝 0
博文 6
码字总数 3348
作品 0
海淀
私信 提问
【最佳实践】如何快速使用 Terraform Module 创建&管理OSS资源

1.Terraform简介 Terraform 是一个开源的自动化的资源编排工具,支持多家云服务提供商。阿里云作为第三大云服务提供商,terraform-alicloud-provider 已经支持了超过 90 多个 Resource 和 Da...

figo168hf
2018/11/30
0
0
阿里云平台下Terraform+Packer一键部署WordPress案例

前言 前面 云生态下的基础架构资源管理利器Terraform 一文对Terraform做了产品介绍,包括安装、模板配置文件编写,资源构建与销毁等。这里通过介绍Terraform + Packer 在阿里云平台上一键部署...

子优
2018/07/10
0
0
Terraform,自动化配置与编排必备利器

Terraform - Infrastructure as Code什么是 Terraform Terraform 是一个安全、高效地部署、更改、版本化基础设施和应用程序的工具,可以用来管理多层次的资源。从上层的软件配置到底层的网络...

突突突酱
2018/12/11
0
0
cloudstack之 添加指定IP实例

前言: 一句话来描述terraform话: 基于各种云的api实现管理基础设施的命令行工具 官方原话: Terraform is a tool for building, changing, and combining infrastructure safely and effic...

Firxiao
2015/06/08
0
0
使用Terraform创建托管版Kubernetes

目前,阿里云容器服务已经可以创建托管版Kubernetes集群了。相比于默认的Kubernetes集群,托管版本会主动替您运维一套高可用的Master组件,免去了默认版本集群中三个节点,从而节约所需的资金...

阿里云云栖社区
2018/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java并发编程基础(二)

线程安全与数据同步

chendom
25分钟前
1
0
在Centos7 上安装SVN

在Centos7 上安装SVN 2017年11月16日 17:07:54 crossangles_2017 阅读数:2543 1、安装 使用yum安装非常简单: yum install subversion 2、配置 创建仓库 我们这里在/opt下建立一个名为svn的...

linjin200
27分钟前
1
0
牛津词典 2018 年度词汇 ——「有毒」!

简评:本文并没有「标题党」,牛津词典公布的 2018 年度词汇就是 Toxic. 意为「有毒的」。 2018 was toxic. Toxic 这个词是什么意思呢? 牛津词典(Oxford Dictionaries)在 Word of the Da...

极光推送
33分钟前
1
0
浅谈Service Mesh体系中的Envoy

https://blog.csdn.net/yunqiinsight/article/details/81019255

易野
42分钟前
1
0
嵌入式应用选择合适的微控制器

准备所需硬件接口列表 使用微控制器的基本硬件框图,准备一份微控制器需要支持的所有外设接口的列表。微控制器中有两种常见的接口类型需要列出。第一种是通信接口,这些是外围设备,如USB,S...

linuxCool
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部