Terraform数据类型

概括地说,Terraform的数据类型分为两种:原始类型,复杂类型。

原始类型

原始类型包含3个:stringnumberbool

  • string:表示一组Unicode字符,例如:”hello”
  • number:表示数字,可以为整数,也可以为小数
  • bool:表示布尔值,可选值为true或false,bool类型可以做逻辑判断

numberbool都可以和string进行隐式转换,当把numberbool赋值给string时,或者反过来,Terraform都会自动做类型转换,如下示例:

  • true会被转换为”true”,反之”true”会被转换为true
  • false会被转换为”false”,反之”false”会被转换为false
  • 15会被转换为”15”,反之”15”会被转换为15

复杂类型

复杂类型是一组值所组成的复合类型,有2类复杂类型。

集合类型

Terraform支持三种集合类型:

  • 列表:list(…),列表是一组值的连续集合,可以用下标访问内部元素(从0开始)。list类型的声明可以是list(number),list(string),list(bool)等,括号中的类型即为列表元素类型。
  • 字典:map(…),表示一组键值对的集合,键类型必须是string,值的类型任意。map(number)表示键为string类型而值为number类型的字典。map类型的声明方式有2种风格:一种是以类似{"foo":"bar", "bar":"baz"}(键和值都以双引号包含);另一种是类似{foo="bar",bar="baz"}(键不以双引号包含,但如果键是以数字开头的例外)。多个键值对以逗号分隔,也可以使用换行符分隔。推荐使用第二种风格(Terraform规范规定按等号对齐,使用等号会使得代码在格式化后更美观)。
  • 集合:set(…),代表一组不重复的值的集合。

以上集合类型都支持通配类型缩写,如:list等价于list(any)map等价于map(any)set等价于set(any)
any代表支持任意元素类型,前提是所有元素都必须是同一个类型。例如:将list(string)赋值给list(any),将list(number)赋值给list(any)都是合法的。

结构化类型

一个结构化类型允许将多个不同类型的值组合成一个类型,结构化类型必须提供一个schema结构信息作为参数来指明元素的结构。

Terraform支持两种结构化类型:

  • 对象:object(…),对象是指一组具有名称和类型的属性所构成的复合类型,它的schema信息为:{key=type,key=type,...}。例如:object({name=string, age=number})代表由名称
    为”name”类型为string,以及名称为”age”类型为number的两个属性组成的对象。赋值给object类型的合法值必须包含所有属性值,但是可以拥有多余的属性(多余的属性在赋值时会被抛弃)。例如:对于object({name=string,age=number})来说,{age=18}是一个非法值,而{name="zhangsan", age=18, gender="male"}是一个合法值,但赋值时gender属性会被丢弃。
  • 元组:tuple(…),元组类似于list,也是一组值的连续集合,但是每个元素都可以有独立的类型。元组同列表一样,也可以通过下标访问元素(下标从0开始),元组的schema信息为:[type, type, ...]。元组的元素数量必须与其schema声明的类型数量相等,并且每个元素的类型都必须与其schema相应位置的类型相同。例如:tuple([string, number, bool])类型的一个合法值可以是["a", 15, true]

复杂类型也支持隐式类型转换。Terraform会尝试转换相似的类型,转换规则如下:

  • objectmap:如果一个map的键集合含有object规定的所有属性,那么map可以转换被转换为object,map里多余的键值会被抛弃,由map -> object -> map的转换可能存在数据丢失。
  • tuplelist:当一个list元素的数量正好等于一个tuple声明的长度,list可以被转换为tuple。例如:值为["18", "true", "john"]的list转换为type([number, bool, string])的tuple结果为[18, true, “john”]。
  • settuple:当一个list或者tuple被转换为一个set,重复的值将被丢弃,并且原值的顺序也将丢失。如果一个set被转换为list或者tuple,那么元素将按照以下顺序排列:如果set元素类型是string,那么将按照字母顺序排列,其他类型的元素不承诺任何特定的排列顺序。

