Search code examples
azureazure-runbook

Enable/Disable availability tests in Azure on Schedule


I'm wondering if there is an easy way to run scheduled automation commands in Azure.

I managed to write Enable/Disable command for availability tests both in

Azure CLI:

az resource update --set properties.enabled=true --name 'someName' --resource-type 'Microsoft.Insights/webtests' --resource-group 'soemResourceGroup'

and

Powershell:

#Get All webTests
$resourceGroupnames = "someGroupName1", "someGroupName2";
$enableTests = "True";

ForEach ($resourceGroupname in $resourceGroupnames) { 
    $resourceGroupname
    $allAvailabilityTestsIds = Get-AzureRmResource -ResourceGroupName $resourceGroupname `
    | Where-Object -Property ResourceType -EQ "microsoft.insights/webtests" `
    | Select-Object -ExpandProperty ResourceId;

    ForEach ($availabilityTestId in $allAvailabilityTestsIds) { 
        $availabilityTest = Get-AzureRmResource -ResourceId $availabilityTestId;
        $availabilityTest.Properties.Enabled = $enableTests;
        $availabilityTest | Set-AzureRmResource -Force;
    }
}

problem is that I'm not sure to run them outside of Comamnd line and on schedule. I've read that I could use Automation account to use powershell scripts but that seems a nightmare since I got tons of issues with authentication (not sure why).

Is that an only way ?

EDIT: I post the errror I was/am getting below.

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Set-AzureRmResource : Cannot validate argument on parameter 'Sku'. The argument is null or empty. Provide an argument 
that is not null or empty, and then try the command again.
At line:37 char:29
+         $availabilityTest | Set-AzureRmResource -Force;
+                             ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Azure...dels.PSResource:PSObject) [Set-AzureRmResource], 
ParameterBindingValidationException
    + FullyQualifiedErrorId : 
ParameterArgumentValidationError,Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.SetAzureResourceCmdlet

Regards.


Solution

  • You could follow the steps as below to use the azure runbook in automation to do that.

    1.Navigate to your automation account -> Runbooks -> Create a runbook -> create a Powershell runbook.

    2.In the runbook, add the script to login, your complete script should be like below. (Before running the runbook, make sure you have imported the AzureRM.Resources and AzureRM.Profile powershell module in your automation account -> Modules, if not, in the Modules -> Browse Gallery, search for the modules and import them.)

    $connectionName = "AzureRunAsConnection"
    try
    {
        # Get the connection "AzureRunAsConnection "
        $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         
    
        "Logging in to Azure..."
        Add-AzureRmAccount `
            -ServicePrincipal `
            -TenantId $servicePrincipalConnection.TenantId `
            -ApplicationId $servicePrincipalConnection.ApplicationId `
            -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
    }
    catch {
        if (!$servicePrincipalConnection)
        {
            $ErrorMessage = "Connection $connectionName not found."
            throw $ErrorMessage
        } else{
            Write-Error -Message $_.Exception
            throw $_.Exception
        }
    }
    
    #Get All webTests
    $resourceGroupnames = "someGroupName1", "someGroupName2";
    $enableTests = "True";
    
    ForEach ($resourceGroupname in $resourceGroupnames) { 
        $resourceGroupname
        $allAvailabilityTestsIds = Get-AzureRmResource -ResourceGroupName $resourceGroupname `
        | Where-Object -Property ResourceType -EQ "microsoft.insights/webtests" `
        | Select-Object -ExpandProperty ResourceId;
    
        ForEach ($availabilityTestId in $allAvailabilityTestsIds) { 
            $availabilityTest = Get-AzureRmResource -ResourceId $availabilityTestId;
            $availabilityTest.Properties.Enabled = $enableTests;
            $availabilityTest | Set-AzureRmResource -Force;
        }
    }
    

    3.After running the script successfully, follow this link Scheduling a runbook in Azure Automation to add a schedule to your runbook.