terraform - 在通用数据过滤器上使用 terraform_remote_state
问题描述
我想了解何时建议使用terraform_remote_state
通用数据过滤器方法。
我看到像图像这样的情况,它们不是由另一个 terraform 状态管理的,在这种情况下,显而易见的(也是唯一的)选择是数据过滤器。但是,在大多数情况下,我可以在terraform_remote_state
其他数据过滤器之间进行选择。我找不到关于这个问题的官方建议。
举个例子(下面的代码并没有按原样运行,简化为只展示主要思想):
让我们假设我们有一个具有自己的状态/工作区的中心组件
保险库/main.tf:
terraform {
backend "azurerm" {
storage_account_name = "tfstates"
container_name = "tfstates"
key = "vault/all.tfstate"
}
}
provider "openstack" {
version = "1.19"
cloud = "openstack"
}
resource "openstack_networking_subnetpool_v2" "vault" {
name = "vault"
prefixes = ["10.1.0.0/16"]
min_prefixlen = 24
default_prefixlen = 24
}
resource "openstack_networking_network_v2" "vault" {
name = "vault"
}
resource "openstack_networking_subnet_v2" "vault" {
name = "vault"
network_id = openstack_networking_network_v2.vault.id
subnetpool_id = openstack_networking_subnetpool_v2.vault.id
}
// Make cidr available for terraform_remote_state approach
output "cidr" {
value = openstack_networking_subnet_v2.vault.cidr
}
....
选项 1:使用数据过滤器将另一个 tf 工作区中的 vault cidr 列入白名单
postgres/main.tf:
terraform {
backend "azurerm" {
storage_account_name = "tfstates"
container_name = "tfstates"
key = "postgres/all.tfstate"
}
}
provider "openstack" {
version = "1.19"
cloud = "openstack"
}
data "openstack_identity_project_v3" "vault" {
// assuming vault is setup in its own project
name = "vault"
}
data "openstack_networking_network_v2" "vault" {
name = "vault"
tenant_id = data.openstack_identity_project_v3.vault.id
}
data "openstack_networking_subnet_v2" "vault" {
name = "vault"
tenant_id = data.openstack_identity_project_v3.vault.id
}
resource "openstack_networking_secgroup_v2" "postgres" {
name = "postgres"
description = "Allow vault connection"
}
resource "openstack_networking_secgroup_rule_v2" "allow-vault" {
direction = "ingress"
ethertype = "IPv4"
security_group_id = openstack_networking_secgroup_v2.postgres.id
remote_ip_prefix = data.openstack_networking_subnet_v2.vault.cidr
}
选项 2:使用 terraform_remote_state 将另一个 tf 工作区中的 vault cidr 列入白名单
postgres/main.tf:
terraform {
backend "azurerm" {
storage_account_name = "tfstates"
container_name = "tfstates"
key = "postgres/all.tfstate"
}
}
provider "openstack" {
version = "1.19"
cloud = "openstack"
}
data "terraform_remote_state" "vault" {
backend "azurerm" {
storage_account_name = "tfstates"
container_name = "tfstates"
key = "vault/all.tfstate"
}
}
resource "openstack_networking_secgroup_v2" "postgres" {
name = "postgres"
description = "Allow vault connection"
}
resource "openstack_networking_secgroup_rule_v2" "allow-vault" {
direction = "ingress"
ethertype = "IPv4"
security_group_id = openstack_networking_secgroup_v2.postgres.id
remote_ip_prefix = data.terraform_remote_state.vault.cidr
}
就个人而言,我更喜欢它,terraform_remote_state
因为从模块的角度来看,它感觉不那么模棱两可并且更具声明性(即,您有意识地声明应该由其他工作区使用的输出变量)。但是,如果有充分的理由反对它,或者是否有一些我不知道的最佳实践,我很感兴趣。
对于这样的场景,有官方推荐的方法吗?
解决方案
@martin-atkins在 HashiCorp 讨论论坛中给出了很好的答案。
但是,他没有在这个帖子上回应,所以为了完成,我用我自己的话来总结一下要点。
适当的 HashiCorp 方式将是第三种选择:将参数写入配置存储,例如 Consul。
这带来了多重好处:
- 您可以控制向其他工具公开的内容(问题选项 2 的好处:显式发布)
- Terraform 工作空间之间没有紧密耦合(问题选项 1 的好处:解耦)。即,变量生产者与变量消费者分离。
- 其他工具,包括 Terraform 本身,可以在以后使用这些值。
我建议阅读原始答案,因为它更深入。
推荐阅读
- javascript - 如何在javascript中转换json数据
- python - 是否可以通过使用 `psutil` 或任何其他 Python 包来获取兄弟进程的 PID?
- javascript - regexp matchAll 组名未显示
- c# - 无法获取类中的方法
- algorithm - 在线性时间内验证从每个节点到汇节点的最小成本
- google-cloud-platform - 谷歌云平台无法创建项目
- python-3.x - 带加号的健康酒吧/已关闭
- javascript - 为敌人制作一个有效的战斗系统
- java - 如何重构地图转换操作
- openshift - 如何授予 OpenShift 用户对所有内容的只读权限?