无法在Azure Devops中为Terraform管道利用变量

db2dz4w8  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(106)

当尝试在Azure Devops中为Terraform管道利用变量时,会出现令人挠头的错误。

Error: Reference to undeclared input variable
│ 
│   on compute.tf line 760, in module "vm_prd_test":
│  760:   sas_token = var.sas_token
│ 
│ An input variable with the name "sas_token" has not been declared. This
│ variable can be declared with a variable "sas_token" {} block.
╵

我在terraform中使用自定义脚本扩展来传递密钥和脚本,以便在创建时引导虚拟机,如下所示:

resource "azurerm_virtual_machine_extension" "vm-linux-extension" {
  count                = var.enable_vm_extension ? length(var.hostnames) : 0
  name                 = "${local.hostnames[count.index]}-extension"
  virtual_machine_id   = azurerm_virtual_machine.vm-linux[count.index].id
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"
  
  settings = <<SETTINGS
    {
        "fileUris": ["<link to script>", "<link to key appended with sas token>?${var.sas_token}"],
        "commandToExecute": "chmod +x bootstrap.sh && sudo ${var.script_command}"
    }
SETTINGS
}

这个想法是通过一个链接到我们的存储帐户内的脚本和密钥。
我还将SAS令牌的变量添加到variables.tf

variable "sas_token" {
  description = "The SAS token for the blob storage"
  type        = string
}

我在Azure DevOps库变量组中拥有SAS令牌,并具有对相关管道的权限

我还在管道中直接引用了变量组

- group: SAS_TOKEN_GROUP

并再次作为环境变量引用,可以在应用阶段由terraform解析:

- task: Bash@3
              displayName: 'Terraform Apply'
              env:
                TF_VAR_sas_token: $(SAS_TOKEN)
                ARM_CLIENT_ID: $(AZURE_CLIENT_ID)
                ARM_CLIENT_SECRET: $(AZURE_CLIENT_SECRET)
                ARM_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID)
                ARM_TENANT_ID: $(AZURE_TENANT_ID)
                BUILD_BUILDNUMBER: $(Build.BuildNumber)

我觉得我在引用这个变量时已经覆盖了所有的基础,这样它就可以安全地存储并附加到链接中,以便为引导过程下载pem密钥,但我无法克服这个错误。
知道我错过了什么吗

yvt65v4c

yvt65v4c1#

这个错误本质上意味着在模块"vm_prd_test"中,Terraform无法找到变量sas_token

部分由您完成:

1.在variables.tf中声明了sas_token变量。
1.您已经使用环境变量TF_VAR_sas_token设置了Azure DevOps管道,该环境变量应将SAS_TOKEN的值传递给Terraform。
1.您正在azurerm_virtual_machine_extension资源内部使用sas_token变量,该资源似乎在"vm_prd_test"模块外部。

主要问题:

    • 模块声明**:如果sas_token在模块中使用(如"vm_prd_test"的错误所示),则需要确保在调用模块时将变量传递给它。

我试图理解你的要求,并试图使这个演示版本。

我的文件结构:

├── main.tf
├── variables.tf
└── modules
    └── vm_prd_test
        ├── main.tf
        └── variables.tf

www.example.com:

provider "azurerm" {
  features {}
}

resource "azurerm_virtual_machine_extension" "vm-linux-extension" {
  count                = var.enable_vm_extension ? length(var.hostnames) : 0
  name                 = "${local.hostnames[count.index]}-extension"
  virtual_machine_id   = azurerm_virtual_machine.vm-linux[count.index].id
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"
  
  settings = <<SETTINGS
    {
        "fileUris": ["<link to script>", "<link to key appended with sas token>?${var.sas_token}"],
        "commandToExecute": "chmod +x bootstrap.sh && sudo ${var.script_command}"
    }
SETTINGS
}

module "vm_prd_test" {
  source    = "./modules/vm_prd_test"
  sas_token = var.sas_token
}

www.example.com:

variable "sas_token" {
  description = "The SAS token for the blob storage"
  type        = string
}
    • modules/blob_module/www.example.com**:
resource "azurerm_virtual_machine" "vm_prd_test" {
  name                  = "myVM"
  location              = "East US"
  resource_group_name   = "some-resource-group"
  vm_size               = "Standard_DS1_v2"

  storage_os_disk {
    name          = "myOsDisk"
    caching       = "ReadWrite"
    create_option = "FromImage"
    managed_disk_type = "Premium_LRS"
  }

  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }

  os_profile {
    computer_name  = "hostname"
    admin_username = "admin"
    admin_password = "Password1234!"
  }

  os_profile_linux_config {
    disable_password_authentication = false
  }

  network_interface_ids = ["some_network_interface_id"]

  tags = {
    environment = "production"
  }

  provisioner "local-exec" {
    command = "echo ${var.sas_token}"
  }
}
    • modules/blob_module/www.example.com**:
variable "sas_token" {
  description = "The SAS token for the blob storage"
  type        = string
}

variable "account_name" {
  description = "The name of the storage account."
  type        = string
}

variable "resource_group_name" {
  description = "The name of the resource group in which to create the storage account."
  type        = string
}

现在,确保您检查了代码要遵循的步骤,以提供需求。

    • export TF_VAR_sas_token ="your_sas_token_value"**

这将导出SAS令牌,该令牌将在执行期间在代码中进一步使用。
然后遵循下面提到的命令。

    • terraform init**
    • 应用terraform**

相关问题