当尝试在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密钥,但我无法克服这个错误。
知道我错过了什么吗
1条答案
按热度按时间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"
的错误所示),则需要确保在调用模块时将变量传递给它。我试图理解你的要求,并试图使这个演示版本。
我的文件结构:
www.example.com:
www.example.com:
现在,确保您检查了代码要遵循的步骤,以提供需求。
这将导出SAS令牌,该令牌将在执行期间在代码中进一步使用。
然后遵循下面提到的命令。