如何在 Terraform 中管理本地生成的有状态文件
How to manage locally generated stateful files in Terraform
我有一个 Terraform (1.0+) 脚本,它根据一些输入从模板生成本地配置文件,例如:
locals {
config_tpl = templatefile("${path.module}/config.tpl", {
foo = "bar"
})
}
resource "local_file" "config" {
content = local._config_tpl
filename = "${path.module}/config.yaml"
}
此文件随后被 local-exec
块中的后续命令 运行 使用,该命令又 还 生成本地配置文件:
resource "null_resource" "my_command" {
provisioner "local-exec" {
when = create
command = "../scripts/my_command.sh"
working_dir = "${path.module}"
}
depends_on = [
local_file.config,
]
}
my_command.sh
生成当前没有可用的 Terraform 提供程序的基础架构。
所有生成的文件都应构成配置状态的一部分,因为稍后在升级期间需要它们并最终破坏环境。
我还想 运行 来自 CI/CD 管道的这些脚本,因此您自然会期望每个 运行 上的工作区都是干净的,这意味着生成的文件将获胜出席。
是否有管理此类文件的模式?不过,我最初的想法是创建云存储桶,将文件压缩并存储在那里,然后在需要时将它们拉回。然而,这感觉比已经发生的事情更肮脏,而且似乎有可能 运行 陷入依赖性问题。
或者,我是否遗漏了一些完全不同的东西来解决这样的问题?
您在这里遇到的问题是 the hashicorp/local
provider's documentation 中的警告所讨论的问题:
Terraform primarily deals with remote resources which are able to outlive a single Terraform run, and so local resources can sometimes violate its assumptions. The resources here are best used with care, since depending on local state can make it hard to apply the same Terraform configuration on many different local systems where the local resources may not be universally available. See specific notes in each resource for more information.
简短而不幸的答案是,您在这里尝试做的不是 Terraform 旨在解决的问题:它的目的是管理远程系统中的长期对象,而不是管理您所在的本地工作站上的工件是 运行 Terraform。
对于您的 config.yaml
文件,您可能会发现使用云存储对象资源类型 代替 local_file
的 是一个合适的替代方案,因此Terraform 只会将文件直接写入该远程存储,而根本不会影响本地系统。当terraform apply
完成后。
没有直接的途径可以将供应商的结果视为状态中的持久数据。如果您使用配置器,那么根据定义,它们始终是仅在创建资源期间执行的一次性操作。
我有一个 Terraform (1.0+) 脚本,它根据一些输入从模板生成本地配置文件,例如:
locals {
config_tpl = templatefile("${path.module}/config.tpl", {
foo = "bar"
})
}
resource "local_file" "config" {
content = local._config_tpl
filename = "${path.module}/config.yaml"
}
此文件随后被 local-exec
块中的后续命令 运行 使用,该命令又 还 生成本地配置文件:
resource "null_resource" "my_command" {
provisioner "local-exec" {
when = create
command = "../scripts/my_command.sh"
working_dir = "${path.module}"
}
depends_on = [
local_file.config,
]
}
my_command.sh
生成当前没有可用的 Terraform 提供程序的基础架构。
所有生成的文件都应构成配置状态的一部分,因为稍后在升级期间需要它们并最终破坏环境。
我还想 运行 来自 CI/CD 管道的这些脚本,因此您自然会期望每个 运行 上的工作区都是干净的,这意味着生成的文件将获胜出席。
是否有管理此类文件的模式?不过,我最初的想法是创建云存储桶,将文件压缩并存储在那里,然后在需要时将它们拉回。然而,这感觉比已经发生的事情更肮脏,而且似乎有可能 运行 陷入依赖性问题。
或者,我是否遗漏了一些完全不同的东西来解决这样的问题?
您在这里遇到的问题是 the hashicorp/local
provider's documentation 中的警告所讨论的问题:
Terraform primarily deals with remote resources which are able to outlive a single Terraform run, and so local resources can sometimes violate its assumptions. The resources here are best used with care, since depending on local state can make it hard to apply the same Terraform configuration on many different local systems where the local resources may not be universally available. See specific notes in each resource for more information.
简短而不幸的答案是,您在这里尝试做的不是 Terraform 旨在解决的问题:它的目的是管理远程系统中的长期对象,而不是管理您所在的本地工作站上的工件是 运行 Terraform。
对于您的 config.yaml
文件,您可能会发现使用云存储对象资源类型 代替 local_file
的 是一个合适的替代方案,因此Terraform 只会将文件直接写入该远程存储,而根本不会影响本地系统。当terraform apply
完成后。
没有直接的途径可以将供应商的结果视为状态中的持久数据。如果您使用配置器,那么根据定义,它们始终是仅在创建资源期间执行的一次性操作。