Forum Discussion

GouravIN's avatar
GouravIN
Brass Contributor
Jul 14, 2022

Partial script not running while deployment

Hi All,

 

I am deploying a windows VM in Azure using terraform and want to install some software while deployment so I thought about PS script extension.

 

Things are working fine for me however ENV variables is not getting added though If I will run this script in the system after deployment then everything is right.

 

Can anyone suggest me why only ENV variable is not getting set.

 

you can read the script here,

https://raw.githubusercontent.com/INGourav/Azure-Resources/master/azbastionsetup01.ps1

 

<#
Script to install chocolatey on the windows system and install some apps that is needed for Azure
Author : - Gourav Kumar
Reach Me : - email address removed for privacy reasons
Version : - 1.0.1
#>

     Set-ExecutionPolicy Bypass -Scope Process -Force;
     New-Item -Path 'C:\Temp\terraform_1.2.4_windows_amd64' -ItemType Directory

   # setting env vars

     $path = (Get-Item -Path Env:\Path).Value
     Start-Sleep -Seconds 5;
     $newpath = $path + 'C:\Temp\terraform_1.2.4_windows_amd64'
     Start-Sleep -Seconds 5;
     Set-Item -Path Env:\Path -Value $newpath
    
    # Installation of Terraform on the machine

    Invoke-WebRequest 'https://releases.hashicorp.com/terraform/1.2.4/terraform_1.2.4_windows_amd64.zip' -OutFile C:\temp\terraform_1.2.4_windows_amd64.zip -Verbose
    Start-Sleep -Seconds 5;
    Expand-Archive C:\temp\terraform_1.2.4_windows_amd64.zip C:\temp\terraform_1.2.4_windows_amd64 -Verbose -Force
    Start-Sleep -Seconds 5;
    
    [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
    Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) -Verbose
    Start-Sleep -Seconds 5;

    # Installation of apps (Pycharm, vscode, git, and drwaio)

    choco install pycharm -y --force;
    Start-Sleep -Seconds 5;
    choco install vscode -y --force;
    Start-Sleep -Seconds 5;
    choco install git -y --force;
    Start-Sleep -Seconds 5;
    choco install drawio -y --force;
    Start-Sleep -Seconds 5;
   

 

 

 

The code that I am using to deploy resources is as follows,

 

 

 

provider "azurerm" {
  features {}
}

data "azurerm_subnet" "vmsnet" {
  name                 = "vm_subnet"
  virtual_network_name = "az_test"
  resource_group_name  = "poc"
}



resource "azurerm_resource_group" "vmrg" {
  name     = "tfvmtestrg"
  location = "uk south"
}



resource "azurerm_network_interface" "az_vm_nic" {
  location            = "uk south"
  name                = "tfvmtestnic"
  resource_group_name = azurerm_resource_group.vmrg.name
  ip_configuration {
    name                          = "internal"
    private_ip_address_allocation = "Dynamic"
    subnet_id                     = data.azurerm_subnet.vmsnet.id
  }
}



resource "azurerm_windows_virtual_machine" "az_vm_win" {
  admin_password        = "tfvmtestrgrtetghcgh"
  admin_username        = "tfvmtestrg"
  location              = "uk south"
  name                  = "tfvmtestvm"
  network_interface_ids = [azurerm_network_interface.az_vm_nic.id]
  resource_group_name   = azurerm_resource_group.vmrg.name
  size                  = "Standard_D2s_v3"
  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2022-Datacenter"
    version   = "latest"
  }
}



resource "azurerm_virtual_machine_extension" "vmext" {
  name                 = azurerm_windows_virtual_machine.az_vm_win.name
  virtual_machine_id   = azurerm_windows_virtual_machine.az_vm_win.id
  publisher            = "Microsoft.Compute"
  type                 = "CustomScriptExtension"
  type_handler_version = "1.10"

  ### THIS PART IS ALL NEEDED, INCLUDING THE WEIRD SETTINGS BIT.  
  settings = <<SETTINGS
      {
          "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File azbastionsetup01.ps1",
          "fileUris": ["https://raw.githubusercontent.com/INGourav/Azure-Resources/master/azbastionsetup01.ps1"]
      }
  SETTINGS

}

 

 

 

 

1 Reply

  • Seems environment variable not persisting because the Custom Script Extension runs in a transient process context. When you use Set-Item Env:\Path, it only updates the environment for that running PowerShell session. Once the extension finish, the VM boots into a fresh session and the change is gone. To make PATH (or any env var) stick across reboots and be visible to all processes, you may require to write it to the machine-level environment registry or use [System.Environment]::SetEnvironmentVariable() with the right scope.

Resources