azurerm_virtual_machine 没有属性标识。0.principal_id

azurerm_virtual_machine does not have attribute identity.0.principal_id

tf 0.11.11 和 azurerm 0.31.0

我已经试了一段时间了,但我遗漏了一些东西。

我在没有 identity{} 块的情况下启动了一些 azurerm_virtual_machine 资源。 机器都起来了,想加一台:

./modules/linux/main.tf

resource "azurerm_virtual_machine" "instance" {
  count                 = "${length(compact(var.hosts))}"

  name                  = "${var.hosts[count.index]}"
  location              = "${data.azurerm_resource_group.instance.location}"
  resource_group_name   = "${data.azurerm_resource_group.instance.name}"

  identity {
    type  = "SystemAssigned"
  }
}

output "system_assigned_identity_principal_ids" {
  value       = "${azurerm_virtual_machine.instance.*.identity.0.principal_id}"
  depends_on  = [ "azurerm_virtual_machine.instance" ]
}

./main.tf

module "linuxvm" {
  source = "./modules/linux"

  hosts = [ "${var.hostnames}" ]
  resource_group_name = "${module.sample_resource_group.name}"
  resource_tags = "${var.resource_tags}"
}

在 terraform 计划期间,我收到此错误: 错误:错误 运行 计划:发生 1 个错误:

* module.linuxvm.output.system_assigned_identity_principal_ids: Resource
'azurerm_virtual_machine.instance' does not have attribute 
'identity.0.principal_id' for variable 
'azurerm_virtual_machine.instance.*.identity.0.principal_id'

在状态文件中,没有其他身份属性(这是预期的)。虚拟机最初是在没有标识块的情况下创建的。

[user@host test]$ terraform show | grep iden
  identity.# = 0
  identity.# = 0
  identity.# = 0

如果我从头开始创建虚拟机,我根本看不到这个问题 如果我注释掉输出块,terraform 计划就会通过。 我 运行 目前没有要尝试的东西。

编辑: 我还有一个观察。如果我将输出更改为:

azurerm_virtual_machine.instance.*.identity.0.principal_id

至:

azurerm_virtual_machine.instance.0.identity.0.principal_id

terraform 计划通过。我有 3 个主机,0-2 个通过,但使用 splat 不会。

实际上,当您通过启用身份的Terraform 创建虚拟机时,您无法输出虚拟机的身份ID。 Terraform 仅导出 VM ID,因此您只需输出 VM ID。见 VM Attributes.

命令 terraform plan 只是检查你的 terraform 文件的语法。因此您无法通过 Terraform 输出 VM 身份 Id。但您可以使用 Azure CLI 或 Azure PowerShell 的帮助。例如,您可以像这样使用 Azure CLI 命令:

resource "null_resource" "output" {
    provisioner "local-exec" {
        command = "az vm show --ids  ${azurerm_virtual_machine.main.id} --query identity.principalId"
    }
}

然后输出如下:

希望对您有所帮助!

更新:

null_resource只能输出结果,不能将结果作为变量传递给其他资源。但是您可以使用 Terraform 数据源将脚本的结果作为变量传递给其他资源。这是示例:

script.sh

#!/bin/bash

eval "$(jq -r '@sh "ids=\(.ids)"')"
identity_id=$(az vm show --ids $ids --query identity.principalId -o tsv)
echo -e "{\"identity\":\"$identity_id\"}"

main.tf

data "azurerm_virtual_machine" "vm" {
    name = "vmName"
    resource_group_name = "groupName"
}

data "external" "exmaple" {
    program = ["bash", "script.sh"]

    query = {
        ids = "${data.azurerm_virtual_machine.vm.id}"
    }
}

output "identity_id" {
    value = "${data.external.exmaple.result}"
}