在 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_UN
和 TF_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”{类型=字符串}
- 在您要使用此变量的资源部分将其更改为
-->"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
..
}
}
我有两个环境变量。一个是 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_UN
和 TF_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”{类型=字符串}
- 在您要使用此变量的资源部分将其更改为 -->"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
..
}
}