为什么terraform无法在以下简单场景中正确计算局部变量?
给出了以下配置(main.tf): 而且似乎效果不错:为什么terraform无法在以下简单场景中正确计算局部变量?,terraform,Terraform,给出了以下配置(main.tf): 而且似乎效果不错: C:\work\test> dir Directory: C:\work\test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 4/15/2020 11:47 PM 280 main.tf C:
C:\work\test> dir
Directory: C:\work\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 4/15/2020 11:47 PM 280 main.tf
C:\work\test> terraform init
Initializing the backend...
Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "local" (hashicorp/local) 1.4.0...
...
C:\work\test> terraform apply -auto-approve
local_file.instance["b"]: Creating...
local_file.instance["a"]: Creating...
local_file.instance["a"]: Creation complete after 0s [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["b"]: Creation complete after 0s [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
primary_filename = ./a.txt
C:\work\test>
现在我删除文件a.txt
,然后重新运行:
C:\work\test> del .\a.txt
C:\work\test> terraform apply -auto-approve
local_file.instance["a"]: Refreshing state... [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["b"]: Refreshing state... [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]
Error: Invalid index
on main.tf line 13, in output "primary_filename":
13: value = local_file.instance["a"].filename
|----------------
| local_file.instance is object with 1 attribute "b"
The given key does not identify an element in this collection value.
可通过使用try
功能修复:
value = try(local_file.instance["a"].filename, "")
这让它起作用了:
C:\work\test> terraform apply -auto-approve
local_file.instance["b"]: Refreshing state... [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]
local_file.instance["a"]: Refreshing state... [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["a"]: Creating...
local_file.instance["a"]: Creation complete after 0s [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
primary_filename = ./a.txt
C:\work\test>
现在我知道我们不应该删除terraform之外的资源,但是事情发生了,我希望terraform能够优雅地处理它。确实如此,除了这个局部变量的行为
我不喜欢使用try
函数,因为它会隐藏真正的问题。理想情况下,在计划阶段,它的行为应该类似于try
,而在应用阶段,它的行为不应该类似于try
无论如何,我有一种感觉,我在这里遗漏了一些重要的东西,比如我没有正确使用局部变量或者其他一些东西。那么,我遗漏了什么呢?这有点难以理解。你能试着制作一个能运行它的程序吗?看起来你根本不需要Azure提供商,应该能够使用变量和局部变量生成一个非常简单的示例,人们可以轻松运行它来查看如何解决你的错误。是的,我知道我很懒。我会尽量减少复制,但如果没有实际的云资源,我不知道如何才能做到这一点。当TF管理的云资源在TF之外被销毁时,就会出现问题。我如何在没有云的情况下模拟它?我已经用一个不依赖于任何云的最小复制来完全修改了这个问题。这有点难以理解。你能试着制作一个能运行它的程序吗?看起来你根本不需要Azure提供商,应该能够使用变量和局部变量生成一个非常简单的示例,人们可以轻松运行它来查看如何解决你的错误。是的,我知道我很懒。我会尽量减少复制,但如果没有实际的云资源,我不知道如何才能做到这一点。当TF管理的云资源在TF之外被销毁时,就会出现问题。我如何在没有云的情况下模拟它?我已经用一个不依赖于任何云的最小复制来完全修改了这个问题。
C:\work\test> terraform apply -auto-approve
local_file.instance["b"]: Refreshing state... [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]
local_file.instance["a"]: Refreshing state... [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["a"]: Creating...
local_file.instance["a"]: Creation complete after 0s [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
primary_filename = ./a.txt
C:\work\test>