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文件中。
对于具有简单值的变量,这很容易,但是我不清楚如何使用嵌套结构来做到这一点。用变量替换xxx.xxx.xx.xxx [例如var.work_ip]导致错误
variables may not be used here
有什么见解?
答案 0 :(得分:0)
如果您在主配置中完全省略了default
参数,则将variable "authorized_networks"
标记为 required 输入变量,然后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
选项在命令行上显式指定此文件,或者在您使用当前工作目录中的文件名时以.auto.tfvars
或.auto.tfvars.json
结尾运行Terraform,然后Terraform将自动查找并加载它。
使某些内容脱离版本控制的常见原因是,它是在更广泛的系统中其他位置配置的动态设置,而不是版本控制中固定的值。如果在这里是对的,那么另一种策略是将该设置保存在Terraform可以通过data sources访问的配置数据存储中,然后编写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参数存储或HashiCorp Consul之类的配置存储的更通用的数据源。直接访问必要的信息或将其“在线”发布到配置存储中,对于大型系统有效地集成子系统很有帮助。