From a793bf43a43ef8365ff8fde3b6573e317549b876 Mon Sep 17 00:00:00 2001 From: Sinisa Sokolic Date: Mon, 28 Oct 2024 21:33:10 +0100 Subject: [PATCH] fix: multiple fixes to different files --- .../storage/az-cli-delete-storage-account.ps1 | 5 - azure-cli/vms/az-cli-create-image-gallery.ps1 | 30 --- azure-cli/vms/az-cli-create-image-version.ps1 | 46 +--- azure-cli/vms/az-cli-create-vm-scale-set.ps1 | 52 +--- .../az-cli-delete-image-builder-windows.ps1 | 46 +--- .../az-cli-enable-EntraID-login-linux-vm.ps1 | 46 +--- azure-cli/vms/az-cli-install-webserver-vm.ps1 | 46 +--- azure-cli/vms/az-cli-share-image-gallery.ps1 | 30 +-- .../wip_az-cli-create-image-builder-linux.ps1 | 31 +-- ...ip_az-cli-create-image-builder-windows.ps1 | 52 +--- azure-cli/vms/wip_az-cli-create-linux-vm.ps1 | 52 +--- .../vms/wip_az-cli-create-specialized-vm.ps1 | 46 +--- .../wip_az-cli-delete-image-builder-linux.ps1 | 64 +---- azure-cli/xoap/az-cli-register-node.ps1 | 25 +- azure-ps/avd/stack/New-AzKeyVault.ps1 | 6 +- azure-ps/avd/stack/New-AzResourceGroup.ps1 | 7 +- azure-ps/avd/stack/New-AzStorageAccount.ps1 | 21 +- azure-ps/avd/stack/New-AzVirtualNetwork.ps1 | 6 +- azure-ps/avd/stack/New-AzWvdApplication.ps1 | 10 +- .../avd/stack/New-AzWvdApplicationGroup.ps1 | 8 +- azure-ps/avd/stack/New-AzWvdHostPool.ps1 | 22 +- .../avd/stack/New-AzWvdRegistrationInfo.ps1 | 4 +- azure-ps/avd/stack/New-AzWvdWorkspace.ps1 | 3 +- .../stack/Register-AzWvdApplicationGroup.ps1 | 4 +- azure-ps/avd/stack/Remove-AzResourceGroup.ps1 | 1 - .../avd/stack/_todo/Stop-VmsBasedOnTag.ps1 | 232 ++++++++++++++++++ 26 files changed, 307 insertions(+), 588 deletions(-) create mode 100644 azure-ps/avd/stack/_todo/Stop-VmsBasedOnTag.ps1 diff --git a/azure-cli/storage/az-cli-delete-storage-account.ps1 b/azure-cli/storage/az-cli-delete-storage-account.ps1 index ac0c74f..bdfedd2 100644 --- a/azure-cli/storage/az-cli-delete-storage-account.ps1 +++ b/azure-cli/storage/az-cli-delete-storage-account.ps1 @@ -7,9 +7,6 @@ The script uses the following Azure CLI command: az storage account delete --name $StorageAccountName --resource-group $ResourceGroup - - - .PARAMETER Name Defines the name of the Azure Storage Account. @@ -19,8 +16,6 @@ .PARAMETER AccessTier Defines the access tier of the Azure Storage Account. - - .EXAMPLE .\az-cli-create-storage-account.ps1 -AzStorageAccountName "MyStorageAccount" -AzResourceGroup "MyResourceGroup" -AzLocation "eastus" -AzStorageSku "Standard_LRS" diff --git a/azure-cli/vms/az-cli-create-image-gallery.ps1 b/azure-cli/vms/az-cli-create-image-gallery.ps1 index 05e035f..51151ed 100644 --- a/azure-cli/vms/az-cli-create-image-gallery.ps1 +++ b/azure-cli/vms/az-cli-create-image-gallery.ps1 @@ -17,39 +17,9 @@ .PARAMETER AzGalleryName Defines the name of the Azure Image Gallery. -.PARAMETER AzSubscription - Name or ID of subscription. - -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-create-image-gallery.ps1 -AzResourceGroup "MyResourceGroup" -AzLocation "eastus" -AzGalleryName "MyImageGallery" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/sig #> diff --git a/azure-cli/vms/az-cli-create-image-version.ps1 b/azure-cli/vms/az-cli-create-image-version.ps1 index f172d73..c88daae 100644 --- a/azure-cli/vms/az-cli-create-image-version.ps1 +++ b/azure-cli/vms/az-cli-create-image-version.ps1 @@ -46,36 +46,9 @@ .PARAMETER AzTags Defines the tags for the image version. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-create-image-version.ps1 -AzResourceGroup "MyResourceGroup" -AzGallery "MyGallery" -AzImageDefinition "MyImageDefinition" -AzGalleryImageVersion "1.0.0" -AzTargetRegions "westus" -AzReplicaCount 1 -AzSubscriptionId "00000000-0000-0000-0000-000000000000" -AzVmName "MyVm" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/sig/image-version #> @@ -127,24 +100,7 @@ param( [string]$AzStorageAccountType = "Standard_LRS", [Parameter(Mandatory=$false)] - [hashtable]$AzTags, - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [hashtable]$AzTags ) # Splatting parameters for better readability diff --git a/azure-cli/vms/az-cli-create-vm-scale-set.ps1 b/azure-cli/vms/az-cli-create-vm-scale-set.ps1 index e47cfc0..ee12aec 100644 --- a/azure-cli/vms/az-cli-create-vm-scale-set.ps1 +++ b/azure-cli/vms/az-cli-create-vm-scale-set.ps1 @@ -26,39 +26,9 @@ .PARAMETER AzAdminUserName Defines the admin username of the Azure Scale Set. -.PARAMETER AzSubscription - Name or ID of subscription. - -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-create-vm-scale-set.ps1 -AzResourceGroup "MyResourceGroup" -AzScaleSetName "MyScaleSet" -AzOrchestrationMode "Flexible" -AzSkuImage "UbuntuLTS" -AzScaleSetInstanceCount 2 -AzAdminUserName "azureuser" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vmss #> @@ -87,27 +57,7 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzAdminUserName = 'azureuser', - - [Parameter(Mandatory=$false)] - [string]$AzSubscription, - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzAdminUserName = 'azureuser' ) # Splatting parameters for better readability diff --git a/azure-cli/vms/az-cli-delete-image-builder-windows.ps1 b/azure-cli/vms/az-cli-delete-image-builder-windows.ps1 index 9813c15..0a23571 100644 --- a/azure-cli/vms/az-cli-delete-image-builder-windows.ps1 +++ b/azure-cli/vms/az-cli-delete-image-builder-windows.ps1 @@ -30,36 +30,9 @@ .PARAMETER AzResourceId Defines the ID of the Azure Resource. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-delete-image-builder-windows.ps1 -AzResourceGroup "MyResourceGroup" -AzImageBuildName "MyImageBuild" -AzAssignee "MyAssignee" -AzRoleDefinitionName "MyRoleDefinition" -AzSubscriptionID "00000000-0000-0000-0000-000000000000" -AzResourceId "00000000-0000-0000-0000-000000000000" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -88,24 +61,7 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzResourceId = "00000000-0000-0000-0000-000000000000", - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzResourceId = "00000000-0000-0000-0000-000000000000" ) # Splatting parameters for better readability diff --git a/azure-cli/vms/az-cli-enable-EntraID-login-linux-vm.ps1 b/azure-cli/vms/az-cli-enable-EntraID-login-linux-vm.ps1 index e905241..5392533 100644 --- a/azure-cli/vms/az-cli-enable-EntraID-login-linux-vm.ps1 +++ b/azure-cli/vms/az-cli-enable-EntraID-login-linux-vm.ps1 @@ -20,36 +20,9 @@ .PARAMETER AzVmName Defines the name of the Azure Virtual Machine. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-enable-EntraID-login-linux-vm.ps1 -AzResourceGroup "MyResourceGroup" -AzExtensionName "Microsoft.Azure.ActiveDirectory" -AzVmName "MyVmName" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -66,24 +39,7 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzVmName = "myVmName", - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzVmName = "myVmName" ) # Splatting parameters for better readability diff --git a/azure-cli/vms/az-cli-install-webserver-vm.ps1 b/azure-cli/vms/az-cli-install-webserver-vm.ps1 index be249f7..cb94ad3 100644 --- a/azure-cli/vms/az-cli-install-webserver-vm.ps1 +++ b/azure-cli/vms/az-cli-install-webserver-vm.ps1 @@ -29,36 +29,9 @@ .PARAMETER AzOpenPorts Defines the ports to open on the Azure Virtual Machine. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-install-webserver-vm.ps1 -AzResourceGroup "MyResourceGroup" -AzVmName "MyVmName" -Script "Install-WindowsFeature -name Web-Server -IncludeManagementTools" -AzOpenPorts "80" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -79,24 +52,7 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzOpenPorts = '80', - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzOpenPorts = '80' ) # Splatting parameters for better readability diff --git a/azure-cli/vms/az-cli-share-image-gallery.ps1 b/azure-cli/vms/az-cli-share-image-gallery.ps1 index 71600fe..b8eb24f 100644 --- a/azure-cli/vms/az-cli-share-image-gallery.ps1 +++ b/azure-cli/vms/az-cli-share-image-gallery.ps1 @@ -49,12 +49,6 @@ .EXAMPLE .\az-cli-share-image-gallery.ps1 -AzResourceGroup "MyResourceGroup" -AzGalleryName "MyGallery" -EmailAddress "user@example.com" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -71,24 +65,7 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$EmailAddress = "hello@xoap.io", - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$EmailAddress = "hello@xoap.io" ) # Splatting parameters for better readability @@ -99,11 +76,6 @@ $parameters = @{ role = "Reader" assignee = $EmailAddress scope = "" - debug = $AzDebug - only_show_errors = $AzOnlyShowErrors - output = $AzOutput - query = $AzQuery - verbose = $AzVerbose } # Set Error Action to Stop diff --git a/azure-cli/vms/wip_az-cli-create-image-builder-linux.ps1 b/azure-cli/vms/wip_az-cli-create-image-builder-linux.ps1 index e3950a5..9b90846 100644 --- a/azure-cli/vms/wip_az-cli-create-image-builder-linux.ps1 +++ b/azure-cli/vms/wip_az-cli-create-image-builder-linux.ps1 @@ -14,36 +14,9 @@ .PARAMETER AzVmSize Defines the size of the Azure Virtual Machine. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\wip_az-cli-create-image-builder-linux.ps1 -AzResourceGroup "myResourceGroup" -AzOpenPorts "3389" -AzVmSize "Standard_A1_v2" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -75,9 +48,7 @@ param( [string]$AzQuery, [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [switch]$AzVerbose ) # Splatting parameters for better readability diff --git a/azure-cli/vms/wip_az-cli-create-image-builder-windows.ps1 b/azure-cli/vms/wip_az-cli-create-image-builder-windows.ps1 index ccf5e86..5809400 100644 --- a/azure-cli/vms/wip_az-cli-create-image-builder-windows.ps1 +++ b/azure-cli/vms/wip_az-cli-create-image-builder-windows.ps1 @@ -5,45 +5,18 @@ .DESCRIPTION This script creates an Azure Image Builder Windows VM. It registers necessary providers, creates a resource group, user-assigned identity, role definitions, and assigns roles. It also creates an image template and finally creates a VM from the image. -.PARAMETER AzResourceGroup +.PARAMETER ResourceGroup Defines the name of the Azure Resource Group. -.PARAMETER AzOpenPorts +.PARAMETER OpenPorts Defines the ports to open on the Azure Virtual Machine. -.PARAMETER AzVmSize +.PARAMETER VmSize Defines the size of the Azure Virtual Machine. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\wip_az-cli-create-image-builder-windows.ps1 -AzResourceGroup "myResourceGroup" -AzOpenPorts "3389" -AzVmSize "Standard_A1_v2" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -60,24 +33,7 @@ param( [Parameter(Mandatory=$true)] [ValidateSet('Standard_A0', 'Standard_A1', 'Standard_A2', 'Standard_A3', 'Standard_A4', 'Standard_A5', 'Standard_A6', 'Standard_A7', 'Standard_A8', 'Standard_A9', 'Standard_A10', 'Standard_A11', 'Standard_A1_v2', 'Standard_A2_v2', 'Standard_A4_v2', 'Standard_A8_v2', 'Standard_A2m_v2', 'Standard_A4m_v2', 'Standard_A8m_v2', 'Standard_B1s', 'Standard_B1ms', 'Standard_B2s', 'Standard_B2ms', 'Standard_B4ms', 'Standard_B8ms', 'Standard_B12ms', 'Standard_B16ms', 'Standard_B20ms', 'Standard_B24ms', 'Standard_B1ls', 'Standard_B1s', 'Standard_B2s', 'Standard_B4s', 'Standard_B8s', 'Standard_B12s', 'Standard_B16s', 'Standard_B20s', 'Standard_B24s', 'Standard_D1', 'Standard_D2', 'Standard_D3', 'Standard_D4', 'Standard_D11', 'Standard_D12', 'Standard_D13', 'Standard_D14', 'Standard_D1_v2', 'Standard_D2_v2', 'Standard_D3_v2', 'Standard_D4_v2', 'Standard_D5_v2', 'Standard_D11_v2', 'Standard_D12_v2', 'Standard_D13_v2', 'Standard_D14_v2', 'Standard_D15_v2', 'Standard_D2_v3', 'Standard_D4_v3', 'Standard_D8_v3', 'Standard_D16_v3', 'Standard_D32_v3', 'Standard_D48_v3', 'Standard_D64_v3', 'Standard_D2s_v3', 'Standard_D4s_v3', 'Standard_D8s_v3', 'Standard_D16s_v3', 'Standard_D32s_v3', 'Standard_D48s_v3', 'Standard_D64s_v3', 'Standard_D2_v4', 'Standard_D4_v4', 'Standard_D8_v4', 'Standard_D16_v4', 'Standard_D32_v4', 'Standard_D48_v4', 'Standard_D64_v4', 'Standard_D2s_v4')] - [string]$AzVmSize, - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzVmSize ) # Splatting parameters for better readability diff --git a/azure-cli/vms/wip_az-cli-create-linux-vm.ps1 b/azure-cli/vms/wip_az-cli-create-linux-vm.ps1 index 5b9f5a0..ab0947a 100644 --- a/azure-cli/vms/wip_az-cli-create-linux-vm.ps1 +++ b/azure-cli/vms/wip_az-cli-create-linux-vm.ps1 @@ -5,45 +5,18 @@ .DESCRIPTION This script creates an Azure Linux VM. It registers necessary providers, creates a resource group, and creates a VM with the specified parameters. -.PARAMETER AzResourceGroup +.PARAMETER ResourceGroup Defines the name of the Azure Resource Group. -.PARAMETER AzOpenPorts +.PARAMETER OpenPorts Defines the ports to open on the Azure Virtual Machine. -.PARAMETER AzVmSize +.PARAMETER VmSize Defines the size of the Azure Virtual Machine. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\wip_az-cli-create-linux-vm.ps1 -AzResourceGroup "myResourceGroup" -AzOpenPorts "3389" -AzVmSize "Standard_A1_v2" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -60,24 +33,7 @@ param( [Parameter(Mandatory=$true)] [ValidateSet('Standard_A0', 'Standard_A1', 'Standard_A2', 'Standard_A3', 'Standard_A4', 'Standard_A5', 'Standard_A6', 'Standard_A7', 'Standard_A8', 'Standard_A9', 'Standard_A10', 'Standard_A11', 'Standard_A1_v2', 'Standard_A2_v2', 'Standard_A4_v2', 'Standard_A8_v2', 'Standard_A2m_v2', 'Standard_A4m_v2', 'Standard_A8m_v2', 'Standard_B1s', 'Standard_B1ms', 'Standard_B2s', 'Standard_B2ms', 'Standard_B4ms', 'Standard_B8ms', 'Standard_B12ms', 'Standard_B16ms', 'Standard_B20ms', 'Standard_B24ms', 'Standard_B1ls', 'Standard_B1s', 'Standard_B2s', 'Standard_B4s', 'Standard_B8s', 'Standard_B12s', 'Standard_B16s', 'Standard_B20s', 'Standard_B24s', 'Standard_D1', 'Standard_D2', 'Standard_D3', 'Standard_D4', 'Standard_D11', 'Standard_D12', 'Standard_D13', 'Standard_D14', 'Standard_D1_v2', 'Standard_D2_v2', 'Standard_D3_v2', 'Standard_D4_v2', 'Standard_D5_v2', 'Standard_D11_v2', 'Standard_D12_v2', 'Standard_D13_v2', 'Standard_D14_v2', 'Standard_D15_v2', 'Standard_D2_v3', 'Standard_D4_v3', 'Standard_D8_v3', 'Standard_D16_v3', 'Standard_D32_v3', 'Standard_D48_v3', 'Standard_D64_v3', 'Standard_D2s_v3', 'Standard_D4s_v3', 'Standard_D8s_v3', 'Standard_D16s_v3', 'Standard_D32s_v3', 'Standard_D48s_v3', 'Standard_D64s_v3', 'Standard_D2_v4', 'Standard_D4_v4', 'Standard_D8_v4', 'Standard_D16_v4', 'Standard_D32_v4', 'Standard_D48_v4', 'Standard_D64_v4', 'Standard_D2s_v4')] - [string]$AzVmSize, - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzVmSize ) # Splatting parameters for better readability diff --git a/azure-cli/vms/wip_az-cli-create-specialized-vm.ps1 b/azure-cli/vms/wip_az-cli-create-specialized-vm.ps1 index 265cdff..3a2bc40 100644 --- a/azure-cli/vms/wip_az-cli-create-specialized-vm.ps1 +++ b/azure-cli/vms/wip_az-cli-create-specialized-vm.ps1 @@ -20,36 +20,9 @@ .PARAMETER AzLocation Defines the location for the resource group. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\wip_az-cli-create-specialized-vm.ps1 -AzResourceGroup "myResourceGroup" -AzOpenPorts "3389" -AzVmName "myVM2" -AzImageId "/subscriptions//resourceGroups/myGalleryRG/providers/Microsoft.Compute/galleries/myGallery/images/myImageDefinition" -AzLocation "eastus" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -74,24 +47,7 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzLocation = 'eastus', - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$AzLocation = 'eastus' ) # Splatting parameters for better readability diff --git a/azure-cli/vms/wip_az-cli-delete-image-builder-linux.ps1 b/azure-cli/vms/wip_az-cli-delete-image-builder-linux.ps1 index f03f0b1..7e31698 100644 --- a/azure-cli/vms/wip_az-cli-delete-image-builder-linux.ps1 +++ b/azure-cli/vms/wip_az-cli-delete-image-builder-linux.ps1 @@ -5,42 +5,15 @@ .DESCRIPTION This script deletes an Azure Image Builder Linux VM and its associated resources, including the image template, role assignments, identities, image versions, image definitions, and the resource group. -.PARAMETER AzResourceGroup +.PARAMETER ResourceGroup Defines the name of the Azure Resource Group. -.PARAMETER AzOpenPorts +.PARAMETER OpenPorts Defines the ports to open on the Azure Virtual Machine. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\wip_az-cli-delete-image-builder-linux.ps1 -AzResourceGroup "myResourceGroup" -AzOpenPorts "3389" -.NOTES - Author: Your Name - Date: 2024-09-03 - Version: 1.1 - Requires: Azure CLI - .LINK https://learn.microsoft.com/en-us/cli/azure/vm #> @@ -49,40 +22,17 @@ param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzResourceGroup = 'myResourceGroup', + [string]$ResourceGroup = 'myResourceGroup', [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] - [string]$AzOpenPorts = '3389', - - [Parameter(Mandatory=$false)] - [switch]$AzDebug, - - [Parameter(Mandatory=$false)] - [switch]$AzOnlyShowErrors, - - [Parameter(Mandatory=$false)] - [string]$AzOutput, - - [Parameter(Mandatory=$false)] - [string]$AzQuery, - - [Parameter(Mandatory=$false)] - [switch]$AzVerbose, - - + [string]$OpenPorts = '3389' ) # Splatting parameters for better readability -$parameters = @{ - resource_group = $AzResourceGroup - open_ports = $AzOpenPorts - debug = $AzDebug - only_show_errors = $AzOnlyShowErrors - output = $AzOutput - query = $AzQuery - verbose = $AzVerbose -} +$parameters = ` + 'resource-group', $AzResourceGroup + 'open-ports', $AzOpenPorts # Set Error Action to Stop $ErrorActionPreference = "Stop" diff --git a/azure-cli/xoap/az-cli-register-node.ps1 b/azure-cli/xoap/az-cli-register-node.ps1 index d683156..a427088 100644 --- a/azure-cli/xoap/az-cli-register-node.ps1 +++ b/azure-cli/xoap/az-cli-register-node.ps1 @@ -6,10 +6,10 @@ This script registers a new Azure VM in XOAP. The script uses the Azure CLI to run a PowerShell script on the Azure VM. The PowerShell script downloads the DSC configuration from the XOAP platform and applies it to the Azure VM. -.PARAMETER AzResourceGroup +.PARAMETER ResourceGroup Defines the name of the Azure Resource Group. -.PARAMETER AzVmName +.PARAMETER VmName Defines the name of the Azure VM. .PARAMETER WorkspaceId @@ -18,27 +18,6 @@ .PARAMETER GroupName Defines the XOAP config.XO group name to assign the node to. -.PARAMETER AzDebug - Increase logging verbosity to show all debug logs. - -.PARAMETER AzOnlyShowErrors - Only show errors, suppressing warnings. - -.PARAMETER AzOutput - Output format. - -.PARAMETER AzQuery - JMESPath query string. - -.PARAMETER AzVerbose - Increase logging verbosity. - -.PARAMETER WhatIf - Shows what would happen if the cmdlet runs. The cmdlet is not run. - -.PARAMETER Confirm - Prompts you for confirmation before running the cmdlet. - .EXAMPLE .\az-cli-register-node.ps1 -AzResourceGroup "myResourceGroup" -AzVmName "myVmName" -WorkspaceId "myWorkspaceId" -GroupName "myGroupName" diff --git a/azure-ps/avd/stack/New-AzKeyVault.ps1 b/azure-ps/avd/stack/New-AzKeyVault.ps1 index 1c8ce90..ba90b74 100644 --- a/azure-ps/avd/stack/New-AzKeyVault.ps1 +++ b/azure-ps/avd/stack/New-AzKeyVault.ps1 @@ -148,9 +148,9 @@ $ErrorActionPreference = "Stop" try { # Splatting parameters $params = @{ - Name = $Name - ResourceGroup = $ResourceGroup - Location = $Location + Name = $Name + ResourceGroup = $ResourceGroup + Location = $Location } if ($EnabledForDeployment) { diff --git a/azure-ps/avd/stack/New-AzResourceGroup.ps1 b/azure-ps/avd/stack/New-AzResourceGroup.ps1 index ccbd8e4..5dd713c 100644 --- a/azure-ps/avd/stack/New-AzResourceGroup.ps1 +++ b/azure-ps/avd/stack/New-AzResourceGroup.ps1 @@ -7,10 +7,10 @@ The script uses the following Azure PowerShell command: New-AzResourceGroup -Name $AzResourceGroup -Location $AzLocation -.PARAMETER AzResourceGroup +.PARAMETER ResourceGroup Defines the name of the Azure Resource Group. -.PARAMETER AzLocation +.PARAMETER Location Defines the location of the Azure Resource Group. .PARAMETER Tags @@ -89,10 +89,7 @@ try { } catch { # Log the error to the console - Write-Output "Error message $errorMessage" - - Write-Error "Failed to create Azure Resource Group: $($_.Exception.Message)" } finally { diff --git a/azure-ps/avd/stack/New-AzStorageAccount.ps1 b/azure-ps/avd/stack/New-AzStorageAccount.ps1 index 1aa7a34..b9bea9d 100644 --- a/azure-ps/avd/stack/New-AzStorageAccount.ps1 +++ b/azure-ps/avd/stack/New-AzStorageAccount.ps1 @@ -181,7 +181,7 @@ param( 'Premium_ZRS', 'Standard_GZRS', 'Standard_RAGZRS' - )] + )] [string]$SkuName, [Parameter(Mandatory=$true)] @@ -265,7 +265,7 @@ param( [ValidateSet( 'SystemAssigned', 'UserAssigned', - 'SystemAssigned, UserAssigned' + 'SystemAssigned,UserAssigned' )] [string]$IdentityType, @@ -386,7 +386,12 @@ param( [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] - [ValidateSet('None', 'StorageFileDataSmbShareContributor', 'StorageFileDataSmbShareReader', 'StorageFileDataSmbShareElevatedContributor')] + [ValidateSet( + 'None', + 'StorageFileDataSmbShareContributor', + 'StorageFileDataSmbShareReader', + 'StorageFileDataSmbShareElevatedContributor' + )] [string]$DefaultSharePermission, [Parameter(Mandatory=$false)] @@ -445,11 +450,11 @@ try { # Splatting parameters for better readability $parameters = @{ ResourceGroup = $ResourceGroup - Name = $Name - SkuName = $SkuName - Location = $Location - Kind = $Kind - AccessTier = $AccessTier + Name = $Name + SkuName = $SkuName + Location = $Location + Kind = $Kind + AccessTier = $AccessTier } if ($CustomDomainName) { diff --git a/azure-ps/avd/stack/New-AzVirtualNetwork.ps1 b/azure-ps/avd/stack/New-AzVirtualNetwork.ps1 index bfa7553..f5d1d85 100644 --- a/azure-ps/avd/stack/New-AzVirtualNetwork.ps1 +++ b/azure-ps/avd/stack/New-AzVirtualNetwork.ps1 @@ -161,10 +161,10 @@ param( # Splatting parameters for better readability $parameters = @{ - Name = $Name + Name = $Name ResourceGroup = $ResourceGroup - Location = $Location - AddressPrefix = $AddressPrefix + Location = $Location + AddressPrefix = $AddressPrefix } if ($DnsServer) { diff --git a/azure-ps/avd/stack/New-AzWvdApplication.ps1 b/azure-ps/avd/stack/New-AzWvdApplication.ps1 index 38e1f77..ce88567 100644 --- a/azure-ps/avd/stack/New-AzWvdApplication.ps1 +++ b/azure-ps/avd/stack/New-AzWvdApplication.ps1 @@ -141,11 +141,11 @@ param ( # Splatting parameters for better readability $parameters = @{ - GroupName = $GroupName - Name = $Name - ResourceGroup = $ResourceGroup - CommandLineSetting = $CommandLineSetting - AppAlias = $AppAlias + GroupName = $GroupName + Name = $Name + ResourceGroup = $ResourceGroup + CommandLineSetting = $CommandLineSetting + AppAlias = $AppAlias } if ($Description) { diff --git a/azure-ps/avd/stack/New-AzWvdApplicationGroup.ps1 b/azure-ps/avd/stack/New-AzWvdApplicationGroup.ps1 index 597a160..ce19305 100644 --- a/azure-ps/avd/stack/New-AzWvdApplicationGroup.ps1 +++ b/azure-ps/avd/stack/New-AzWvdApplicationGroup.ps1 @@ -200,11 +200,11 @@ param ( # Splatting parameters for better readability $parameters = @{ - Name = $Name - ResourceGroup = $ResourceGroup + Name = $Name + ResourceGroup = $ResourceGroup ApplicationGroupType = $ApplicationGroupType - HostPoolArmPath = $HostPoolArmPath - Location = $Location + HostPoolArmPath = $HostPoolArmPath + Location = $Location } if ($SubscriptionId) { diff --git a/azure-ps/avd/stack/New-AzWvdHostPool.ps1 b/azure-ps/avd/stack/New-AzWvdHostPool.ps1 index 113aa67..b2772f6 100644 --- a/azure-ps/avd/stack/New-AzWvdHostPool.ps1 +++ b/azure-ps/avd/stack/New-AzWvdHostPool.ps1 @@ -218,7 +218,8 @@ param ( [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] [ValidateSet( - 'Default', 'Scheduled' + 'Default', + 'Scheduled' )] [string]$AgentUpdateType, @@ -291,7 +292,10 @@ param ( [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] [ValidateSet( - 'Disabled', 'Enabled', 'EnabledForClientsOnly', 'EnabledForSessionHostsOnly' + 'Disabled', + 'Enabled', + 'EnabledForClientsOnly', + 'EnabledForSessionHostsOnly' )] [string]$PublicNetworkAccess, @@ -302,7 +306,9 @@ param ( [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] [ValidateSet( - 'Delete', 'None', 'Update' + 'Delete', + 'None', + 'Update' )] [string]$RegistrationTokenOperation, @@ -368,12 +374,12 @@ $ErrorActionPreference = "Stop" # Splatting parameters for better readability $parameters = @{ - Name = $Name - ResourceGroup = $ResourceGroup - HostPoolType = $HostPoolType - LoadBalancerType = $LoadBalancerType + Name = $Name + ResourceGroup = $ResourceGroup + HostPoolType = $HostPoolType + LoadBalancerType = $LoadBalancerType PreferredAppGroupType = $PreferredAppGroupType - Location = $Location + Location = $Location } if ($DesktopAppGroupName) { diff --git a/azure-ps/avd/stack/New-AzWvdRegistrationInfo.ps1 b/azure-ps/avd/stack/New-AzWvdRegistrationInfo.ps1 index 1fd7f99..966ed73 100644 --- a/azure-ps/avd/stack/New-AzWvdRegistrationInfo.ps1 +++ b/azure-ps/avd/stack/New-AzWvdRegistrationInfo.ps1 @@ -49,8 +49,8 @@ param ( # Splatting parameters for better readability $parameters = @{ ResourceGroup = $ResourceGroup - HostPoolName = $HostPoolName - ExpirationTime = $ExpirationTime + HostPoolName = $HostPoolName + ExpirationTime = $ExpirationTime } # Set Error Action to Stop diff --git a/azure-ps/avd/stack/New-AzWvdWorkspace.ps1 b/azure-ps/avd/stack/New-AzWvdWorkspace.ps1 index 7910d77..46a4b4d 100644 --- a/azure-ps/avd/stack/New-AzWvdWorkspace.ps1 +++ b/azure-ps/avd/stack/New-AzWvdWorkspace.ps1 @@ -165,7 +165,8 @@ param ( [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] [ValidateSet( - 'Enabled', 'Disabled' + 'Enabled', + 'Disabled' )] [string]$PublicNetworkAccess, diff --git a/azure-ps/avd/stack/Register-AzWvdApplicationGroup.ps1 b/azure-ps/avd/stack/Register-AzWvdApplicationGroup.ps1 index 48ac17c..3a382b2 100644 --- a/azure-ps/avd/stack/Register-AzWvdApplicationGroup.ps1 +++ b/azure-ps/avd/stack/Register-AzWvdApplicationGroup.ps1 @@ -48,8 +48,8 @@ param ( # Splatting parameters for better readability $parameters = @{ - ResourceGroup = $ResourceGroup - WorkspaceName = $WorkspaceName + ResourceGroup = $ResourceGroup + WorkspaceName = $WorkspaceName ApplicationGroupPath = $ApplicationGroupPath } diff --git a/azure-ps/avd/stack/Remove-AzResourceGroup.ps1 b/azure-ps/avd/stack/Remove-AzResourceGroup.ps1 index fbea6c7..2d525e8 100644 --- a/azure-ps/avd/stack/Remove-AzResourceGroup.ps1 +++ b/azure-ps/avd/stack/Remove-AzResourceGroup.ps1 @@ -25,7 +25,6 @@ .COMPONENT Azure PowerShell - #> [CmdletBinding()] diff --git a/azure-ps/avd/stack/_todo/Stop-VmsBasedOnTag.ps1 b/azure-ps/avd/stack/_todo/Stop-VmsBasedOnTag.ps1 new file mode 100644 index 0000000..c93f150 --- /dev/null +++ b/azure-ps/avd/stack/_todo/Stop-VmsBasedOnTag.ps1 @@ -0,0 +1,232 @@ +<# + .SYNOPSIS + This script manages the power state of Azure virtual machines based on a specified tag and its value which defines the schedule. + + .DESCRIPTION + This script checks all Azure virtual machines for a tag named "AutoShutdownSchedule" with a value defining the schedule, + e.g. "10PM -> 6AM". It then compares the current time with the schedule and starts or stops the VMs accordingly. + + .PARAMETER TagName + The name of the tag to look for on virtual machines. + + .PARAMETER ManagementGroupId + The ID of the Azure management group to operate on. + + .PARAMETER Simulate + If $true, the script will only simulate the actions without making any changes. + + .EXAMPLE + .\StartStopVMsBasedOnTag.ps1 -TagName "AutoShutdownSchedule" -ManagementGroupId "MngEnv" -Simulate $true + +#> +param ( + [parameter(Mandatory = $true)] + [string]$TagName, + + [parameter(Mandatory = $true)] + [string]$ManagementGroupId, + + [parameter(Mandatory = $false)] + [bool]$Simulate = $true +) + +## Getting all virtual machines +Write-Output "" +Write-Output "" +Write-Output "---------------------------- Status ----------------------------" +Write-Output "Getting all virtual machines from all resource groups ..." + +# Function to retrieve all subscriptions under a management group +function Get-SubscriptionsUnderManagementGroup { + param ( + [Parameter(Mandatory = $true)] + [string]$ManagementGroupId + ) + + # Array to store subscription IDs + $subscriptionIds = @() + + # Get the management group hierarchy + $managementGroup = Get-AzManagementGroup -GroupId $ManagementGroupId -Expand + + if ($managementGroup -and $managementGroup.Children) { + # Loop through each child in the management group + foreach ($child in $managementGroup.Children) { + if ($child.Type -eq "Microsoft.Management/managementGroups") { + # Recursively get subscriptions from child management groups + $childManagementGroupId = $child.Name + $subscriptionIds += Get-SubscriptionsUnderManagementGroup -ManagementGroupId $childManagementGroupId + } elseif ($child.Type -match "/subscriptions") { + # Extract subscription ID + $subscriptionId = [regex]::Match($child.Name, "([a-f0-9-]{36})").Value + if ($subscriptionId) { + $subscriptionIds += $subscriptionId + } + } + } + } + + return $subscriptionIds +} + +# Get all subscription IDs under the management group +$subscriptionIds = Get-SubscriptionsUnderManagementGroup -ManagementGroupId $ManagementGroupId + +function CheckScheduleEntry ([string]$TimeRange) { + $rangeStart, $rangeEnd, $parsedDay = $null + $currentTime = (Get-Date).ToUniversalTime().AddHours(2) + $midnight = $currentTime.AddDays(1).Date + + try { + if ($TimeRange -like "*->*") { + $timeRangeComponents = $TimeRange -split "->" | ForEach-Object { $_.Trim() } + if ($timeRangeComponents.Count -eq 2) { + $rangeStart = Get-Date $timeRangeComponents[0] + $rangeEnd = Get-Date $timeRangeComponents[1] + + if ($rangeStart -gt $rangeEnd) { + if ($currentTime -ge $rangeStart -and $currentTime -lt $midnight) { + $rangeEnd = $rangeEnd.AddDays(1) + } + else { + $rangeStart = $rangeStart.AddDays(-1) + } + } + } + else { + Write-Output "`WARNING: Invalid time range format. Expects valid .Net DateTime-formatted start time and end time separated by '->'" + } + } + else { + if ([System.DayOfWeek].GetEnumValues() -contains $TimeRange) { + if ($TimeRange -eq (Get-Date).DayOfWeek) { + $parsedDay = Get-Date "00:00" + } + } + else { + $parsedDay = Get-Date $TimeRange + } + + if ($parsedDay -ne $null) { + $rangeStart = $parsedDay + $rangeEnd = $parsedDay.AddHours(23).AddMinutes(59).AddSeconds(59) + } + } + } + catch { + Write-Output "`WARNING: Exception encountered while parsing time range. Details: $($_.Exception.Message). Check the syntax of entry, e.g. ' -> ', or days/dates like 'Sunday' and 'December 25'" + return $false + } + + if ($currentTime -ge $rangeStart -and $currentTime -le $rangeEnd) { + return $true + } + else { + return $false + } +} + +function AssertVirtualMachinePowerState { + param ( + [Object]$VirtualMachine, + [string]$DesiredState, + [bool]$Simulate + ) + + $resourceManagerVM = Get-AzVM -ResourceGroupName $VirtualMachine.ResourceGroupName -Name $VirtualMachine.Name -Status + $currentStatus = $resourceManagerVM.Statuses | Where-Object { $_.Code -like "PowerState*" } + $currentStatus = $currentStatus.Code -replace "PowerState/", "" + + if ($DesiredState -eq "Started" -and $currentStatus -notmatch "running") { + if ($Simulate) { + Write-Output "[$($VirtualMachine.Name)]: SIMULATION -- Would have started VM. (No action taken)" + } + else { + Write-Output "[$($VirtualMachine.Name)]: Starting VM" + $resourceManagerVM | Start-AzVM + } + } + elseif ($DesiredState -eq "StoppedDeallocated" -and $currentStatus -ne "deallocated") { + if ($Simulate) { + Write-Output "[$($VirtualMachine.Name)]: SIMULATION -- Would have stopped VM. (No action taken)" + } + else { + Write-Output "[$($VirtualMachine.Name)]: Stopping VM" + $resourceManagerVM | Stop-AzVM -Force + } + } + else { + Write-Output "[$($VirtualMachine.Name)]: Current power state [$currentStatus] is correct." + } +} + +try { + $currentTime = (Get-Date).ToUniversalTime() + Write-Output "Script started. Version: $VERSION" + if ($Simulate) { + Write-Output "*** Running in SIMULATE mode. No power actions will be taken. ***" + } + else { + Write-Output "*** Running in LIVE mode. Schedules will be enforced. ***" + } + Write-Output "Current UTC/GMT time [$($currentTime.ToString("dddd, yyyy MMM dd HH:mm:ss"))] will be checked against schedules" + + foreach ($SubscriptionId in $subscriptionIds) { + Write-Output "Processing subscription: $SubscriptionId" + Set-AzContext -SubscriptionId $SubscriptionId + + $resourceManagerVMList = @(Get-AzVM -Status | Sort-Object Name) + + Write-Output "Found [$($resourceManagerVMList.Count)] virtual machines in the subscription [$SubscriptionId]" + + foreach ($vm in $resourceManagerVMList) { + $schedule = $null + + if ($vm.Tags.$TagName) { + $schedule = $vm.Tags.$TagName + Write-Output "[$($vm.Name)]: Found schedule tag with value: $schedule" + } + else { + Write-Output "[$($vm.Name)]: Not tagged for shutdown. Skipping this VM." + continue + } + + if ($schedule -eq $null) { + Write-Output "[$($vm.Name)]: Failed to get tagged schedule for virtual machine. Skipping this VM." + continue + } + + $timeRangeList = @($schedule -split "," | ForEach-Object { $_.Trim() }) + + $scheduleMatched = $false + $matchedSchedule = $null + foreach ($entry in $timeRangeList) { + if ((CheckScheduleEntry -TimeRange $entry) -eq $true) { + $scheduleMatched = $true + $matchedSchedule = $entry + break + } + } + + if ($scheduleMatched) { + Write-Output "[$($vm.Name)]: Current time [$currentTime] falls within the scheduled shutdown range [$matchedSchedule]" + AssertVirtualMachinePowerState -VirtualMachine $vm -DesiredState "StoppedDeallocated" -Simulate $Simulate + } + else { + Write-Output "[$($vm.Name)]: Current time falls outside of all scheduled shutdown ranges." + AssertVirtualMachinePowerState -VirtualMachine $vm -DesiredState "Started" -Simulate $Simulate + } + } + } + + Write-Output "Finished processing virtual machine schedules" +} + +catch { + $errorMessage = $_.Exception.Message + throw "Unexpected exception: $errorMessage" +} + +finally { + Write-Output "Script finished (Duration: $(("{0:hh\:mm\:ss}" -f ((Get-Date).ToUniversalTime() - $currentTime))))" +}