【问题标题】:Terraform variable to assign using function使用函数分配的 Terraform 变量
【发布时间】:2020-02-19 04:01:33
【问题描述】:
variable "cidr" {
  type = map(string)
  default = {
      development = "x.1.0.0/16"
      qa = "x.1.0.0/16"
      default = "x.1.0.0/16"
  }
} 
variable "network_address_space" {
  default = lookup(var.cidr, var.environment_name,"default")
}

我收到“错误:不允许函数调用”的错误

variable "subnet_address_space": cidr_subnet2_address_space = cidrsubnet(var.network_address_space,8,1)

【问题讨论】:

  • 您不能在变量中使用插值或函数调用。请改用local
  • 哦,听到这个消息很难过。是因为动态吗?

标签: terraform terraform-provider-aws


【解决方案1】:

正如 Hashicorp 人员在Interpolate variables inside .tfvars to define another variable 中所述,它的设计目的是保持不变。

输入变量是传入根模块的常量值,因此它们不能包含不产生常量值的插值或其他表达式。

我们不能像Using variables in terraform backend config block那样在后端使用变量。

这些是我们 Terraform 用户在某些时候绊倒的事情,我想。

【讨论】:

    【解决方案2】:

    Terraform Input Variable 类似于通用编程语言中的函数参数:它的值来自调用模块中的表达式,而不是来自当前模块。

    default 机制允许我们在调用者未指定时替换一个值,但由于变量旨在将数据从外部获取到模块中,因此将默认值设置为没有意义来自该模块内部的东西:这将导致结果可能是模块调用者永远无法实际指定的东西,因为他们无权访问必要的数据。

    Terraform 还有另一个概念Local Values,它大致类似于通用编程语言中函数内的局部变量。这些可以从当前模块中的函数结果和其他对象中提取以产生它们的值,因此我们可以一起使用输入变量和本地值来提供后备行为,就像您在问题中说明的那样:

    var "environment_name" {
      type = string
    }
    
    var "environment_default_cidr_blocks" {
      type = map(string)
      default = {
          development = "10.1.0.0/16"
          qa          = "10.2.0.0/16"
      }
    }
    
    var "override_network_range" {
      type    = string
      default = null   # If not set by caller, will be null
    }
    
    locals {
      subnet_cidr_block = (
        var.override_network_range != null ?
        var.override_network_range :
        var.environment_default_cidr_blocks[var.environment_name]
      )
    }
    

    在模块的其他地方,您可以使用local.subnet_cidr_block 来引用最终的 CIDR 块选择,无论它是由调用者显式设置还是通过查找默认值表来设置。

    当一个模块使用计算来做出这样的决定时,模块有时将其结果导出为Output Value 以便调用模块也可以使用它,类似于 Terraform 资源也导出的方式记录由提供者或远程 API 做出的决定的附加属性:

    output "subnet_cidr_block" {
      value = local.subnet_cidr_block
    }
    

    【讨论】:

    • 请注意,“locals”块中的项目被称为“local”。这在此示例中正确显示。谢谢马丁。
    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多