Examples/SQL-ClusterDB.ps1

<#
    .NOTES
        THIS EXAMPLE IS OBSOLETE. Due to major changes in the resource modules
        over the last several versions, this example has not been updated to reflect
        those changes.
        Please refer to the resource example folder for updated examples.
        https://github.com/PowerShell/SqlServerDsc/tree/master/Examples/Resources
 
        There is an issue open to replace this example, please see issue
        https://github.com/PowerShell/SqlServerDsc/issues/462
#>

[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingConvertToSecureStringWithPlainText", "")]
param ()

Configuration SQL
{
    Import-DscResource -Module SqlServerDSC
    Import-DscResource -Module xFailoverCluster

    Node $AllNodes.NodeName
    {
        # Set LCM to reboot if needed
        LocalConfigurationManager
        {
            DebugMode = "ForceModuleImport"
            RebootNodeIfNeeded = $true
        }

        WindowsFeature "NET-Framework-Core"
        {
            Ensure = "Present"
            Name = "NET-Framework-Core"
            Source = $Node.SourcePath + "\WindowsServer2012R2\sources\sxs"
        }

        WindowsFeature "Failover-Clustering"
        {
            Ensure = "Present"
            Name = "Failover-Clustering"
        }

        WindowsFeature "RSAT-Clustering-PowerShell"
        {
            Ensure = "Present"
            Name = "RSAT-Clustering-PowerShell"
        }

        if($Node.NodeName -eq "CLDBA.contoso.com")
        {
            xCluster "CLDBx"
            {
                DependsOn = @(
                    "[WindowsFeature]Failover-Clustering",
                    "[WindowsFeature]RSAT-Clustering-PowerShell"
                )
                Name = "CLDBx"
                StaticIPAddress = "192.168.1.251"
                DomainAdministratorCredential = $Node.InstallerServiceAccount
            }

            WaitForAll "CLDBx"
            {
                ResourceName = "[xCluster]CLDBx"
                NodeName = @(
                    "CLDBB.contoso.com",
                    "CLDBC.contoso.com",
                    "CLDBD.contoso.com"
                )
                Credential = $Node.InstallerServiceAccount
                RetryIntervalSec = 5
                RetryCount = 720
            }

            xClusterDisk "iSCSI"
            {
                DependsOn = "[WaitForAll]CLDBx"
                DiskFriendlyName = "MSFT Virtual HD SCSI Disk Device"
                DiskNumbers = ""
            }
        }
        else
        {
            WaitForAll "CLDBx"
            {
                ResourceName = "[xCluster]CLDBx"
                NodeName = "CLDBA.contoso.com"
                Credential = $Node.InstallerServiceAccount
                RetryIntervalSec = 5
                RetryCount = 720
            }

            xCluster "CLDBx"
            {
                DependsOn = "[WaitForAll]CLDBx"
                Name = "CLDBx"
                StaticIPAddress = "192.168.1.251"
                DomainAdministratorCredential = $Node.InstallerServiceAccount
            }
        }

        xSQLServerFailoverClusterSetup "PrepareMSSQLSERVER"
        {
            DependsOn = @(
                "[WindowsFeature]NET-Framework-Core",
                "[WindowsFeature]Failover-Clustering"
            )
            Action = "Prepare"
            SourcePath = $Node.SourcePath
            SetupCredential = $Node.InstallerServiceAccount
            Features = "SQLENGINE,AS,IS"
            InstanceName = "MSSQLSERVER"
            FailoverClusterNetworkName = "CLSCDB"
            SQLSvcAccount = $Node.SQLServiceAccount
        }

        SqlWindowsFirewall "FirewallMSSQLSERVER"
        {
            DependsOn = "[xSQLServerFailoverClusterSetup]PrepareMSSQLSERVER"
            SourcePath = $Node.SourcePath
            InstanceName = "MSSQLSERVER"
            Features = "SQLENGINE,AS,IS"
        }

        if($Node.NodeName -eq "CLDBA.contoso.com")
        {
            WaitForAll "Cluster"
            {
                NodeName = @(
                    "CLDBB.contoso.com",
                    "CLDBC.contoso.com",
                    "CLDBD.contoso.com"
                )
                ResourceName = "[xSQLServerFailoverClusterSetup]PrepareMSSQLSERVER"
                Credential = $Node.InstallerServiceAccount
                RetryIntervalSec = 5
                RetryCount = 720
            }

            SqlServerDSCFailoverClusterSetup "CompleteMSSQLSERVER"
            {
                DependsOn = @(
                    "[WaitForAll]Cluster",
                    "[xClusterDisk]iSCSI"
                )
                Action = "Complete"
                SourcePath = $Node.SourcePath
                SetupCredential = $Node.InstallerServiceAccount
                Features = "SQLENGINE,AS,IS"
                InstanceName = "MSSQLSERVER"
                FailoverClusterNetworkName = "CLSCDB"
                InstallSQLDataDir = "E:\"
                ASDataDir = "F:\OLAP\Data"
                ASLogDir = "F:\OLAP\Log"
                ASBackupDir = "F:\OLAP\Backup"
                ASTempDir = "F:\OLAP\Temp"
                ASConfigDir = "F:\OLAP\Config"
                ISFileSystemFolder = "E:\Pacakges"
                FailoverClusterIPAddress = "192.168.1.250"
                SQLSvcAccount = $Node.SQLServiceAccount
                SQLSysAdminAccounts = $Node.AdminAccount
                ASSysAdminAccounts = $Node.AdminAccount
            }
        }
    }
}

$DomainAdministratorCredential = Get-Credential "CONTOSO\Administrator"
$InstallerServiceAccount = Get-Credential "CONTOSO\!Installer"
$LocalSystemAccount = Get-Credential "SYSTEM"
$SQLServiceAccount = Get-Credential "CONTOSO\!sql"

$ConfigurationData = @{
    AllNodes = @(
        @{
            NodeName = "*"
            PSDscAllowPlainTextPassword = $true

            SourcePath = "\\RD01\Installer"
            DomainAdministratorCredential = $DomainAdministratorCredential
            InstallerServiceAccount = $InstallerServiceAccount
            LocalSystemAccount = $LocalSystemAccount
            SQLServiceAccount = $SQLServiceAccount
            AdminAccount = "CONTOSO\Administrator"

        }
        @{
            NodeName = "CLDBA.contoso.com"
        }
        @{
            NodeName = "CLDBB.contoso.com"
        }
        @{
            NodeName = "CLDBC.contoso.com"
        }
        @{
            NodeName = "CLDBD.contoso.com"
        }
    )
}

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
    }
}

SQL -ConfigurationData $ConfigurationData
Set-DscLocalConfigurationManager -Path .\SQL -Verbose
Start-DscConfiguration -Path .\SQL -Verbose -Wait -Force