This sample script shows how to create virtual machines in Windows Azure to prepare an installation of SharePoint Server. Le script suivant montre comment automatiser la cr%u00e9ation de machines virtuelles dans Windows Azure destin%u00e9es %u00e0 accueillir une installation de SharePoint Server

 

#region set default Windows Azure subscription
Import-Module azure

#select default subscription and storage account
$subscription = 'My Azure subscription'
Set-AzureSubscription -SubscriptionName $subscription -CurrentStorageAccount 'mystockageazure'
Set-AzureSubscription -DefaultSubscription $subscription
#endregion

#$adminPassword="******obfuscated*****"
#region secret
$adminPassword="MWfvsoor75"
#endregion

#region other initializations
$serviceName = 'confsharepointc05'
$virtualNetworkName = 'network123'
$adminUsername = 'c05admin'

# get the credential as PSCredential (same type as what would be retrieved by the following command:
#    $credential = Get-Credential -UserName ".\${adminUsername}"
# )
$SecureStringadminPassword = ConvertTo-SecureString -String $adminPassword -AsPlainText -Force
$credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminUsername, $SecureStringadminPassword


# One can select an image by issuing commands like
# get-azurevmimage | select Label, ImageName, IsPremium
# get-azurevmimage | where { $_.Label -Match 'Windows Server 2012 Datacenter, Apri' }
$WindowsServer2012ImageName = 'a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-Datacenter-201304.01-en.us-127GB.vhd'
$WindowsAndSqlServerImageName = 'fb83b3509582419d99629ce476bcb5c8__Microsoft-SQL-Server-2012SP1-Standard-CY13SU04-SQL11-SP1-CU3-11.0.3350.0-B'

#create an empty collection of VMConfigs
$vms = @()
#endregion

#region create domain controller
$DcVmName = 'C05DC1'

Write-Host "creating $DcVmName"
$adminPort = 52101

#create a new VM Config
$newVM = `
    New-AzureVMConfig -ImageName $WindowsServer2012ImageName -InstanceSize Small -Name $DcVmName `
        -AvailabilitySetName "C05DC" -DiskLabel "${DcVmName}os" `
        -HostCaching ReadWrite -Label "$DcVmName" |
    Add-AzureProvisioningConfig -Windows -AdminUsername $adminUsername -Password $adminPassword -NoRDPEndpoint |
    Add-AzureDataDisk -CreateNew -DiskSizeInGB 30 -DiskLabel "${DcVmName}data1" -LUN 0 |
    Add-AzureEndpoint -LocalPort 3389 -Name "RDP" -Protocol tcp -PublicPort $adminPort |
    Set-AzureSubnet 'DCSubnet'
    
#add the VM config to the collection
$vms += ,$newVM

#show the collection
$vms | format-table

#create the VM and wait for boot
New-AzureVM -ServiceName $serviceName -VMs $vms -VNetName $virtualNetworkName -WaitForBoot
#endregion

#region function definition for PowerShell remoting
function InstallWinRMCert($serviceName, $vmname)
{
    $winRMCert = (Get-AzureVM -ServiceName $serviceName -Name $vmname | select -ExpandProperty vm).DefaultWinRMCertificateThumbprint
 
    $AzureX509cert = Get-AzureCertificate -ServiceName $serviceName -Thumbprint $winRMCert -ThumbprintAlgorithm sha1
 
    $certTempFile = [IO.Path]::GetTempFileName()
    Write-Host $certTempFile
    $AzureX509cert.Data | Out-File $certTempFile
 
    # Target The Cert That Needs To Be Imported
    $CertToImport = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $certTempFile
 
    $store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
    $store.Certificates.Count
    $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
    $store.Add($CertToImport)
    $store.Close()
 
    Remove-Item $certTempFile
}
#endregion

#region install features on DC
$uri = Get-AzureWinRMUri -ServiceName $serviceName -Name $DcVmName
InstallWinRMCert $serviceName $DcVmName

    # Use native PowerShell Cmdlet to execute a script block on the remote virtual machine
Invoke-Command -ConnectionUri $uri.ToString() -Credential $credential `
    -ArgumentList $SecureStringadminPassword -ScriptBlock `
{
    param($SecureStringadminPassword)

    $logLabel = $((get-date).ToString("yyyyMMddHHmmss"))
    $logPath = "$env:TEMP\init-webservervm_webserver_install_log_$logLabel.txt"
    Import-Module -Name ServerManager
    Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools -LogPath $logPath


    $disks = Get-Disk | where { $_.NumberOfPartitions -eq 0 } 
    foreach ($d in $disks)
    {
        # there should be one disk only
        $diskNumber = $d.Number
        echo "will format disk $diskNumber"
        Initialize-Disk $diskNumber
        New-Partition -DiskNumber $diskNumber -UseMaximumSize -AssignDriveLetter
        Format-Volume -DriveLetter F -Confirm:$False
        get-volume -DriveLetter F
    }

    Import-module ADDSDeployment
    Install-ADDSForest -DomainName "c05.compiouting.fr" -InstallDns:$true -DatabasePath "F:\NTDS" `
        -LogPath "F:\NTDS" -SysvolPath "F:\SYSVOL" -NoRebootOnCompletion:$false -Force:$true `
        -SafeModeAdministratorPassword $SecureStringadminPassword
} 
#endregion

#region wait for reboot and start a new collection
Start-Sleep -Seconds 45

$DcVm = Get-AzureVM -ServiceName $serviceName -Name $DcVmName
While ($DcVm.InstanceStatus -ne "ReadyRole")
{
    write-host "Waiting for DC to be ready... Current Status = " $DcVm.InstanceStatus
    Start-Sleep -Seconds 15
    $DcVm = Get-AzureVM -ServiceName $serviceName -Name $DcVmName
}

$vms = @()
#endregion

#region SQL Server
$prefix = 'C05SQL'
for($i=1; $i -le 2; $i++)
{
    Write-Host "creating $prefix${i}"
    $adminPort = 53100 + $i

    #create a new VM Config
    $newVM = `
        New-AzureVMConfig -ImageName $WindowsAndSqlServerImageName -InstanceSize Small -Name "$prefix$i" `
            -AvailabilitySetName "$prefix" -DiskLabel "$prefix${i}os" `
            -HostCaching ReadWrite -Label "$prefix${i}" |
        Add-AzureProvisioningConfig -WindowsDomain -AdminUsername $adminUsername -Password $adminPassword `
        -Domain "c05" -DomainUserName $adminUsername -DomainPassword $adminPassword -JoinDomain "c05.compiouting.fr" `
        -NoRDPEndpoint |
        Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -LUN 0 -DiskLabel "$prefix${i}data1" |
        Add-AzureEndpoint -LocalPort 3389 -Name "RDP" -Protocol tcp -PublicPort $adminPort |
        Set-AzureSubnet 'SQLSubnet'
    
    #add the VM config to the collection
    $vms += ,$newVM
}
#endregion

