【问题标题】:Terraform - How to pass environment variables to sub modules in terraformTerraform - 如何将环境变量传递给 terraform 中的子模块
【发布时间】:2019-05-20 02:18:57
【问题描述】:

我的解决方案:

├── main.tf
├── modules
│   ├── cluster1
│   │   ├── cluster1.tf
│   │   ├── main.tf
│   │   ├── output.tf
│   │   └── variables.tf
│   ├── cluster2
│   │   ├── cluster.tf
│   │   ├── main.tf
│   │   ├── output.tf
│   │   └── variables.tf
│   └── trafficmanager
│       ├── main.tf
│       ├── output.tf
│       ├── trafficmanager.tf
│       └── variables.tf
├── README.md
└── variables.tf

为了让我创建 Azure k8s 集群,每个集群都需要服务主体 ID 和密码。我很想看到一些关于如何将包含服务主体和机密的环境变量传递给每个集群的示例。

【问题讨论】:

    标签: azure kubernetes terraform azure-aks


    【解决方案1】:

    Terraform 将以 TF_VAR_name 的形式读取环境变量以查找变量的值。比如TF_VAR_access_key变量可以设置access_key变量。

    示例

    export TF_VAR_region=us-west-1 # normal string
    export TF_VAR_alist='[1,2,3]' # array
    export TF_VAR_amap='{ foo = "bar", baz = "qux" }' # map
    

    将模块传递给 terraform 模块

    variable "region" {}
    variable "alist" {}
    variable "map" {}
    
    module "test" {
      source = "./module/testmodule" # module location
      region = "${var.region}"
      list   = "${var.alist}"
      map    = "${var.map}"
    }
    

    更多信息在this链接和一些example

    【讨论】:

    • 模块能否收集环境变量,还是必须在根目录中提取并传递给子级?
    【解决方案2】:

    您可以在模块中指定变量并将信息传递给它们:

    module.tf:

    variable "hack" {}
    variable "reference" {
      "type" = "map"
    }    
    variable "ports" {
      "default" = [2379, 6443]
    }
    

    模块调用:

    module "master" {
      source = "./vmLoop"
    
      vmName    = "master"
      reference = "${var.reference}"
      hack      = "${element(azurerm_subnet.subnets.*.id, 1)}"
    }
    

    【讨论】:

    • 感谢您的快速回复,我尝试了与您提出的类似的解决方案,这次我按照您的建议做了,不幸的是它没有奏效,看起来好像我要创建一个集群一切都在 root 上运行,然后 terraform 似乎能够获取环境变量(TF_VAR_client_id,TF_VAR_client_secret),但是当我使用子模块运行时,它不会获取环境变量值,当运行 terraform plan 服务主体设置为空时。欢迎评论
    • 你能分享一个没有敏感信息的子模块 terraform 代码吗?
    【解决方案3】:

    令人讨厌的是,您似乎必须在“根”模块中复制定义(即入口点,如果我正确理解 TF 术语)。例如:

    # "cluster" module defines variable:
    common/terraform/modules/cluster/variables.tf:
    variable "environment_root" {
        type = string
    }
    
    # "cluster" module uses it:
    common/terraform/modules/cluster/nodes.tf:
    ...
    metadata = {
        environment = var.environment_root
      }
    ...
    
    # "root" module which uses cluster module defines it:
    dev/terraform/variables.tf:
    variable "environment_root" {
        type = string
    }
    
    # "root" module passes it to cluster module:
    dev/terraform/main.tf:
    module "cluster" {
        environment_root = var.environment_root
    ...
    }
    

    然后可以设置例如:

    export TF_VAR_environment_root=whatever
    terraform apply
    

    喜欢有人用另一种方式告诉我...

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2023-03-23
      • 1970-01-01
      • 2017-04-08
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2019-06-30
      相关资源
      最近更新 更多