复杂类型转换时,元素类型将在可能的情况下发生隐式转换,类似上述list到tuple的转换。

如果类型不匹配,Terraform将报错。例如:试图将object({name=["zhangsan", "lisit"],age=12})转换为map类型,这是不合法的,因为name的值为list,无法转换为string。

any类型

any类型是一种特殊的类型约束,它本身并非一个类型,而只是一个类型占位符。每当一个值被赋予由any约束的复杂类型时,Terraform会尝试计算出一个最精确的类型来替代any。
例如:把[“a”, “b”, “c”]赋值给list(any),它在Terraform中实际的物理类型首先被编译成tuple([string, string, string]),然后Terraform认为tuple和list相似,所以会尝试将它转换为list(string)。Terraform发现list(string)符合list(any)的约束,所以会用string取代any,于是赋值的最终类型为list(string)。

由于即使是list(any),所有元素类型也必须是一样的,所以某些类型转换到list(any)时会对元素进行隐式类型转换。例如:["a", 1, "b"]赋值给list(any),Terraform发现1可以转换为"1",所以最终的值为:["a", "1", "b"]

声明类型时如果不想有任何的约束,可以使用any

variable "no_type_constraint" {type = any # 这样Terraform可以将任何类型的数据赋值给参数
}

null类型

存在一种值是无类型的,那就是null。null代表数据缺失,如果把一个参数设置为null,Terraform会认为你忘记为它赋值。如果该参数有默认值,Terraform会使用默认值。如果没有默认值该参数又是必填字段,Terraform会报错。null在条件表达式中非常有用,可以在某项条件不满足时跳过对某参数的赋值。

object的optional成员

自Terraform 1.3开始,可以在object类型定义中使用optional修饰属性。

在1.3之前,如果一个variable类型为object,那么在赋值时必须传入一个完全相符的对象,如下所示:

variable "any_object" {type = object({a = string,b = string,c = number})
}

如果想传入一个对象给var.any_object,但是不准备给属性bc赋值,比如这样做:

{a = "1",b = null,c = null
}

传入的对象必须必须完全符合object类型定义的结构,哪怕是不想对某些属性赋值。

Terraform 1.3允许为一个属性添加optional声明:

variable "with_optional_attribute" {a = string,               # 必须属性b = optional(string),     # 可选属性c = optional(number, 12)  # 带默认值的可选属性,如果不传值则使用默认值
}

optional修饰符有两个参数:

  • 类型:(必填)第一个参数标明了属性的类型
  • 默认值:(选填)第二个参数定义了Terraform在没有定义该属性值时使用的默认值,默认值必须与参数类型兼容。如果没有指定默认值,Terraform会使用null作为默认值。

示例1:带有optional修饰符和默认值的内嵌结构

如下例子演示了一个输入变量,用来描述一个存储了静态网站的存储桶。
该变量的类型包含了一系列的optional属性,包括website,不但其自身是optional的,其内部还包含了数个optional的属性和默认值。