#region SharePoint Server
$prefix = 'C05SP'
for($i=1; $i -le 2; $i++)
{
    Write-Host "creating $prefix$i"
    $adminPort = 52200 + $i

    #create a new VM Config
    $newVM = `
        New-AzureVMConfig -ImageName $WindowsServer2012ImageName -InstanceSize Small -Name "$prefix$i" `
            -AvailabilitySetName "$prefix" -DiskLabel "$prefix${i}os" `
            -HostCaching ReadWrite -Label "$prefix${i}" |
        Add-AzureProvisioningConfig -WindowsDomain -AdminUsername $adminUsername -Password $adminPassword `
        -Domain "c05" -DomainUserName $adminUsername -DomainPassword $adminPassword -JoinDomain "c05.compiouting.fr" `
        -NoRDPEndpoint |
        Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -LUN 0 -DiskLabel "$prefix${i}data1" |
        Add-AzureEndpoint -LocalPort 3389 -Name "RDP" -Protocol tcp -PublicPort $adminPort |
        Add-AzureEndpoint -LocalPort 80 -Name "Web" -Protocol tcp -PublicPort 80 `
            -LBSetName "SPWebLB" -ProbePort 8080 -ProbeProtocol http -ProbePath '/' |
        Set-AzureSubnet 'SP2013Subnet'
    
    #add the VM config to the collection
    $vms += ,$newVM
}
#endregion

#region create SharePoint and SQL Server VMs and wait for them to boot
#show the collection
$vms | format-table

#create the VM and wait for boot
New-AzureVM -ServiceName $serviceName -VMs $vms -WaitForBoot
#endregion


#region install features on SharePoint Servers
$prefix = 'C05SP'
for($i=1; $i -le 2; $i++)
{
    $vmName = "$prefix$i"

    $uri = Get-AzureWinRMUri -ServiceName $serviceName -Name $vmName
    InstallWinRMCert $serviceName $vmName

    # Use native PowerShell Cmdlet to execute a script block on the remote virtual machine
    Invoke-Command -ConnectionUri $uri.ToString() -Credential $credential -ScriptBlock `
    {
        $logLabel = $((get-date).ToString("yyyyMMddHHmmss"))
        $logPath = "$env:TEMP\init-webservervm_webserver_install_log_$logLabel.txt"
        Import-Module -Name ServerManager
        Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature -IncludeManagementTools -LogPath $logPath
    }
}
#endregion

Benjamin

Blog Post by: Benjamin GUINEBERTIERE