Examples/SCDPM-MultiInstance-TP.ps1
#requires -Version 5 Configuration DPM { Import-DscResource -Module xDismFeature Import-DscResource -Module xSqlServer Import-DscResource -Module xSCDPM # Set role and instance variables $Roles = $AllNodes.Roles | Sort-Object -Unique foreach($Role in $Roles) { $Servers = @($AllNodes.Where{$_.Roles | Where-Object {$_ -eq $Role}}.NodeName) Set-Variable -Name ($Role.Replace(" ","").Replace(".","") + "s") -Value $Servers if($Servers.Count -eq 1) { Set-Variable -Name ($Role.Replace(" ","").Replace(".","")) -Value $Servers[0] if( $Role.Contains("Database") -or $Role.Contains("Datawarehouse") -or $Role.Contains("Reporting") -or $Role.Contains("Analysis") -or $Role.Contains("Integration") ) { $Instance = $AllNodes.Where{$_.NodeName -eq $Servers[0]}.SQLServers.Where{$_.Roles | Where-Object {$_ -eq $Role}}.InstanceName Set-Variable -Name ($Role.Replace(" ","").Replace(".","").Replace("Server","Instance")) -Value $Instance } } } Node $AllNodes.NodeName { # Set LCM to reboot if needed since there are several reboots during DPM install LocalConfigurationManager { DebugMode = $true RebootNodeIfNeeded = $true } # Install .NET Framework 3.5 on SQL nodes if( ($SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer -eq $Node.NodeName) -or ($SystemCenterTechnicalPreviewDataProtectionManagerServers | Where-Object {$_ -eq $Node.NodeName}) -or ($SQLServer2014ManagementTools | Where-Object {$_ -eq $Node.NodeName}) ) { WindowsFeature "NET-Framework-Core" { Ensure = "Present" Name = "NET-Framework-Core" Source = $Node.SourcePath + "\WindowsServer.TP\sources\sxs" } } # Install SQL Instances if(($SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer -eq $Node.NodeName)) { foreach($SQLServer in $Node.SQLServers) { $SQLInstanceName = $SQLServer.InstanceName $Features = "SQLENGINE,RS" xSqlServerSetup ($Node.NodeName + $SQLInstanceName) { DependsOn = "[WindowsFeature]NET-Framework-Core" SourcePath = $Node.SourcePath SourceFolder = "SQLServer2014.en" SetupCredential = $Node.InstallerServiceAccount InstanceName = $SQLInstanceName Features = $Features SQLSysAdminAccounts = $Node.AdminAccount SQLSvcAccount = $Node.LocalSystemAccount AgtSvcAccount = $Node.LocalSystemAccount RSSvcAccount = $Node.LocalSystemAccount } xSqlServerFirewall ($Node.NodeName + $SQLInstanceName) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName + $SQLInstanceName) SourcePath = $Node.SourcePath SourceFolder = "SQLServer2014.en" InstanceName = $SQLInstanceName Features = $Features } # Set SSRS secure connection level on database node xSQLServerRSSecureConnectionLevel ($Node.NodeName + $SQLInstanceName) { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName + $SQLInstanceName) InstanceName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseInstance SecureConnectionLevel = 0 SQLAdminCredential = $Node.InstallerServiceAccount } } } # Install SQL Management Tools if( ($SystemCenterTechnicalPreviewDataProtectionManagerServers | Where-Object {$_ -eq $Node.NodeName}) -or ($SQLServer2014ManagementTools | Where-Object {$_ -eq $Node.NodeName}) ) { xSqlServerSetup "SQLMT" { DependsOn = "[WindowsFeature]NET-Framework-Core" SourcePath = $Node.SourcePath SourceFolder = "SQLServer2014.en" SetupCredential = $Node.InstallerServiceAccount InstanceName = "NULL" Features = "SSMS,ADV_SSMS" } } # Install DPM database support on database server if it is seperate from the DPM server if(($Node.NodeName -eq $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer) -and (!($SystemCenterTechnicalPreviewDataProtectionManagerServers | Where-Object {$_ -eq $Node.NodeName}))) { xSCDPMDatabaseServerSetup "DPMDB" { DependsOn = ("[xSqlServerSetup]" + $Node.NodeName + $SQLInstanceName) Ensure = "Present" SourcePath = $Node.SourcePath SourceFolder = "\SystemCenter.TP\DataProtectionManager" SetupCredential = $Node.InstallerServiceAccount } } # DPM servers if ($SystemCenterTechnicalPreviewDataProtectionManagerServers | Where-Object {$_ -eq $Node.NodeName}) { # Install Single Instance Storage xDismFeature "SIS-Limited" { Ensure = "Present" Name = "SIS-Limited" } if($Node.NodeName -ne $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer) { xSCDPMDatabaseServerSetup "DPMDB" { Ensure = "Absent" SourcePath = $Node.SourcePath SourceFolder = "\SystemCenter.TP\DataProtectionManager" SetupCredential = $Node.InstallerServiceAccount } } # Wait for DPM database server install, firewall, and config WaitForAll "DPMDB" { NodeName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer ResourceName = ("[xSqlServerSetup]" + $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer + $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseInstance) Credential = $Node.InstallerServiceAccount RetryIntervalSec = 5 RetryCount = 720 } WaitForAll "DPMFW" { NodeName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer ResourceName = ("[xSqlServerFirewall]" + $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer + $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseInstance) Credential = $Node.InstallerServiceAccount RetryIntervalSec = 5 RetryCount = 720 } WaitForAll "DPMRS" { NodeName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer ResourceName = ("[xSQLServerRSSecureConnectionLevel]" + $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer + $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseInstance) Credential = $Node.InstallerServiceAccount RetryIntervalSec = 5 RetryCount = 720 } # Wait for all DPM servers before this one $DPMDependsOn = @( "[WindowsFeature]NET-Framework-Core", "[xSCDPMDatabaseServerSetup]DPMDB" "[xDismFeature]SIS-Limited", "[WaitForAll]DPMDB", "[WaitForAll]DPMFW", "[WaitForAll]DPMRS" ) $DPMServers = @() $ThisDPMServer = $false foreach($DPMServer in $SystemCenterTechnicalPreviewDataProtectionManagerServers) { if(!($ThisDPMServer) -and ($Node.NodeName -ne $DPMServer)) { $DPMServers += $DPMServer } else { $ThisDPMServer = $true } } if($DPMServers) { WaitForAll "DPM" { NodeName = $DPMServers ResourceName = "[xSCDPMServerSetup]DPM" Credential = $Node.InstallerServiceAccount RetryIntervalSec = 5 RetryCount = 720 } $DPMDependsOn += @("[WaitForAll]DPM") } xSCDPMServerSetup "DPM" { DependsOn = $DPMDependsOn Ensure = "Present" SourcePath = $Node.SourcePath SourceFolder = "\SystemCenter.TP\DataProtectionManager" SetupCredential = $Node.InstallerServiceAccount YukonMachineName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer YukonInstanceName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseInstance ReportingMachineName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseServer ReportingInstanceName = $SystemCenterTechnicalPreviewDataProtectionManagerDatabaseInstance YukonMachineCredential = $Node.InstallerServiceAccount ReportingMachineCredential = $Node.InstallerServiceAccount } } } } $SecurePassword = ConvertTo-SecureString -String "Pass@word1" -AsPlainText -Force $InstallerServiceAccount = New-Object System.Management.Automation.PSCredential ("CONTOSO\!Installer", $SecurePassword) $LocalSystemAccount = New-Object System.Management.Automation.PSCredential ("SYSTEM", $SecurePassword) $ConfigurationData = @{ AllNodes = @( @{ NodeName = "*" SourcePath = "\\RD01\Installer" InstallerServiceAccount = $InstallerServiceAccount LocalSystemAccount = $LocalSystemAccount PSDscAllowPlainTextPassword = $true AdminAccount = "CONTOSO\Administrator" } @{ NodeName = "DPMDB.contoso.com" Roles = @("System Center Technical Preview Data Protection Manager Database Server") SQLServers = @( @{ Roles = @("System Center Technical Preview Data Protection Manager Database Server") InstanceName = "MSSQLSERVER" } ) } @{ NodeName = "DPM01.contoso.com" Roles = @("System Center Technical Preview Data Protection Manager Server") } @{ NodeName = "DPM02.contoso.com" Roles = @("System Center Technical Preview Data Protection Manager Server") } @{ NodeName = "DPM03.contoso.com" Roles = @("System Center Technical Preview Data Protection Manager Server") } @{ NodeName = "RD01.contoso.com" Roles = @( "System Center Technical Preview Data Protection Manager Console", "SQL Server 2014 Management Tools" ) } ) } foreach($Node in $ConfigurationData.AllNodes) { if($Node.NodeName -ne "*") { Start-Process -FilePath "robocopy.exe" -ArgumentList ("`"C:\Program Files\WindowsPowerShell\Modules`" `"\\" + $Node.NodeName + "\c$\Program Files\WindowsPowerShell\Modules`" /e /purge /xf") -NoNewWindow -Wait } } DPM -ConfigurationData $ConfigurationData Set-DscLocalConfigurationManager -Path .\DPM -Verbose Start-DscConfiguration -Path .\DPM -Verbose -Wait -Force |