terraform 已调整其授权
在 main.tf [对于 sql 配置] 中,我现在有:
resource "google_sql_database_instance" "master" {
name = "${random_id.id.hex}-master"
region = "${var.region}"
database_version = "POSTGRES_9_6"
# allow direct access from work machines
ip_configuration {
authorized_networks = "${var.authorized_networks}"
require_ssl = "${var.sql_require_ssl}"
ipv4_enabled = true
}
}
哪里
在我有 variables.tf
variable "authorized_networks" {
description = "The networks that can connect to cloudsql"
type = "list"
default = [
{
name = "work"
value = "xxx.xxx.xx.xxx/32"
}
]
}
其中 xxx.xxx.xx.xxx 是我想允许的 IP 地址。但是,我不想把它放在我的 variables.tf 文件中,而是放在一个非源代码控制的.tfvars文件中。
对于具有简单值的变量,这很容易,但我不清楚如何使用嵌套结构来做到这一点。用变量 [例如 var.work_ip] 替换 xxx.xxx.xx.xxx 会导致错误
variables may not be used here
有什么见解吗?
如果您在主配置中完全省略default
参数,则会variable "authorized_networks"
标记为必需的输入变量,然后 Terraform 将检查该变量以确保它是由调用者设置的。
如果这是根模块变量,则可以使用以下语法在.tfvars
文件中为其提供值:
authorized_networks = [
{
name = "work"
value = "xxx.xxx.xx.xxx/32"
}
]
如果此文件是通过围绕 Terraform 的一些包装自动化以编程方式生成的,您还可以将其写入.tfvars.json
文件并使用 JSON 语法,这通常更容易在其他语言中可靠构建:
{
"authorized_networks": [
{
"name": "work",
"value": "xxx.xxx.xx.xxx/32"
}
]
}
您可以使用-var-file
选项在命令行上显式指定此文件,也可以在运行 Terraform 时为其指定一个以.auto.tfvars
结尾的名称,或者在当前工作目录中.auto.tfvars.json
,然后 Terraform 将自动查找并加载它。
将某些内容排除在版本控制之外的常见原因是,它是在更广泛系统中其他位置配置的动态设置,而不是版本控制中固定的值。如果此处为真,则另一种策略是将该设置保存在 Terraform 能够通过数据源访问的配置数据存储中,然后编写 Terraform 配置以直接从发布设置的位置检索该设置。
例如,如果您在此处建模的网络是 Google Cloud Platform 子网,并且它具有固定名称或可以在 Terraform 中系统派生的名称,则可以使用google_compute_subnetwork
数据源检索此设置:
data "google_compute_subnetwork" "work" {
name = "work"
}
在配置中的其他地方,您可以使用data.google_compute_subnetwork.work.ip_cidr_range
访问此网络的 CIDR 块定义。
主要的 Terraform 提供商拥有各种各样的数据源,包括从目标平台检索特定一类对象的数据源,以及访问配置存储(如 AWS Systems Manager Parameter Store 或 HashiCorp Consul)的更通用数据源。直接访问必要的信息或在配置存储中"在线"发布这些信息有助于在更大的系统中有效地集成子系统。