PowerShell script to migrate SharePoint to Azure IaaS by Richard Qi

Recently at the Windows Azure Global Boot Camp, I talked about how to migrate sharepoint from on premise to Windows Azure Virtual Machines. Some of you reached out to me after the session for the scripts, so this article helps you to create that script.

Important: Do NOT copy the script blindly. You need to change some variables for you environment. Read through the script and optimize for your own environment.  Tweet to me @richardqyc if you have any suggestions to make the script better 🙂 

First thing first, download and install the Windows Azure Command Line Tools. After the Command Line Tools installed, prepare to get the Windows Azure subscription file publishing settings. Here is how to do it:

    1. Launch Windows Azure PowerShell. It is located at C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Windows Azure\
    2. Type command Get-AzurePublishSettingsFile. It will ask you to login to you Azure subscription and download the settings file.

Do save the file somewhere safe. You can reuse it for any script that you going to create to talk to Azure. Before you use the script, you should have your own sharepoint deployed in Hyper-V and exported the VMs into a location ready for upload to Azure.

Here comes the long script 🙂

[cc lang=’powershell’ ]

# Import the Azure PowerShell module

Import-Module”C:\Program Files (x86)\Microsoft SDKs\Windows Azure\PowerShell\Azure\Azure.psd1″

# Import the Azure Publish Settings, Change the directory to where you save the file.

Import-AzurePublishSettingsFile”C:\AzurePublishFiles\Azure-credentials.publishsettings”

# Change this to something unique to your azure subscription

$storageAccountName=”your storage account name”

$yoursubscriptionName=”your azure subscription name”

# Select the location you wish to deploy to

$Location=”Southeast Asia”

#these also need to be unique, you can use the VM names of your sharepoint

$dcservice=’con-dc-ricqi’

$dbservice=’con-db-ricqi’

$appservice=’con-app-ricqi’

$webservice=’con-web-ricqi’

$adminservice=’con-admin-ricqi’

#This will define the Affinity group name, descriptions and virtual network name. Use something that makes sense to you

$AGName=”Contoso-SP-AG”

$myAGDesc=”Contoso Affinity Group”

$mAGLabel=”Contoso-SP-AG”

$vnet=”Contoso-SP-Network”

#Create Network. I defined the network IP address in the .xml file. You can create your own. Find details on how to create here: http://msdn.microsoft.com/en-us/library/windowsazure/jj156097.aspx

New-AzureAffinityGroup-Name$AGName-Location$Location-Description$myAGDesc-Label$mAGLabel

Set-AzureVNetConfig-ConfigurationPath (get-item.\SharePointFarm-Network-Configuration.xml).FullName

#Create Storage Account

New-AzureStorageAccount-AffinityGroup$AGName-StorageAccountName$storageAccountName-Label”Contoso VHD Store”

Set-AzureSubscription-CurrentStorageAccount$storageAccountName-SubscriptionName$yoursubscriptionName

#upload SharePoint VHDs to Azure Blob Storage, use your own local VM folder

Add-AzureVHD -LocalFilePath “C:\VMs\con-dc-os.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-dc-os.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-dc-data.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-dc-data.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-db-os.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-db-os.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-db-data.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-db-data.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-app-os.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-app-os.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-app-data.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-app-data.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-web-os.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-web-os.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-web-data.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-web-data.vhd

Add-AzureVHD -LocalFilePath “C:\VMs\con-admin-os.vhd” -Destination http://$storageAccountName.blob.core.windows.net/vhds/con-admin-os.vhd

# Create the Windows Azure disks

Add-AzureDisk -DiskName “con-dc-os” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-dc-os.vhd” -Label “con-dc-os” -OS “Windows”

Add-AzureDisk -DiskName “con-dc-data” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-dc-data.vhd” -Label “con-dc-data”

Add-AzureDisk -DiskName “con-db-os” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-db-os.vhd” -Label “con-db-os” -OS “Windows”

Add-AzureDisk -DiskName “con-db-data” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-db-data.vhd” -Label “con-db-data”

Add-AzureDisk -DiskName “con-app-os” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-app-os.vhd” -Label “con-app-os” -OS “Windows”

Add-AzureDisk -DiskName “con-app-data” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-app-data.vhd” -Label “con-app-data”

Add-AzureDisk -DiskName “con-web-os-01” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-web-os-01.vhd” -Label “con-web-os-01” -OS “Windows”

Add-AzureDisk -DiskName “con-admin-os” -MediaLocation “http://$storageAccountName.blob.core.windows.net/vhds/con-admin-os.vhd” -Label “con-admin-os” -OS “Windows”

# Create the domain controller from the disks

$dcosdisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-dc-os” }

$dcdatadisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-dc-data” }

