Sample automation script | exemple de script d’automatisation

27-MAY-2013 Update: A much more complete set of scripts has just been released last Friday. Please refer to https://blogs.msdn.com/b/windowsazure/archive/2013/05/24/automating-sharepoint-deployments-in-windows-azure-using-powershell.aspx Mise à jour du 27 MAI 2013: Un ensemble de scripts beaucoup plus complets est sorti vendredi dernier. Voir https://blogs.msdn.com/b/windowsazure/archive/2013/05/24/automating-sharepoint-deployments-in-windows-azure-using-powershell.aspx
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éation de machines virtuelles dans Windows Azure destinées à 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

 

 

In order to stop and remove the VMs and their associated Azure disks and VHD, you can use the following script (with care!) de façon à arrêter et supprimer tout (VMs, disques Azure associés et VHD), vous pouvez utiliser (avec précautions!) le script suivant

 

 #region init
Import-Module azure

$subscription = 'My Azure subscription'
Set-AzureSubscription -SubscriptionName $subscription -CurrentStorageAccount 'mystockageazure'
Set-AzureSubscription -DefaultSubscription $subscription

$cloudSvcName = 'confsharepointc05'
#endregion

#region shutdown and delete
echo 'will shut down and remove the following'
#$vms = Get-AzureVM -ServiceName $cloudSvcName | where { ($_.name -NotMatch 'SLB') } 
$vms = Get-AzureVM -ServiceName $cloudSvcName 
echo $vms | select name

$AzureDisks = @()

foreach ($vm in $vms)
{
    foreach($d in $vm | Get-AzureOSDisk)
    {
        $AzureDisks += ,$d
    }
    foreach($d in $vm | Get-AzureDataDisk)
    {
        $AzureDisks += ,$d
    }
}

echo 'will remove the following Azure Disks'
foreach($d in $AzureDisks)
{
    echo $d.DiskName
}

$vms | Stop-AzureVM
$vms | Remove-AzureVM

Start-Sleep -Seconds 30

foreach($d in $AzureDisks)
{
    Remove-AzureDisk -DiskName $d.DiskName -DeleteVHD
}
#endregion

 

Smile

Benjamin