Azure Citadel
  • Blogs

  • ARM
  • Azure Arc
    • Overview
    • Azure Arc-enabled Servers
      • Prereqs
      • Scenario
      • Hack Overview
      • Azure Landing Zone
      • Arc Pilot resource group
      • Azure Monitoring Agent
      • Additional policy assignments
      • Access your on prem VMs
      • Create onboarding scripts
      • Onboarding using scripts
      • Inventory
      • Monitoring
      • SSH
      • Windows Admin Center
      • Governance
      • Custom Script Extension
      • Key Vault Extension
      • Managed Identity
    • Azure Arc-enabled Kubernetes
      • Prereqs
      • Background
      • Deploy Cluster
      • Connect to Arc
      • Enable GitOps
      • Deploy Application
      • Enable Azure AD
      • Enforce Policy
      • Enable Monitoring
      • Enable Azure Defender
      • Enable Data Services
      • Enable Application Delivery
    • Useful Links
  • Azure CLI
    • Install
    • Get started
    • JMESPATH queries
    • Integrate with Bash
  • Azure Landing Zones
    • Prereqs
    • Day 1
      • Azure Baristas
      • Day 1 Challenge
    • Day 2
      • Example
      • Day 2 Challenge
    • Day 3
      • Day 3 Challenge
    • Useful Links
  • Azure Lighthouse
    • Minimal Lighthouse definition
    • Using service principals
    • Privileged Identity Management
  • Azure Policy
    • Azure Policy Basics
      • Policy Basics in the Azure Portal
      • Creating Policy via the CLI
      • Deploy If Not Exists
      • Management Groups and Initiatives
    • Creating Custom Policies
      • Customer scenario
      • Policy Aliases
      • Determine the logic
      • Create the custom policy
      • Define, assign and test
  • Azure Stack HCI
    • Overview
    • Useful Links
    • Updates from Microsoft Ignite 2022
  • Marketplace
    • Introduction
      • Terminology
      • Offer Types
    • Partner Center
    • Offer Type
    • Publish a VM Offer HOL
      • Getting Started
      • Create VM Image
      • Test VM Image
      • VM Offer with SIG
      • VM Offer with SAS
      • Publish Offer
    • Other VM Resources
    • Publish a Solution Template HOL
      • Getting Started
      • Create ARM Template
      • Validate ARM Template
      • Create UI Definition
      • Package Assets
      • Publish Offer
    • Publish a Managed App HOL
      • Getting Started
      • Create ARM Template
      • Validate ARM Template
      • Create UI Definition
      • Package Assets
      • Publish Offer
    • Managed Apps with AKS HOL
    • Other Managed App Resources
    • SaaS Offer HOLs
    • SaaS Offer Video Series
      • Video 1 - SaaS Offer Overview
      • Video 2 - Purchasing a SaaS Offer
      • Video 3 - Purchasing a Private SaaS Plan
      • Video 4 - Publishing a SaaS Offer
      • Video 5 - Publishing a Private SaaS Plan
      • Video 6 - SaaS Offer Technical Overview
      • Video 7 - Azure AD Application Registrations
      • Video 8 - Using the SaaS Offer REST Fulfillment API
      • Video 9 - The SaaS Client Library for .NET
      • Video 10 - Building a Simple SaaS Landing Page in .NET
      • Video 11 - Building a Simple SaaS Publisher Portal in .NET
      • Video 12 - SaaS Webhook Overview
      • Video 13 - Implementing a Simple SaaS Webhook in .NET
      • Video 14 - Securing a Simple SaaS Webhook in .NET
      • Video 15 - SaaS Metered Billing Overview
      • Video 16 - The SaaS Metered Billing API with REST
  • Microsoft Fabric
    • Theory
    • Prereqs
    • Fabric Capacity
    • Set up a Remote State
    • Create a repo from a GitHub template
    • Configure an app reg for development
    • Initial Terraform workflow
    • Expanding your config
    • Configure a workload identity
    • GitHub Actions for Microsoft Fabric
    • GitLab pipeline for Microsoft Fabric
  • Packer & Ansible
    • Packer
    • Ansible
    • Dynamic Inventories
    • Playbooks & Roles
    • Custom Roles
    • Shared Image Gallery
  • Partner Admin Link
    • Understanding PAL
    • User IDs & PAL
    • Service principals & PAL
    • CI/CD pipelines & PAL
    • Creating a dedicated PAL service principal
    • Azure Lighthouse & PAL
    • PAL FAQ
  • REST API
    • REST API theory
    • Using az rest
  • Setup
  • Terraform
    • Fundamentals
      • Initialise
      • Format
      • Validate
      • Plan
      • Apply
      • Adding resources
      • Locals and outputs
      • Managing state
      • Importing resources
      • Destroy
    • Working Environments for Terraform
      • Cloud Shell
      • macOS
      • Windows with PowerShell
      • Windows with Ubuntu in WSL2
    • Using AzAPI
      • Using the REST API
      • azapi_resource
      • Removing azapi_resource
      • azapi_update_resource
      • Data sources and outputs
      • Removing azapi_update_resource
  • Virtual Machines
    • Azure Bastion with native tools & AAD
    • Managed Identities

  • About
  • Archive
  1. Home
  2. Azure Arc
  3. Azure Arc-enabled Servers
  4. Proctor guides
  5. Custom Script Extension

