Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Azure Shared Image Gallery Sampler (AzSharedImageGallerySampler)

Overview

This repo contains steps and some simple scripts to get you through an "end to end" deployment of an Azure Shared Image Gallery. Steps are also included to deploy an image from the SIG with both PowerShell and an ARM template. The entire scripted process, from bare metal, takes about 35 minutes - hopefully saving you some time!

Process Summary

  • Use PowerShell to create a new VM
  • Create a standard image from that VM
  • Deploy Shared Image Gallery (SIG)
  • Upload standard image to Gallery
  • Test deployment of Gallery image using PowerShell and ARM Template

Detailed Steps

  1. Login to Azure

  2. Update environment details and execute DeployVMForImaging.ps1. This script creates a simple VM with a new RG, vnet, nic, and nsg, which you will ultimately use to create your first standard VM image (i.e. a non-SIG image). You need a standard VM image already created, to upload to a Shared Image Gallery (SIG).

    This image needs to be in the same region as the SIG!

  3. Login to the newly created VM and execute sysprep from %windir%\system32\sysprep

    This link was very helpful:
    https://docs.microsoft.com/en-us/azure/virtual-machines/windows/capture-image-resource

  4. Select these options:

    • System Cleanup Action: Enter System Out-of-Box Experience (OOBE)
    • Generalize: CHECKED!
    • Shutdown Options: Shutdown
  5. Click OK, give the VM time to shutdown

    VM will still show as running in the portal!

  6. Update environment details and execute CaptureVMImage.ps1. Now are you ready to deploy a SIG!

  7. Validate your new image looks good in the portal.

  8. Update environment details and execute (step by step!) DeploySharedImageGallery.ps1

    Note, this script uses a slightly different RG name. In addition here's some helpful guidance on ultimately naming your gallery from: https://docs.microsoft.com/en-us/azure/virtual-machines/windows/cli-ps-findimage

    • Publisher: The organization that created the image. Examples: Canonical, MicrosoftWindowsServer
    • Offer: The name of a group of related images created by a publisher. Examples: UbuntuServer, WindowsServer
    • SKU: An instance of an offer, such as a major release of a distribution. Examples: 18.04-LTS, 2019-Datacenter
    • Version: The version number of an image SKU.
  9. Test deployment of a VM from the SIG with PowerShell. Update environment details and execute DeployVMFromSIG.ps1

    You will need to update $imageVersionId from your environment! It will look something like this:
    /subscriptions/3ba3ebad-7974-4e80-XXXXXXXXX/resourceGroups/acme-dev-eus-sig-rg/providers/Microsoft.Compute/galleries/acmedevsig/images/windows-server-2019-base/versions/1.0.0

    ProTip #56: The VM deployment RG names contain "sigt" - different from the Gallery RG. "t" is for VM deployment "testing". VM deployment RG names also include an instance number i.e. "02" or "03". If you are testing your own variation of these scripts and templates, change the instance number and deploy a whole new RG every deployment test. It's faster to deploy new, than delete and recreate. Once you are done testing, clean up all the old RGs at once with NukeFromOrbit.ps1.

  10. Test deployment of a VM from the SIG with ARM Template. Update environment details in azuredeploy.parameters.json and DeployVMFromSIGWithTemplate.ps1 then execute DeployVMFromSIGWithTemplate.ps1

    You will need to update ImageReferenceId in azuredeploy.parameters.json!

    Be sure to change into the DeployVMFromSIGWithTemplate directory before running the script!

Tips and Tricks

  • Deploying from an SIG requires a newer api version in your own custom ARM templates. If you run into the error below update the compute api version.

    This worked:

    "type": "Microsoft.Compute/virtualMachines",
    "name": "[variables('vmName')]",
    "apiVersion": "2018-04-01",

    This failed:

    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2016-04-30-preview",
    "name": "[variables('vmName')]",

    Sample error:

    PS C:\GitRepos\Sandbox\ImageGalleryTesting\Multi-Disk-Deploy>New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "azuredeploy_workingwithid_ps.json"-TemplateParameterFile "azuredeploy.parametrers.json"New-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidTemplateDeployment; Message=The template deployment 'azuredeploy' is not valid according to the validation
    procedure. The tracking id is 'ef6f1cf2-5ba0-442d-a16a-d2f5eb804e34'. See inner errors for details.
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdletNew-AzResourceGroupDeployment : 9:55:27 AM - Error: Code=InvalidParameter; Message=Resource 'MyWindowsVM' has invalid parameters. Details: The value of parameter imageReference.id isinvalid.At line:1 char:1+ New-AzResourceGroupDeployment -ResourceGroupName $RG -TemplateFile "a ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
    New-AzResourceGroupDeployment : The deployment validation failed
    At line:1 char:1+New-AzResourceGroupDeployment-ResourceGroupName $RG-TemplateFile "a ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException + FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet

Known Issues and Update Ideas...

  • It would be nice to be able to execute Sysprep via the Azure Script Extension
  • Create new script to script to add additional regions

Next Steps

  • Add an additional replica in a new region for your image version. Deploy a VM to that region.

About

Azure Shared Image Gallery Sampler

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages