企业网站备案好不好,dw制作网站网页模板,优品ppt免费模板,建设学校网站的需求分析概括地说#xff0c;Terraform的数据类型分为两种#xff1a;原始类型#xff0c;复杂类型。
原始类型
原始类型包含3个#xff1a;string#xff0c;number#xff0c;bool。
string#xff1a;表示一组Unicode字符#xff0c;例如#xff1a;”hello”numberTerraform的数据类型分为两种原始类型复杂类型。
原始类型
原始类型包含3个stringnumberbool。
string表示一组Unicode字符例如”hello”number表示数字可以为整数也可以为小数bool表示布尔值可选值为true或falsebool类型可以做逻辑判断
number和bool都可以和string进行隐式转换当把number或bool赋值给string时或者反过来Terraform都会自动做类型转换如下示例
true会被转换为”true”反之”true”会被转换为truefalse会被转换为”false”反之”false”会被转换为false15会被转换为”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}键和值都以双引号包含另一种是类似{foobarbarbaz}键不以双引号包含但如果键是以数字开头的例外。多个键值对以逗号分隔也可以使用换行符分隔。推荐使用第二种风格Terraform规范规定按等号对齐使用等号会使得代码在格式化后更美观。集合set(…)代表一组不重复的值的集合。
以上集合类型都支持通配类型缩写如list等价于list(any)map等价于map(any)set等价于set(any)。any代表支持任意元素类型前提是所有元素都必须是同一个类型。例如将list(string)赋值给list(any)将list(number)赋值给list(any)都是合法的。
结构化类型
一个结构化类型允许将多个不同类型的值组合成一个类型结构化类型必须提供一个schema结构信息作为参数来指明元素的结构。
Terraform支持两种结构化类型
对象object(…)对象是指一组具有名称和类型的属性所构成的复合类型它的schema信息为{keytypekeytype...}。例如object({namestring, agenumber})代表由名称 为”name”类型为string以及名称为”age”类型为number的两个属性组成的对象。赋值给object类型的合法值必须包含所有属性值但是可以拥有多余的属性多余的属性在赋值时会被抛弃。例如对于object({namestring,agenumber})来说{age18}是一个非法值而{namezhangsan, age18, gendermale}是一个合法值但赋值时gender属性会被丢弃。元组tuple(…)元组类似于list也是一组值的连续集合但是每个元素都可以有独立的类型。元组同列表一样也可以通过下标访问元素下标从0开始元组的schema信息为[type, type, ...]。元组的元素数量必须与其schema声明的类型数量相等并且每个元素的类型都必须与其schema相应位置的类型相同。例如tuple([string, number, bool])类型的一个合法值可以是[a, 15, true]。
复杂类型也支持隐式类型转换。Terraform会尝试转换相似的类型转换规则如下
object和map如果一个map的键集合含有object规定的所有属性那么map可以转换被转换为objectmap里多余的键值会被抛弃由map - object - map的转换可能存在数据丢失。tuple和list当一个list元素的数量正好等于一个tuple声明的长度list可以被转换为tuple。例如值为[18, true, john]的list转换为type([number, bool, string])的tuple结果为[18, true, “john”]。set和tuple当一个list或者tuple被转换为一个set重复的值将被丢弃并且原值的顺序也将丢失。如果一个set被转换为list或者tuple那么元素将按照以下顺序排列如果set元素类型是string那么将按照字母顺序排列其他类型的元素不承诺任何特定的排列顺序。
复杂类型转换时元素类型将在可能的情况下发生隐式转换类似上述list到tuple的转换。
如果类型不匹配Terraform将报错。例如试图将object({name[zhangsan, lisit],age12})转换为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代表数据缺失如果把一个参数设置为nullTerraform会认为你忘记为它赋值。如果该参数有默认值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但是不准备给属性b和c赋值比如这样做
{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定义了三个存储桶
productionenabled属性使用了默认值archivedwebsite属性使用了默认值docsenabled属性使用了默认值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 truename productionwebsite {error_document error.htmlindex_document index.htmlrouting_rules -EOT[{Condition { KeyPrefixEquals: img/ },Redirect { ReplaceKeyPrefixWith: images/ }}]EOT}},{enabled falsename archivedwebsite {error_document error.htmlindex_document index.htmlrouting_rules tostring(null)}},{enabled truename docswebsite {error_document error.txtindex_document index.txtrouting_rules tostring(null)}},
])
示例2有条件地设置一个默认属性
有时需要根据其他数据的值来动态决定是否要为一个optional参数设置值这在引入Terraform的module之后会比较常见发起调用的module块可以使用条件表达式搭配null来动态决定是否应该设置该参数。
还是上面variable buckets例子使用下面的演示可以根据新输入的参数var.legacy_filenames的值来有条件地覆盖website对象中的index_document和error_document设置。
variable legacy_filenames {type booldefault falsenullable false
}module buckets {source ./modules/bucketsbuckets [{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_document和error_document值当它为false时调用不会指定website属性的index_document和error_document值这样website属性的index_document和error_document会使用定义的默认值。