$dcvmname = ‘con-dc-01′

$dcsize=’Medium’

$dcavailabilitySet = “con-dc-as”

$dcVM = New-AzureVMConfig -name $dcvmname -InstanceSize $dcsize -DiskName $dcosdisk.DiskName -AvailabilitySetName $dcavailabilitySet | Set-AzureSubnet -SubnetNames “DC” | Add-AzureDataDisk -Import -DiskName $dcdatadisk.DiskName -LUN 0

$dcVM = Add-AzureEndpoint -Name RDP -Protocol tcp -LocalPort 3389 -PublicPort 52525 -VM $dcVM

New-AzureVM -ServiceName $dcservice -VMs $dcVM -AffinityGroup $AGName -VNetName $vnet

# Create the DB Server from the disks

$dbosdisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-db-os” }

$dbdatadisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-db-data” }

$dbvmname = ‘con-db-01′

$dbsize=’ExtraLarge’

$dbavailabilitySet = “con-db-as”

$dbsubnetname = “DB”

$dbVM = New-AzureVMConfig -name $dbvmname -InstanceSize $dbsize -DiskName $dbosdisk.DiskName -AvailabilitySetName $dbavailabilitySet

$dbVM = Set-AzureSubnet -SubnetNames $dbsubnetname -VM $dbVM

$dbVM = Add-AzureDataDisk -Import -DiskName $dbdatadisk.DiskName -VM $dbVM -LUN 0

$dbVM = Add-AzureEndpoint -Name RDP -Protocol tcp -LocalPort 3389 -PublicPort 52525 -VM $dbVM

New-AzureVM -ServiceName $dbservice -VMs $dbVM -AffinityGroup $AGName -VNetName $vnet

# Create the App Server from the disks

$apposdisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-app-os” }

$appdatadisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-app-data” }

$appvmname = ‘con-app-01′

$appsize=’Medium’

$appavailabilitySet = “con-app-as”

$appsubnetname = “App”

$appVM = New-AzureVMConfig -name $appvmname -InstanceSize $appsize -DiskName $apposdisk.DiskName -AvailabilitySetName $appavailabilitySet

$appVM = Set-AzureSubnet -SubnetNames $appsubnetname -VM $appVM

$appVM = Add-AzureDataDisk -Import -DiskName $appdatadisk.DiskName -VM $appVM -LUN 0

$appVM = Add-AzureEndpoint -Name RDP -Protocol tcp -LocalPort 3389 -PublicPort 52525 -VM $appVM

New-AzureVM -ServiceName $appservice -VMs $appVM -AffinityGroup $AGName -VNetName $vnet

# Create the Web Server from the disk

$webosdisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-web-os-01” }

$webvmname = ‘con-web-01′

$websize=’Medium’

$webavailabilitySet = “con-web-as”

$websubnetname = “Web”

$webVM = New-AzureVMConfig -name $webvmname -InstanceSize $websize -DiskName $webosdisk.DiskName -AvailabilitySetName $webavailabilitySet

$webVM = Set-AzureSubnet -SubnetNames $websubnetname -VM $webVM

$webVM = Add-AzureEndpoint -Name RDP -Protocol tcp -LocalPort 3389 -PublicPort 52525 -VM $webVM

$webVM = Add-AzureEndpoint -Name HttpIn -Protocol tcp -LocalPort 3456 -PublicPort 80 -VM $webVM -ProbePort 3456 -ProbeProtocol http -LBSetName WebFarm -ProbePath “/”

New-AzureVM -ServiceName $webservice -VMs $webVM -AffinityGroup $AGName -VNetName $vnet

# Create the admin jump box from the disk

$adminosdisk = Get-AzureDisk | where-object {$_.DiskName -eq “con-admin-os” }

$adminvmname = ‘con-admin-01′

$adminsize=’Medium’

$adminavailabilitySet = “con-admin-as”

$adminsubnetname = “Web”

$adminVM = New-AzureVMConfig -name $adminvmname -InstanceSize $adminsize -DiskName $adminosdisk.DiskName -AvailabilitySetName $adminavailabilitySet

$adminVM = Set-AzureSubnet -SubnetNames $adminsubnetname -VM $adminVM

#$adminVM = Add-AzureProvisioningConfig -VM $adminVM -Windows -AdminUsername “spadmin” -Password “pass@word1″ -NoRDPEndpoint

$adminVM = Add-AzureEndpoint -Name RDP -Protocol tcp -LocalPort 3389 -PublicPort 52525 -VM $adminVM

New-AzureVM -ServiceName $adminservice -VMs $adminVM -AffinityGroup $AGName -VNetName $vnet

[/cc]

 

 

 

 

 

Related Posts

Leave a Reply