【问题标题】:odd errors on terraform / azure "Missing required argument"terraform / azure 上的奇怪错误“缺少必需的参数”
【发布时间】:2021-04-24 05:18:16
【问题描述】:

我制作了一个非常简单的脚本来在 Azure 上的 windows VM 中运行命令。但我收到了这些错误:

错误:缺少必需的参数

在 .terraform\modules\run_command\main.tf 第 23 行,在资源中 “azurerm_virtual_machine_extension”“linux”:23:资源 “azurerm_virtual_machine_extension” “linux” {

参数“virtual_machine_id”是必需的,但没有定义 找到了。

错误:不支持的参数

在 .terraform\modules\run_command\main.tf 第 26 行,在资源中 “azurerm_virtual_machine_extension”“linux”:26:位置
= "${data.azurerm_resource_group.main.location}"

此处不应使用名为“位置”的参数。

错误:不支持的参数

在 .terraform\modules\run_command\main.tf 第 27 行,在资源中 “azurerm_virtual_machine_extension”“linux”:27:
资源组名称 = "${data.azurerm_resource_group.main.name}"

此处不应使用名为“resource_group_name”的参数。

错误:不支持的参数

在 .terraform\modules\run_command\main.tf 第 28 行,在资源中 “azurerm_virtual_machine_extension”“linux”:28:
virtual_machine_name = "${data.azurerm_virtual_machine.main.name}"

此处不应使用名为“virtual_machine_name”的参数。

错误:缺少必需的参数

在 .terraform\modules\run_command\main.tf 第 37 行,在资源中 “azurerm_virtual_machine_extension”“windows”:37:资源 “azurerm_virtual_machine_extension” “windows” {

参数“virtual_machine_id”是必需的,但没有定义 找到了。

错误:不支持的参数

在 .terraform\modules\run_command\main.tf 第 40 行,在资源中 “azurerm_virtual_machine_extension”“windows”:40:位置
= "${data.azurerm_resource_group.main.location}"

此处不应使用名为“位置”的参数。

错误:不支持的参数

在 .terraform\modules\run_command\main.tf 第 41 行,在资源中 “azurerm_virtual_machine_extension” “windows”:41:
资源组名称 = "${data.azurerm_resource_group.main.name}"

此处不应使用名为“resource_group_name”的参数。

错误:不支持的参数

在 .terraform\modules\run_command\main.tf 第 42 行,在资源中 “azurerm_virtual_machine_extension” “windows”:42:
virtual_machine_name = "${data.azurerm_virtual_machine.main.name}"

但是,如果我删除“意外”参数,我会收到另一个错误,它丢失了!

有什么建议吗?非常感谢

provider "azurerm" {
  tenant_id       = "..."
  subscription_id = "..."
  features {}
}
# <https://registry.terraform.io/modules/innovationnorway/vm-run-command/azurerm/latest>
module "run_command" {
  source               = "innovationnorway/vm-run-command/azurerm"
  resource_group_name  = "dc-rg"
  virtual_machine_name = "AD1"
  os_type              = "windows"

  script = <<EOF
Install-Module -Name PSWindowsUpdate -Force -AllowClobber
Get-WUInstall -WindowsUpdate -AcceptAll -UpdateType Software -IgnoreReboot
Get-WUInstall -MicrosoftUpdate -AcceptAll -IgnoreUserInput -IgnoreReboot
EOF
}

提前谢谢你。非常感谢。

已编辑以包含我在存储库中找到的 run_command 的代码:

运行命令 main.tf:

locals {
  settings_windows = {
    script   = "${compact(concat(list(var.command), split("\n", var.script)))}"
    fileUris = "${var.file_uris}"
  }

  settings_linux = {
    commandToExecute = "${var.command}"
    fileUris         = "${var.file_uris}"
    script           = "${base64encode(var.script)}"
  }
}

data "azurerm_resource_group" "main" {
  name = "${var.resource_group_name}"
}

data "azurerm_virtual_machine" "main" {
  name                = "${var.virtual_machine_name}"
  resource_group_name = "${data.azurerm_resource_group.main.name}"
}

resource "azurerm_virtual_machine_extension" "linux" {
  count                      = "${lower(var.os_type) == "linux" ? 1 : 0}"
  name                       = "${var.virtual_machine_name}-run-command"
  location                   = "${data.azurerm_resource_group.main.location}"
  resource_group_name        = "${data.azurerm_resource_group.main.name}"
  virtual_machine_name       = "${data.azurerm_virtual_machine.main.name}"
  publisher                  = "Microsoft.CPlat.Core"
  type                       = "RunCommandLinux"
  type_handler_version       = "1.0"
  auto_upgrade_minor_version = true
  protected_settings         = "${jsonencode(local.settings_linux)}"
  tags                       = "${var.tags}"
}

resource "azurerm_virtual_machine_extension" "windows" {
  count                      = "${lower(var.os_type) == "windows" ? 1 : 0}"
  name                       = "${var.virtual_machine_name}-run-command"
  location                   = "${data.azurerm_resource_group.main.location}"
  resource_group_name        = "${data.azurerm_resource_group.main.name}"
  virtual_machine_name       = "${data.azurerm_virtual_machine.main.name}"
  publisher                  = "Microsoft.CPlat.Core"
  type                       = "RunCommandWindows"
  type_handler_version       = "1.1"
  auto_upgrade_minor_version = true
  settings                   = "${jsonencode(local.settings_windows)}"
  tags                       = "${var.tags}"
}

运行命令变量.tf:

variable "resource_group_name" {
  description = "The name of the resource group."
}

variable "virtual_machine_name" {
  description = "The name of the virtual machine."
}

variable "os_type" {
  description = "Specifies the operating system type."
}

variable "command" {
  default     = ""
  description = "Command to be executed."
}

variable "script" {
  default     = ""
  description = "Script to be executed."
}

variable "file_uris" {
  type        = "list"
  default     = []
  description = "List of files to be downloaded."
}

variable "timestamp" {
  default     = ""
  description = "An integer, intended to trigger re-execution of the script when changed."
}

variable "tags" {
  default     = {}
  description = "A mapping of tags to assign to the extension."
}

【问题讨论】:

  • 你能分享你的模块run_command的代码吗?
  • 完成。我在 repo 上找到了该模块。谢谢你,我要拔头发了!

标签: azure azure-devops terraform terraform-provider-azure


【解决方案1】:

在 Terraform 模板 azurerm_virtual_machine_extension 的参数参考中,参数 virtual_machine_name 已停用并已替换为 virtual_machine_id。如果您使用的是最新的 Terraform

Terraform v0.14.4
+ provider registry.terraform.io/hashicorp/azurerm v2.43.0

您可以在本地下载模块,然后手动修改相关代码,并在运行terraform init/plan/apply时将source更改为本地路径。

此外,我发现已弃用的interpolation 表达式仍在该模块中使用。 Terraform 0.11 及更早版本要求通过插值语法提供所有非常量表达式,但现在 Terraform 0.12 及更高版本已弃用此模式。

例如,我假设您复制了路径./modules/run_command 中的模块代码。然后根据需要修改相关代码。

在子模块run_command main.tf.

resource "azurerm_virtual_machine_extension" "windows" {
  count                      = lower(var.os_type) == "windows" ? 1 : 0
  name                       = "${var.virtual_machine_name}-run-command"
  
  virtual_machine_id         = data.azurerm_virtual_machine.main.id
  publisher                  = "Microsoft.CPlat.Core"
  type                       = "RunCommandWindows"
  type_handler_version       = "1.1"
  auto_upgrade_minor_version = true
  settings                   = jsonencode(local.settings_windows)
  tags                       = var.tags
}

在父模块main.tf.

module "run_command" {
  source               = "./modules/run_command"
  resource_group_name  = "dc-rg"
  virtual_machine_name = "AD1"
  os_type              = "windows"

  script = <<EOF
Install-Module -Name PSWindowsUpdate -Force -AllowClobber
Get-WUInstall -WindowsUpdate -AcceptAll -UpdateType Software -IgnoreReboot
Get-WUInstall -MicrosoftUpdate -AcceptAll -IgnoreUserInput -IgnoreReboot
EOF
}

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 2021-09-05
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多