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