学习表达式就是为了以后在写tf的时候,能够顺利,简化的去写。
在写region的时候,定义ecs这些属性的时候,都会使用到特定的语句,比如说循环,遍历,条件判断。这些都是离不开的。
条件表达式
有些时候需要做条件的判断,这个时候就需要条件表达式去完成。 region的值我定义为cn-hangzhou。
output "myregion" {
value = var.region != "" ? var.region : "cn-beijing"
}
上面也就是如果我这个值不为空,我们采用的是这个var.region的值。如果这个值为空,那么采用cn-beijing。
上面就是条件表达式的一个用法,条件表达式主要是对值进行判断。
调试,进入console的时候,是在项目的根模块进去。
PS C:\Users\W10\Desktop\Terraform\yufa> terraform console
> var.region
"cn-hangzhou"
> var.env
tolist([
"pro",
"dev",
"uat",
])
表达式可以在这里进行调试
> var.region != "" ? var.region : "test"
"cn-hangzhou"
for表达式
可以便利的对象一个是list,还有一个是map,还有一个set集合。
上面第一行是遍历集合,或者列表,另外一个是遍历map。
variable "env" {
type = list(string)
}
env = [ "pro","dev","uat" ]
output "env" {
value = [for index,value in var.env : "${index} ${value}"]
}
#console调试的时候记得退出,然后再进去,这些取决你的初始化
> [for index,value in var.env : "${index} ${value}"]
[
"0 pro",
"1 dev",
"2 uat",
]
除了遍历list之外,还有map。
output "env_name" {
value = [for v in var.env : "${v}"]
}
output "dns_name" {
value = [for i,v in var.dns_record : "${i} ${v}"]
}
> [for v in var.env : "${v}"]
[
"pro",
"dev",
"uat",
]
> [for i,v in var.dns_record : "${i} ${v}"]
[
"dev dev.app",
"uat uat app",
]
splat表达式
variable "ecs_spec" {
type = list(map(string))
}
> var.ecs_spec
tolist([
tomap({
"name" = "ecs01"
"type" = "tiny"
}),
tomap({
"name" = "ecs02"
"type" = "tiny"
}),
])
> var.ecs_spec[0].name
"ecs01"
> var.ecs_spec[*].name
tolist([
"ecs01",
"ecs02",
])
动态表达式里面[*]就行了,直接可以拿到所有的数据。这是一个动态的表达式,尤其是VPC,镜像的id也会使用到这些。
可读性方面[*]比*好。这样获取所有属性的信息就不需要使用for循环了。
建议在写tf的代码不要太复杂,越复杂维护困难,并且对基础设施增加了风险。