Puppet Class: profile::opensearch::server

Defined in:
modules/profile/manifests/opensearch/server.pp

Overview

This class configures OpenSearch

Parameters:

  • $dc_settings: data center specific overrides for ::opensearch::instance

  • $common_settings: global overrides for ::opensearch::instance

  • $logstash_host: Host to send logs to

  • $logstash_gelf_port: Tcp port on $logstash_host to send gelf formatted logs to.

  • $logstash_logback_port: Tcp port on localhost to send structured logs to.

  • $logstash_transport: Transport mechanism for logs.

  • $rack: Rack server is in. Used for allocation awareness.

  • $row: Row server is in. Used for allocation awareness.

  • $version: version of the package to install

  • $java_home: optionally specify the JAVA_HOME path in the opensearch systemd unit.

Parameters:

  • instances (Hash[String, Opensearch::InstanceParams]) (defaults to: lookup('profile::opensearch::instances'))
  • dc_settings (Opensearch::InstanceParams) (defaults to: lookup('profile::opensearch::dc_settings'))
  • common_settings (Opensearch::InstanceParams) (defaults to: lookup('profile::opensearch::common_settings'))
  • base_data_dir (Stdlib::AbsolutePath) (defaults to: lookup('profile::opensearch::base_data_dir'))
  • logstash_host (String) (defaults to: lookup('logstash_host'))
  • logstash_gelf_port (Stdlib::Port) (defaults to: lookup('logstash_gelf_port'))
  • logstash_logback_port (Stdlib::Port) (defaults to: lookup('logstash_logback_port'))
  • logstash_transport (Enum['Gelf', 'syslog']) (defaults to: lookup('profile::opensearch::logstash_transport', { 'default_value' => 'Gelf' }))
  • rack (String) (defaults to: lookup('profile::opensearch::rack'))
  • row (String) (defaults to: lookup('profile::opensearch::row'))
  • version (Enum['1.0.0']) (defaults to: lookup('profile::opensearch::version', { 'default_value' => '1.0.0' }))
  • java_home (Optional[String]) (defaults to: lookup('profile::opensearch::java_home', { 'default_value' => undef }))


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'modules/profile/manifests/opensearch/server.pp', line 17

class profile::opensearch::server(
    Hash[String, Opensearch::InstanceParams] $instances             = lookup('profile::opensearch::instances'),
    Opensearch::InstanceParams               $dc_settings           = lookup('profile::opensearch::dc_settings'),
    Opensearch::InstanceParams               $common_settings       = lookup('profile::opensearch::common_settings'),
    Stdlib::AbsolutePath                     $base_data_dir         = lookup('profile::opensearch::base_data_dir'),
    String                                   $logstash_host         = lookup('logstash_host'),
    Stdlib::Port                             $logstash_gelf_port    = lookup('logstash_gelf_port'),
    Stdlib::Port                             $logstash_logback_port = lookup('logstash_logback_port'),
    Enum['Gelf', 'syslog']                   $logstash_transport    = lookup('profile::opensearch::logstash_transport', { 'default_value' => 'Gelf' }),
    String                                   $rack                  = lookup('profile::opensearch::rack'),
    String                                   $row                   = lookup('profile::opensearch::row'),
    Enum['1.0.0']                            $version               = lookup('profile::opensearch::version',            { 'default_value' => '1.0.0' }),
    Optional[String]                         $java_home             = lookup('profile::opensearch::java_home',          { 'default_value' => undef }),
) {

    require ::profile::java

    # Rather than asking hiera to magically merge these settings for us, we
    # explicitly take two sets of defaults for global defaults and per-dc
    # defaults. Per cluster overrides are then provided in $instances.
    $settings = $common_settings + $dc_settings

    # Sane defaults to simplify single instance configuration
    $defaults_for_single_instance = {
        http_port          => 9200,
        transport_tcp_port => 9300,
    }

    # Resolve instance configuration here, rather than in the opensearch
    # define, so we have access to final configuration, such as http ports,
    # for configuring firewalls and such.
    # Also accessed from profile::opensearch::* for firewalls, proxies, etc.
    $configured_instances = empty($instances) ? {
        true    => {
            'default' => $defaults_for_single_instance + $settings,
        },
        default => $instances.reduce({}) |$agg, $kv_pair| {
            $instance_title = $kv_pair[0]
            $instance_params = $kv_pair[1]
            $final_params = $settings + $instance_params
            $agg + [$instance_title, $final_params]
        }
    }

    # Get all unique opensearch nodes across all instances.
    # This is needed to set ferm rules for cross cluster communication
    $all_opensearch_nodes = unique($configured_instances.reduce([]) |$result, $instance_params| {
        $result + $instance_params[1]['cluster_hosts']
    })

    # filter out instances that should not be deployed on this node
    # this is used for the cirrus clusters, where multiple sub clusters are defined
    # on a subset of all nodes.
    #
    # note in filter |$instance| below, $instance is an array [ key, value ]
    # see https://puppet.com/docs/puppet/5.5/function.html#filter for details
    $filtered_instances = $configured_instances.filter |$instance| { $facts['fqdn'] in $instance[1]['cluster_hosts'] }

    # Accessed from profile::opensearch::* for firewalls, proxies, etc.
    $filtered_instances.each |$instance_title, $instance_params| {
        $transport_tcp_port = pick_default($instance_params['transport_tcp_port'], 9300)
        $opensearch_nodes_ferm = join(pick_default($all_opensearch_nodes, [$::fqdn]), ' ')

        ferm::service { "opensearch-inter-node-${transport_tcp_port}":
            proto   => 'tcp',
            port    => $transport_tcp_port,
            notrack => true,
            srange  => "@resolve((${opensearch_nodes_ferm}))",
        }

        # Let deploy this check per node/ per cluster. see T231516
        icinga::monitor::elasticsearch::old_jvm_gc_checks { $instance_params['cluster_name']: }
    }

    $major_version = split($version, '[.]')[0]
    $apt_component = "opensearch${major_version}"

    apt::repository { 'wikimedia-opensearch':
        uri        => 'http://apt.wikimedia.org/wikimedia',
        dist       => "${::lsbdistcodename}-wikimedia",
        components => "thirdparty/${apt_component}",
        before     => Class['::opensearch'],
    }

    # Originally added as part of T265113 - userland util to interact with kernel EDAC drivers
    package { 'edac-utils':
        ensure => latest,
    }

    # ensure that apt is refreshed before installing opensearch
    Exec['apt-get update'] -> Class['::opensearch']

    # Install
    class { '::opensearch':
        version               => $major_version,
        instances             => $filtered_instances,
        base_data_dir         => $base_data_dir,
        logstash_host         => $logstash_host,
        logstash_gelf_port    => $logstash_gelf_port,
        logstash_logback_port => $logstash_logback_port,
        logstash_transport    => $logstash_transport,
        rack                  => $rack,
        row                   => $row,
        java_home             => $java_home,
    }
}