学习表达式就是为了以后在写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"
可以便利的对象一个是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",
- ]
- 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的代码不要太复杂,越复杂维护困难,并且对基础设施增加了风险。