Use PowerShell to create cloud DR environment using Azure SQL Databases (PaaS) and send Email Report with the connection string details

 

Description:

Use PowerShell to deploy cloud service with Azure SQL Database (PaaS) with good resilience to outages (GEO Replications, Failover Groups)

 

PowerShell:


 

 

Script usage example: 

PowerShell
Edit|Remove
# Azure SQL DB Setup replication Option 
[string]$singledatabase = "YES", 
[string]$replication = "YES", 
 
# Log File Path 
[string]$LogPath = "C:\ScriptLogs", 
 
# Set the resource group name and location 
[string]$resourcegroupname = "test-rg", 
[string]$location = "East US", 
 
# Set an admin login and password for your server 
[string]$adminlogin = "admin_test", 
[string]$password = "P@ssw0rd!", 
 
# Set server name - the logical server name has to be unique 
[string]$servername = "test-primary-sql-server", 
[string]$serverlocation = "East US", 
 
# Set failover server name - the logical failover server name has to be unique 
[string]$failoverservername = "test-secondary-sql-server", 
[string]$failoverserverlocation = "West US", 
 
# Set failover group name 
[string]$failovergroupname='test-failover-group', 
 
# The database name 
[string]$databasename = "test_database", 
[string]$databasepricingtier="S0", 
 
# SQL login and database user 
[string]$sqllogin = "test_user", 
[string]$sqlloginpassword = "P@ssw0rd!", 
[string]$databaseuser = "test_user", 
[string]$databaseuserrole="db_owner", 
 
# The ip address range that you want to allow to access your server 
[string]$firewallrulename="Office", 
[string]$startip = "", 
[string]$endip = ""
Note.
You can repeat the script multiple times. If the resource you are creating already exist script will just skip that part with a message. 

 

Email Report Sample

Note.
You should use read/write listener endpoint within the connection string 

 

 

Some code snippets:

PowerShell
Edit|Remove
#########################################################################
# Create a resource group######################################################################### 
Write-Output ((Get-Date-Format g)+" >>> RESOURCE GROUP CREATING PROCESS >>>"# Check if resource group already existif (Get-AzureRmResourceGroup | Where ResourceGroupName -eq $resourcegroupname) 
{ 
Write-Output ((Get-Date-Format g)+" - Resource Group "+$resourcegroupname+" already exist") 
} 
else 
{ 
Write-Output ((Get-Date-Format g)+" - Creating "+$resourcegroupname+" Resource Group") 
New-AzureRmResourceGroup -Name $resourcegroupname-Location $location 
Write-Output ((Get-Date-Format g)+" - Resource Group "+$resourcegroupname+" successfuly created") 
} 
Write-Output (""############################################################################################################################################################################################################################ Create a Azure SQL Server, adding admin credentials and firewall rules#########################################################################if ($singledatabase-eq "YES") 
{ 
Write-Output ((Get-Date-Format g)+" >>> AZURE LOGICAL SQL SERVER CREATING AND FIREWALL RULES ADDING PROCESS >>>"# Check if Primary Azure SQL Server already existif (Get-AzureRmSqlServer -ResourceGroupName $resourcegroupname| where ServerName -eq $servername) 
{ 
Write-Output ((Get-Date-Format g)+" - Azure Logical SQL Server "+$servername+" already exist") 
} 
else 
{ 
Write-Output ((Get-Date-Format g)+" - Creating "+$servername+" Azure Logical SQL Server"# Create a server with admin credentials 
New-AzureRmSqlServer -ResourceGroupName $resourcegroupname-ServerName $servername-Location $serverlocation-SqlAdministratorCredentials $(New-Object-TypeName System.Management.Automation.PSCredential -ArgumentList $adminlogin$(ConvertTo-SecureString-String $password-AsPlainText -Force)) 
Write-Output ((Get-Date-Format g)+" - Azure Logical SQL Server "+$servername+" successfuly created") 
Write-Output ((Get-Date-Format g)+" - Adding firewall rules for "+$servername+" Azure SQL Server"# Create a server firewall rule that allows access from the specified IP range 
New-AzureRmSqlServerFirewallRule -ResourceGroupName $resourcegroupname-ServerName $servername-FirewallRuleName $firewallrulename-StartIpAddress $startip-EndIpAddress $endip 
Write-Output ((Get-Date-Format g)+" - Firewall rules for "+$servername+" Azure SQL Server successfuly added") 
} 
} 
Write-Output (""############################################################################################################################################################################################################################ Create a login for the SQL Server (Primary Server)########################################################################## Create a login$ConnStrMaster = @{ 
    'Database' = 'master''ServerInstance' = $servername+'.database.windows.net''Username' = $adminlogin'Password' = $password'Query' = "IF NOT EXISTS (SELECT*FROM sys.sql_logins WHERE name = N'$sqllogin') 
               CREATE LOGIN $sqllogin WITH PASSWORD=N'$sqlloginpassword'" 
} 
Invoke-Sqlcmd @ConnStrMaster 
Write-Output ((Get-Date-Format g)+" - Login "+$sqllogin+" for "+$servername+" Azure SQL Server is successfuly created") 
Write-Output (""#########################################################################
#########################################################################