cElasticSearchDSC.schema.psm1

Configuration cElasticSearchDSC
{
    param(
        [Parameter(Mandatory = $True)]
        [ValidateSet('Present', 'Absent')] 
        [string] $Ensure,

        [Parameter(Mandatory = $True)] 
        [System.IO.FileInfo] $JRESourcePath,

        [Parameter(Mandatory = $True)] 
        [System.IO.FileInfo] $ElasticSourcePath,
        
        [Parameter(Mandatory = $True)] 
        [String] $ElasticSearchNodeName,

        [ValidateNotNullOrEmpty()] 
        [System.IO.FileInfo] $JREDestinationPath = "$Env:ProgramFiles\Java\jre8",

        [ValidateNotNullOrEmpty()] 
        [System.IO.FileInfo] $ElasticDestinationPath = "$Env:ProgramFiles\ElasticSearch",

        [ValidateNotNullOrEmpty()]
        [System.IO.FileInfo] $ElasticDataPath = "D:\data\elastic-data",

        [ValidateNotNullOrEmpty()]
        [System.IO.FileInfo] $ElasticLogPath = "D:\data\elastic-logs"
    )

    Import-DscResource -ModuleName PSDesiredStateConfiguration

    if ($Ensure -eq 'Absent')
    {
        Script UnstallElasticSearch
        {
            GetScript  = 
            {
                $instances = Get-Service "elasticsearch-service*" 
                $vals = @{ 
                    Installed = [boolean]$instances; 
                }
                return $vals
            }

            TestScript = 
            {
                $instances = Get-Service "elasticsearch-service*" 
                if ($instances)
                {
                    Write-Verbose "elasticsearch-service is already running as a service"
                }
                else
                {
                    Write-Verbose "elasticsearch-service is not running as a service"
                }
                return ![boolean]$instances
            }

            SetScript  = 
            {
                $batPath = Join-Path $Using:elasticDestinationPath "bin/elasticsearch-service.bat"

                if (!(Test-Path $batPath))
                {
                    throw "Cannot find elasticsearch-service-x64.exe at $batPath."
                }

                $env:JAVA_HOME = $using:JREDestinationPath
                if (!$env:JAVA_HOME)
                {
                    throw "Cannot find java.exe from env var JAVA_HOME path. elasticsearch-service.bat cannot remove elasticsearch service."
                }

                $process = Start-Process -FilePath $batPath -ArgumentList "remove" -PassThru -WindowStyle Hidden -Wait
                Start-Sleep -Seconds 10
                if ($process.ExitCode -ne 0)
                {
                    Write-Error "ElasticSearch Service Removal completed with errors (exit code $($process.ExitCode))"
                }
                else
                {
                    Write-Verbose "ElasticSearch Service completed successfully (exit code $($process.ExitCode))"
                }
                
            }
        }
    }

    Archive JRE
    {
        Ensure      = $Ensure
        Destination = $JREDestinationPath
        Path        = $JRESourcePath
    }

    Environment JavaHomeEnv
    {
        Ensure    = $Ensure
        Name      = "JAVA_HOME"
        Value     = $JREDestinationPath
        DependsOn = "[Archive]JRE"
    }

    Archive ElasticSearch
    {
        Ensure      = $Ensure
        Destination = $ElasticDestinationPath
        Path        = $ElasticSourcePath
    }

    #Please keep the contents attribute format as it. otherwise the config file cannot be parsed by ES.
    File ElasticConfigFile
    {
        Ensure          = $Ensure
        Type            = "File"
        DestinationPath = Join-Path "$ElasticDestinationPath" "config\elasticsearch.yml"
        Contents        = 
        "path.data: $ElasticDataPath
path.logs: $ElasticLogPath
node.name: $ElasticSearchNodeName
network.host: _site_
"

        DependsOn       = "[Archive]ElasticSearch"
        Force           = $true
    }

    File ElasticDataDirectory 
    {
        Ensure          = $Ensure
        Type            = "Directory"
        DestinationPath = $ElasticDataPath
        Force           = $true
    }

    File ElasticLogDirectory 
    {
        Ensure          = $Ensure
        Type            = "Directory"
        DestinationPath = $ElasticLogPath
        Force           = $true
    }

    if ($Ensure -eq 'Present')
    {
        Script InstallElasticSearch
        {
            DependsOn  = "[File]ElasticConfigFile", "[File]ElasticDataDirectory", "[File]ElasticLogDirectory", "[Environment]JavaHomeEnv"

            GetScript  = 
            {
                $instances = Get-Service "elasticsearch-service*" 
                $vals = @{ 
                    Installed = [boolean]$instances; 
                }
                return $vals
            }

            TestScript = 
            {
                $instances = Get-Service "elasticsearch-service*" 
                if ($instances)
                {
                    Write-Verbose "elasticsearch-service is already running as a service"
                }
                else
                {
                    Write-Verbose "elasticsearch-service is not running as a service"
                }
                return [boolean]$instances
            }

            SetScript  = 
            {
                $batPath = Join-Path $Using:elasticDestinationPath "bin/elasticsearch-service.bat"

                $process = Start-Process -FilePath $batPath -ArgumentList "install" -PassThru -WindowStyle Hidden -Wait
                if ($process.ExitCode -ne 0)
                {
                    Write-Error "ElasticSearch Service installation completed with errors (exit code $($process.ExitCode))"
                }
                else
                {
                    Write-Verbose "ElasticSearch Service installation completed successfully (exit code $($process.ExitCode))"
                }

                $start = Start-Process -FilePath $batPath -ArgumentList "start" -PassThru -WindowStyle Hidden -Wait
                if ($start.ExitCode -ne 0)
                {
                    Write-Error "ElasticSearch Service started with errors (exit code $($start.ExitCode))"
                }
                else
                {
                    Write-Verbose "ElasticSearch Service started successfully (exit code $($start.ExitCode))"
                }
            }
        }
    } 
}