Examples/DSCFCISqlBuild.ps1

#requires -Version 5
$computers = 'OHSQL9034N1','OHSQL9034N2','OHSQL9034N3'
$OutputPath = 'F:\DSCConfig'

Configuration FCISQL
{
    Import-DscResource â€“Module PSDesiredStateConfiguration
    Import-DscResource -Module xSQLServer 
    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 RSATClusteringMgmt
       {
           Ensure = "Present"
           Name = "RSAT-Clustering-Mgmt"
       }

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

       WindowsFeature RSATClusteringCmdInterface
       {
           Ensure = "Present"
           Name   = "RSAT-Clustering-CmdInterface"
       }

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

        xSqlServerFirewall "FirewallMSSQLSERVER"
        {
            DependsOn = "[xSQLServerFailoverClusterSetup]PrepareMSSQLSERVER"
            SourcePath = $Node.SourcePath
            InstanceName = $Node.InstanceName
            Features = $Node.Features
        }

    If ($node.Role -eq "PrimaryServerNode")
    {
            xCluster "CLDBx"
            {
                DependsOn = @(
                    "[WindowsFeature]RSATClusteringMgmt",
                    "[WindowsFeature]RSATClusteringPowerShell"
                )
                Name = $Node.ClusterName
                StaticIPAddress = $Node.ClusterIPAddress
                DomainAdministratorCredential = $Node.InstallerServiceAccount
            }

            xClusterDisk "iSCSI"
            {
                Ensure = "Present"
                Number = 1

                DependsOn = "[xCluster]CLDBx"
            }
           
        }
        If ($node.Role -eq "ReplicaServerNode" )
        {
            xWaitForCluster waitForCluster 
            { 
                Name = $Node.ClusterName 
                RetryIntervalSec = 10 
                RetryCount = 20
            } 
       
            xCluster joinCluster 
            { 
                Name = $Node.ClusterName 
                StaticIPAddress = $Node.ClusterIPAddress 
                DomainAdministratorCredential = $Node.InstallerServiceAccount
            
                DependsOn = "[xWaitForCluster]waitForCluster" 
            }
        }
        If ($node.Role -eq "PrimaryServerNode")
        {
           
            WaitForAll "SqlPrep"
            {                
                NodeName = @($computers)
                ResourceName = "[xSQLServerFailoverClusterSetup]PrepareMSSQLSERVER"
                PsDscRunAsCredential = $Node.InstallerServiceAccount
                RetryIntervalSec = 5
                RetryCount = 720
            }
            xSQLServerFailoverClusterSetup "CompleteMSSQLSERVER"
            {
                Action = "Complete"
                SourcePath = $Node.SourcePath
                SetupCredential = $Node.InstallerServiceAccount
                Features = $Node.Features
                InstanceName = $Node.InstanceName
                FailoverClusterNetworkName = $Node.FailoverClusterNetworkName
                InstallSQLDataDir = "D:\"
                FailoverClusterIPAddress = "10.0.75.60"
                SQLSvcAccount = $Node.SQLServiceAccount
                SQLSysAdminAccounts = $Node.AdminAccount

                PsDscRunAsCredential = $Node.InstallerServiceAccount
                
                DependsOn = @(
                    "[WaitForAll]SqlPrep",
                    "[xClusterDisk]iSCSI"
                )
            }
        } 
    }
}

$InstallerServiceAccount = Get-Credential -UserName CORP\AutoSvc -Message "Credentials to Install SQL Server"

$firstComputer = $computers | Select-Object -First 1
$ConfigurationData = @{
    AllNodes = @(
        @{
            NodeName = "*"
            PSDscAllowPlainTextPassword = $true
            PSDscAllowDomainUser =$true
            NETPath = "\\ohdc9000\SQLAutoBuilds\SQL2014\WindowsServer2012R2\sources\sxs"
            SourcePath = "\\ohdc9000\SQLAutoBuilds\SQL2014\"
            InstallerServiceAccount = $InstallerServiceAccount
            SQLServiceAccount = $InstallerServiceAccount
            AdminAccount = "CORP\Administrator"
            ClusterName = "CLDBx6" 
            ClusterIPAddress = "10.0.75.55"
            FailoverClusterNetworkName = "CLSCDB6"
        }
        )}

        ForEach ($computer in $computers) {
        
            if($firstComputer -eq $computer)
            {
                    $ConfigurationData.AllNodes += @{
                    NodeName        = $computer
                    InstanceName    = "MSSQLSERVER"
                    Features        = "SQLENGINE"
                    Role = "PrimaryServerNode"        
                    }
            }
            else 
            {
                    $ConfigurationData.AllNodes += @{
                    NodeName        = $computer
                    InstanceName    = "MSSQLSERVER"
                    Features        = "SQLENGINE"
                    Role = "ReplicaServerNode"    
                    }
            }
           $Destination = "\\"+$computer+"\\c$\Program Files\WindowsPowerShell\Modules"
           if (Test-Path "$Destination\xFailoverCluster"){Remove-Item -Path "$Destination\xFailoverCluster" -Recurse -Force}
           if (Test-Path "$Destination\xSqlServer"){Remove-Item -Path "$Destination\xSqlServer"-Recurse -Force}
           Copy-Item 'C:\Program Files\WindowsPowerShell\Modules\xFailoverCluster' -Destination $Destination -Recurse -Force
           Copy-Item 'C:\Program Files\WindowsPowerShell\Modules\xSqlServer' -Destination $Destination -Recurse -Force
 }
        


FCISQL -ConfigurationData $ConfigurationData -OutputPath $OutputPath


Workflow StartConfigs 
{ 
    param([string[]]$computers,
        [System.string] $Path)
 
    foreach â€“parallel ($Computer in $Computers) 
    {
    
        Start-DscConfiguration -ComputerName $Computer -Path $Path -Verbose -Wait -Force
    }
}

StartConfigs -Computers $computers -Path $OutputPath