为什么terraform无法在以下简单场景中正确计算局部变量?

为什么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:

给出了以下配置(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:\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>