【问题标题】:Terraform Module variables.tfTerraform 模块变量.tf
【发布时间】:2021-04-01 18:14:34
【问题描述】:

尝试使用 terraform 模块并遇到一个奇怪的问题(我认为)。这是我的结构: [TF目录结构][1] [1]:https://i.stack.imgur.com/P4fyr.png

这是根 main.tf:

    provider "azurerm" {
      features {
      }
    }
   
    module "createrg" {
      source = "./modules/rg"
      my_loc = var.my_loc
      rgName = var.rgName
    }

这是根变量.tf

    variable "my_loc" {
      type = "string"
    }
    
    variable "rgName" {
      type = "string"
    }

这是“rg”模块的 main.tf:

    provider "azurerm" {
      ## dev_subscription_id = var.dev_subscription
      features {
        
      }
    }
    resource "azurerm_resource_group" "rgDev" {
      location = var.my_loc
      name = var.rgName
    }

这是“rg”模块的 variable.tf

    variable "my_loc" {
      type = "string"
    }
    
    variable "rgName" {
      type = "string"
    }

这里是 dev.tfvars

    my_loc = "canadacentral"
    rgName = "rg_ModuleTest"

我的计划是:

terraform plan -var-file=./variables/dev.tfvars

由于我刚开始使用 terraform,所以我使用的是最新版本。如果我从一个或两个 variables.tf 中删除任何变量,我会收到错误并且计划不会执行。例如,如果我从根 variables.tf 文件中删除变量声明,我会收到错误:“错误:引用未声明的输入变量”,如果我从 rg 模块中的 variable.tf 中删除变量声明,我会收到一个错误:“错误:不支持的参数...此处不应使用名为“rgName”的参数。”该计划有效的唯一方法是当我在根模块和 rg 模块的 variables.tf 文件中具有相同的变量时。

这就是模块应该如何工作的方式吗?我已经在互联网上搜索了一个解释,但我认为我在这里遗漏了一些东西。我的意思是,如果我要为 20 个资源创建模块,那么认为我必须在两个地方(根目录和相应模块的 variables.tf 文件)复制变量感觉很荒谬。

提前感谢您的帮助。

【问题讨论】:

    标签: module terraform terraform-provider-azure


    【解决方案1】:

    Modules 是独立的。成功执行 rg 模块所需的所有变量都在./modules/rg/variables.tf 中定义。

    由于您没有为它们定义任何default values,它们被统一化了。因此,在您的根 main.tf 中,当您创建 createrg 模块时,您必须显式设置所有这些变量。

    关于命名,在您的“.root/main”中,您的变量var.my_locvar.rgName 不需要与./modules/rg/variables.tf 中的名称相同。只要您要设置模块的所有这些未初始化的变量,它们就可以有任何名称或常量。

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2021-05-06
      • 2018-09-07
      • 1970-01-01
      • 2020-05-16
      相关资源
      最近更新 更多