在 Terraform 配置中获取环境变量?

Getting an Environment Variable in Terraform configuration?

我有两个环境变量。一个是 TF_VAR_UN,另一个是 TF_VAR_PW。然后我有一个看起来像这样的地形文件。

resource "google_container_cluster" "primary" {
    name = "marcellus-wallace"
    zone = "us-central1-a"
    initial_node_count = 3

    master_auth {
        username = ${env.TF_VAR_UN}
        password = ${env.TF_VAR_PW}
    }

    node_config {
        oauth_scopes = [
            "https://www.googleapis.com/auth/compute",
            "https://www.googleapis.com/auth/devstorage.read_only",
            "https://www.googleapis.com/auth/logging.write",
            "https://www.googleapis.com/auth/monitoring"
        ]
    }
}

我想用环境变量 TF_VAR_UNTF_VAR_PW 替换的两个值是值用户名和密码。我尝试了上面显示的内容,但没有成功,我也试过其他一些东西,但总是遇到语法问题。

我会尝试更像这样的东西,它看起来更接近 documentation

variable "UN" {
  type = string
}

variable "PW" {
  type = string
}

resource "google_container_cluster" "primary" {
  name = "marcellus-wallace"
  zone = "us-central1-a"
  initial_node_count = 3

  master_auth {
    username = var.UN
    password = var.PW
  }

  node_config {
    oauth_scopes = [
        "https://www.googleapis.com/auth/compute",
        "https://www.googleapis.com/auth/devstorage.read_only",
        "https://www.googleapis.com/auth/logging.write",
        "https://www.googleapis.com/auth/monitoring"
    ]
  }
}

CLI命令如下。

TF_VAR_UN=foo TF_VAR_PW=bar terraform apply

为了使用需要用“”包裹的变量 例如:

username = "${var.UN}"

使用插值语法会引发 terraform 警告 v0.12.18。现在您不需要使用插值语法。您可以将其引用为 var.hello.

注意: 从语言的角度来看,需要理解的一件重要事情是,您不能使用环境变量来声明变量。您只能使用环境变量为脚本中声明的变量赋值。例如,假设您有以下 .tf 脚本

variable "hello" { type=string }

现在,如果环境有一个变量 TF_VAR_hello="foobar",在运行时变量 hello 将具有值 "foobar"。如果在没有变量声明的情况下分配变量,将不会有任何效果。

大多数提供商使用:

DefaultFunc: schema.EnvDefaultFunc("

您可以执行以下操作以使其正常工作。

1.Declare terraform 配置中要用作环境变量的变量。 -->变量“db_password”{类型=字符串}

  1. 在您要使用此变量的资源部分将其更改为 -->"db_password":"${var.db_password}"

3.export 环境变量。 -->导出 TF_VAR_db_password="##密码##"

4.terraform计划或申请

使用null_resource执行终端命令(读取环境变量),重定向输出到文件,然后读取文件内容:

resource "null_resource" "read_environment_var_value_via_cli" {
  triggers = { always_run = "${timestamp()}" }
  provisioner "local-exec" {
    command = "echo $TF_VAR_UN > TF_VAR_UN.txt" # add gitignore
  }
}

data "local_file" "temp_file" {
  depends_on    = [ null_resource.read_environment_var_value_via_cli]
  filename      = "${path.module}/TF_VAR_UN.txt" 
}

# use value as desired
resource "google_container_cluster" "primary" {
    master_auth {
        username = data.local_file.temp_file.content # value of $TF_VAR_UN
        ..
    }
}