variable "buckets" {type = list(object({ # 列表元素类型为对象,对象中包含了3个属性name = string,enabled = optional(bool, true),website = optional(object({index_document = optional(string, "index.html"),error_document = optional(string, "error.html"),routing_rules = optional(string)}))}))
}

以下给出一个样例terraform.tfvars文件,为var.buckets定义了三个存储桶:

  • production:enabled属性使用了默认值
  • archived:website属性使用了默认值
  • docs:enabled属性使用了默认值,website属性中的”routing_rules”也使用了默认值
buckets = [{name = "production",website = {routing_rules = <<-EOF[{"Condition" = { "KeyPrefixEquals": "img/" },"Redirect"  = { "ReplaceKeyPrefixWith": "images/" }}]EOF}},{name = "archived",enabled = false},{name = "docs",website = {index_document = "index.txt",error_document = "error.txt"}}
]

上述配置会产生如下的varible值:

tolist([{"enabled" = true"name" = "production""website" = {"error_document" = "error.html""index_document" = "index.html""routing_rules" = <<-EOT[{"Condition" = { "KeyPrefixEquals": "img/" },"Redirect"  = { "ReplaceKeyPrefixWith": "images/" }}]EOT}},{"enabled" = false"name" = "archived""website" = {"error_document" = "error.html""index_document" = "index.html""routing_rules" = tostring(null)}},{"enabled" = true"name" = "docs""website" = {"error_document" = "error.txt""index_document" = "index.txt""routing_rules" = tostring(null)}},
])

示例2:有条件地设置一个默认属性

有时需要根据其他数据的值来动态决定是否要为一个optional参数设置值:这在引入Terraform的module之后会比较常见,发起调用的module块可以使用条件表达式搭配null来动态决定是否应该设置该参数。

还是上面variable buckets例子,使用下面的演示可以根据新输入的参数var.legacy_filenames的值来有条件地覆盖website对象中的index_documenterror_document设置。

variable "legacy_filenames" {type = booldefault = falsenullable = false
}module "buckets" {source = "./modules/buckets"buckets = [{name = "maybe_legacy",website = {index_document = var.legacy_filenames ? "INDEX.html": null,error_document = var.legacy_filenames ? "ERROR.html": null}}]
}

var.legacy_filenames设置为true时,才会覆盖websiet属性的index_documenterror_document值;当它为false时,调用不会指定website属性的index_documenterror_document值,这样website属性的index_documenterror_document会使用定义的默认值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题111:二叉树的最小深度

题目 简单 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#x…

C语言:文件操作(上)

片头 嗨&#xff01;小伙伴们&#xff0c;今天我们来学习新的知识----文件操作&#xff0c;准备好了吗&#xff1f;我要开始咯! 目录 1. 为什么使用文件&#xff1f; 2. 什么是文件&#xff1f; 3. 二进制文件和文本文件&#xff1f; 4. 文件的打开和关闭 5. 文件顺序读写…

启发式算法解魔方——python

未完待续&#xff0c;填坑ing…… 魔方操作的表示——辛马斯特标记 辛马斯特标记&#xff08;Singmaster Notation&#xff09;是一种用于描述魔方和类似拼图的转动操作的标记系统。它以大卫辛马斯特&#xff08;David Singmaster&#xff09;的名字命名&#xff0c;辛马斯特…

C 认识指针

目录 一、取地址操作符&#xff08;&&#xff09; 二、解引用操作符&#xff08;*&#xff09; 三、指针变量 1、 指针变量的大小 2、 指针变量类型的意义 2.1 指针的解引用 2.2 指针 - 整数 2.3 调试解决疑惑 认识指针&#xff0c;指针比较害羞内敛&#xff0c;我们…

单调栈-java

本次主要通过数组模拟单调栈来解决问题。 目录 一、单调栈☀ 二、算法思路☀ 1.暴力做法&#x1f319; 2.优化做法&#x1f319; 3.单调递增栈和单调递减栈&#x1f319; 三、代码如下☀ 1.代码如下&#xff08;示例&#xff09;&#xff1a;&#x1f319; 2.读入数据&a…

Ubuntu MATE系统下WPS显示错位

系统&#xff1a;Ubuntu MATE 22.04和24.04&#xff0c;在显示器设置200%放大的情况下&#xff0c;显示错位。 显示器配置&#xff1a; WPS显示错位&#xff1a; 这个问题当前没有找到好的解决方式。 因为4K显示屏设置4K分辨率&#xff0c;图标&#xff0c;字体太小&#xff…

prometheus搭建

1.prometheus下载 下载地址:Download | Prometheus 请下载LTS稳定版本 本次prometheus搭建使用prometheus-2.37.1.linux-amd64.tar.gz版本 2.上传prometheus-2.37.1.linux-amd64.tar.gz至服务器/opt目录 CentOS7.9 使用命令rz -byE上传 3.解压缩prometheus-2.37.1.linux…

【C++之map的应用】

C学习笔记---021 C之map的应用1、map的简单介绍1.1、基本概念1.2、map基本特性 2、map的基本操作2.1、插入元素2.2、访问元素2.3、删除元素2.4、遍历map2.5、检查元素是否存在2.6、获取map的大小2.7、清空map2.8、基本样例 3、map的基础模拟实现4、测试用例4.1、插入和遍历4.2、…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝

Flutter笔记 Widgets Easier组件库&#xff08;11&#xff09;使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

【多模态】29、OCRBench | 为大型多模态模型提供一个 OCR 任务测评基准

文章目录 一、背景二、实验2.1 测评标准和结果2.1.1 文本识别 Text Recognition2.1.2 场景文本中心的视觉问答 Scene Text-Centric VQA2.1.3 文档导向的视觉问答 Document-Oriented VQA2.1.4 关键信息提取 Key Information Extraction2.1.5 手写数学公式识别 Handwritten Mathe…

Ubuntu安装配置网络

参考 https://blog.csdn.net/qq_59633155/article/details/131252293https://blog.csdn.net/qq_59633155/article/details/131252293 Ubuntu配置网络 1&#xff0c;查看网络是否连接 终端输入 ping baidu.com 如若成功则如下图所示 如未能成功&#xff0c;则继续按下面步骤…

解决HTTP 403 Forbidden错误:禁止访问目录索引问题的解决方法

解决HTTP 403 Forbidden错误&#xff1a;禁止访问目录索引问题的解决方法 过去有人曾对我说&#xff0c;“一个人爱上小溪&#xff0c;是因为没有见过大海。”而如今我终于可以说&#xff0c;“我已见过银河&#xff0c;但我仍只爱你一颗星。” 在Web开发和服务器管理中&#x…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

(三)JVM实战——对象的内存布局与执行引擎详解

对象的内存布局 对象的实例化 对象的创建方式 - new的方式 - Class的newInstance():反射的方式 - Construct的newInstance() - clone:实现Cloneable接口,默认浅拷贝 - 使用反序列化&#xff1a;将二进制流转化为内存对象 创建对象的步骤 - 判断对象对应的类是否加载、链接、初…

You don’t have permission.

The document “XXX” could not be saved. You don’t have permission. 1.查看修改了iOS系统库导致的, 根据提示, 进入到"XXX"文件中, 然后commandz回退/取消 2. Xcode 调试遇到的报错&#xff08;持续更新&#xff09;

18_Scala面向对象编程trait

文章目录 trait1.定义trait2.向类中混入特质2.1没有父类2.2有父类 3.动态混入3.1动态混入查询功能到公司业务中 4.父类&#xff0c;子类&#xff0c;特质初始化优先级5.Scala功能执行顺序6.常用API trait –特质的学习需要类比Java中的接口&#xff0c;源码编译之后就是interf…

练习题(2024/5/3)

1对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中…

(论文阅读-优化器)A Cost Model for SPARK SQL

目录 Abstract 1 Introduction 2 Related Work 3 Background and Spark Basics 4 Cost Model Basic Bricks 4.1 Cluster Abastraction and Cost Model Parameters 4.2 Read 4.3 Write 4.4 Shuffle Read 4.5 Broadcast 5 Modeling GPSJ Queries 5.1 Statistics and S…

QT+网络调试助手+TCP客户端

一、网络调试助手UI界面 编程主要思路&#xff1a; 首先将水平的控件 水平布局 &#xff0c;然后相对垂直的控件 垂直布局 &#xff0c;哪怕是底下的groupBox也需要和里面的内容 水平布局&#xff0c;然后最后框选全部 栅格布局。如果需要界面自适应窗口大小&#xff0c…

【白话机器学习系列】白话特征向量

白话特征向量 一个方阵 A A A 与列向量 v v v 的乘积会生成一个新的列向量。这个新向量通常与原向量有着不同的方向&#xff0c;矩阵在这里代表一个线性变换。然而&#xff0c;某些向量会保持其原始方向。我们称这种向量为矩阵 A A A 的特征向量&#xff08;eigenvector&…