Table of Contents

  • Portal
  • Questions
  • Automated
    • Azure CLI
    • PowerShell
    • ARM

Custom Script Extension

The custom script extension opens up opportunities to automate PowerShell and Bash scripts at scale for both cloud and on prem servers.

Table of Contents

  • Portal
  • Questions
  • Automated
    • Azure CLI
    • PowerShell
    • ARM

Portal

The portal submission is pretty simple.

Questions

  • Where can you see the version of the extension?

    Portal’s extension blade.

  • Where is the installation logging?

    %ProgramData%\GuestConfig\ext_mgr_logs
    

    where %ProgramData% is usually C:\ProgramData.

  • Where would you check for script output and errors?

    %ProgramData%\GuestConfig\extension_logs\Microsoft.Compute.CustomScriptExtension\
    
  • Where was the script downloaded to?

    C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\Downloads\0\
    

    CustomScriptExtension version number will change in the future, of course.

  • Where would you check the status?

    C:\Packages\Plugins\Microsoft.Compute.CustomScriptExtension\1.10.12\status
    

Answers are pulled from the Troubleshooting page.

Also useful:

az connectedmachine extension show --name CustomScriptExtension --machine-name "win-02" --resource-group "arc_pilot"

Automated

⚠️ The Set-AzVMCustomScriptExtension from the main page will fail.

Use the pages in the Azure Arc area instead.

Azure CLI

scriptUri="https://arcpilotsadfc4852d.blob.core.windows.net/powershell/custom_script_windows.ps1"
command="powershell -ExecutionPolicy Unrestricted -File custom_script_windows.ps1"
az connectedmachine extension create --machine-name "win-02" --name "CustomScriptExtension" --type "CustomScriptExtension" --publisher "Microsoft.Compute" --protected-settings "{\"commandToExecute\": \"$command\", \"fileUris\": [\"$scriptUri\"]}" --type-handler-version "1.10" --resource-group "arc_pilot" --location "uksouth"

PowerShell

$protectedSetting = @{
  commandToExecute = "powershell -ExecutionPolicy Unrestricted -File custom_script_windows.ps1"
  fileUris = @("https://arcpilotsadfc4852d.blob.core.windows.net/powershell/custom_script_windows.ps1")
  }
New-AzConnectedMachineExtension -MachineName "win-03" -Name CustomScriptExtension -ExtensionType "CustomScriptExtension" -Publisher "Microsoft.Compute" -Settings @{} -ProtectedSetting $protectedSetting -ResourceGroupName "arc_pilot" -Location "uksouth"

ARM

custom_script_windows.json:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "vmName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "[concat(parameters('vmName'),'/CustomScriptExtension')]",
      "type": "Microsoft.HybridCompute/machines/extensions",
      "location": "uksouth",
      "apiVersion": "2019-08-02-preview",
      "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "autoUpgradeMinorVersion": true,
        "settings": {},
        "protectedSettings": {
          "fileUris": [
            "https://arcpilotsadfc4852d.blob.core.windows.net/powershell/custom_script_windows.ps1"
          ],
          "commandToExecute": "powershell -ExecutionPolicy Unrestricted -File custom_script_windows.ps1"
        }
      }
    }
  ]
}

Command:

az deployment group create --template-file custom_script_windows.json --parameters vmName=win-01 --resource-group arc_pilot

You could further parameterise, e.g. add a parameter for the basename of the script URI.

Source: https://www.azurecitadel.com/arc/servers/script/proctor/
Printed:
Governance Custom Script Extension Key Vault Extension