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}"
}
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}"
}