powershellpacker

Pass array of strings from PowerShell to Packer


There's a packer script called ubuntu2204.pkr.hcl in this repo

It accepts the following parameter:

variable "azure_tags" {
  type    = map(string)
  default = {}
}

I've been trying to call this from a PowerShell script as below:

$azureTags = @{
    BusinessUnit = "IDS"
    Environment  = "Production"
}

packer build    -var "capture_name_prefix=$ResourcesNamePrefix" `
                -var "client_id=$ClientId" `
                -var "client_secret=$ClientSecret" `
                -var "install_password=$InstallPassword" `
                -var "location=$Location" `
                -var "resource_group=$ResourceGroup" `
                -var "storage_account=$StorageAccount" `
                -var "subscription_id=$SubscriptionId" `
                -var "temp_resource_group_name=$TempResourceGroupName" `
                -var "tenant_id=$TenantId" `
                -var "virtual_network_name=$VirtualNetworkName" `
                -var "virtual_network_resource_group_name=$VirtualNetworkRG" `
                -var "virtual_network_subnet_name=$VirtualNetworkSubnet" `
                -var "run_validation_diskspace=$env:RUN_VALIDATION_FLAG" `
                -var "azure_tags=$($azureTags | ConvertTo-Json -Compress)" `
                -color=false `
                $TemplatePath

This is giving the following error:

Build ubuntu2204 VM Error: Variables not allowed on value for var.azure_tags from arguments line 1:

I'm new to packer, anyone see what I've got wrong?


Solution

  • I think that has something to do with the quotes of the serialized json. This worked for me with packer 1.9.2.

    Given this file file.pkr.hcl:

    variable "azure_tags" {
      type    = map(string)
      default = {}
    }
    
    $azureTags = @{
        BusinessUnit = "IDS"
        Environment  = "Production"
    }
    $tags=$($azureTags | ConvertTo-Json -Compress)
    packer console -var "azure_tags=$($tags -replace '([\\]*)"', '$1$1\"')" .\file.pkr.hcl
    > 
    > var.azure_tags
    {
        "BusinessUnit" = "IDS"
        "Environment" = "Production"
    }