# == Define: elasticsearch::instance # # This define allows you to create or remove an elasticsearch instance # # === Parameters # # [*ensure*] # String. Controls if the managed resources shall be present or # absent. If set to absent: # * The managed software packages are being uninstalled. # * Any traces of the packages will be purged as good as possible. This may # include existing configuration files. The exact behavior is provider # dependent. Q.v.: # * Puppet type reference: {package, "purgeable"}[http://j.mp/xbxmNP] # * {Puppet's package provider source code}[http://j.mp/wtVCaL] # * System modifications (if any) will be reverted as good as possible # (e.g. removal of created users, services, changed log settings, ...). # * This is thus destructive and should be used with care. # Defaults to present. # # [*status*] # String to define the status of the service. Possible values: # * enabled: Service is running and will be started at boot time. # * disabled: Service is stopped and will not be started at boot # time. # * running: Service is running but will not be started at boot time. # You can use this to start a service on the first Puppet run instead of # the system startup. # * unmanaged: Service will not be started at boot time and Puppet # does not care whether the service is running or not. For example, this may # be useful if a cluster management software is used to decide when to start # the service plus assuring it is running on the desired node. # Defaults to enabled. The singular form ("service") is used for the # sake of convenience. Of course, the defined status affects all services if # more than one is managed (see service.pp to check if this is the # case). # # [*config*] # Elasticsearch configuration hash # # [*configdir*] # Path to directory containing the elasticsearch configuration. # Use this setting if your packages deviate from the norm (/etc/elasticsearch) # # [*datadir*] # Allows you to set the data directory of Elasticsearch # # [*logging_file*] # Instead of a hash you can supply a puppet:// file source for the logging.yml file # # [*logging_config*] # Hash representation of information you want in the logging.yml file # # [*logging_template*] # Use a custom logging template - just supply the reative path ie ${module}/elasticsearch/logging.yml.erb # # [*logging_level*] # Default logging level for Elasticsearch. # Defaults to: INFO # # [*init_defaults*] # Defaults file content in hash representation # # === Authors # # * Richard Pijnenburg # define elasticsearch::instance( $ensure = $elasticsearch::ensure, $status = $elasticsearch::status, $config = undef, $configdir = undef, $datadir = undef, $logging_file = undef, $logging_config = undef, $logging_template = undef, $logging_level = $elasticsearch::default_logging_level, $init_defaults = undef ) { require elasticsearch::params File { owner => $elasticsearch::elasticsearch_user, group => $elasticsearch::elasticsearch_group } Exec { path => [ '/bin', '/usr/bin', '/usr/local/bin' ], cwd => '/', } # ensure if ! ($ensure in [ 'present', 'absent' ]) { fail("\"${ensure}\" is not a valid ensure parameter value") } $notify_service = $elasticsearch::restart_on_change ? { true => Elasticsearch::Service[$name], false => undef, } # Instance config directory if ($configdir == undef) { $instance_configdir = "${elasticsearch::configdir}/${name}" } else { $instance_configdir = $configdir } if ($ensure == 'present') { # Configuration hash if ($config == undef) { $instance_config = {} } else { validate_hash($config) $instance_config = $config } if(has_key($instance_config, 'node.name')) { $instance_node_name = {} } elsif(has_key($instance_config,'node')) { if(has_key($instance_config['node'], 'name')) { $instance_node_name = {} } else { $instance_node_name = { 'node.name' => "${::hostname}-${name}" } } } else { $instance_node_name = { 'node.name' => "${::hostname}-${name}" } } # String or array for data dir(s) if ($datadir == undef) { if (is_array($elasticsearch::datadir)) { $instance_datadir = array_suffix($elasticsearch::datadir, "/${name}") } else { $instance_datadir = "${elasticsearch::datadir}/${name}" } } else { $instance_datadir = $datadir } # Logging file or hash if ($logging_file != undef) { $logging_source = $logging_file $logging_content = undef } elsif ($elasticsearch::logging_file != undef) { $logging_source = $elasticsearch::logging_file $logging_content = undef } else { if(is_hash($elasticsearch::logging_config)) { $main_logging_config = $elasticsearch::logging_config } else { $main_logging_config = { } } if(is_hash($logging_config)) { $instance_logging_config = $logging_config } else { $instance_logging_config = { } } $logging_hash = merge($elasticsearch::params::logging_defaults, $main_logging_config, $instance_logging_config) if ($logging_template != undef ) { $logging_content = template($logging_template) } elsif ($elasticsearch::logging_template != undef) { $logging_content = template($elasticsearch::logging_template) } else { $logging_content = template("${module_name}/etc/elasticsearch/logging.yml.erb") } $logging_source = undef } if ($elasticsearch::config != undef) { $main_config = $elasticsearch::config } else { $main_config = { } } if(has_key($instance_config, 'path.data')) { $instance_datadir_config = { 'path.data' => $instance_datadir } } elsif(has_key($instance_config, 'path')) { if(has_key($instance_config['path'], 'data')) { $instance_datadir_config = { 'path' => { 'data' => $instance_datadir } } } else { $instance_datadir_config = { 'path.data' => $instance_datadir } } } else { $instance_datadir_config = { 'path.data' => $instance_datadir } } if(is_array($instance_datadir)) { $dirs = join($instance_datadir, ' ') } else { $dirs = $instance_datadir } exec { "mkdir_datadir_elasticsearch_${name}": command => "mkdir -p ${dirs}", creates => $instance_datadir, require => Class['elasticsearch::package'], before => Elasticsearch::Service[$name] } file { $instance_datadir: ensure => 'directory', owner => $elasticsearch::elasticsearch_user, group => undef, mode => '0644', require => [ Exec["mkdir_datadir_elasticsearch_${name}"], Class['elasticsearch::package'] ], before => Elasticsearch::Service[$name] } exec { "mkdir_configdir_elasticsearch_${name}": command => "mkdir -p ${instance_configdir}", creates => $elasticsearch::configdir, require => Class['elasticsearch::package'], before => Elasticsearch::Service[$name] } file { $instance_configdir: ensure => 'directory', mode => '0644', purge => $elasticsearch::purge_configdir, force => $elasticsearch::purge_configdir, require => [ Exec["mkdir_configdir_elasticsearch_${name}"], Class['elasticsearch::package'] ], before => Elasticsearch::Service[$name] } file { "${instance_configdir}/logging.yml": ensure => file, content => $logging_content, source => $logging_source, mode => '0644', notify => $notify_service, require => Class['elasticsearch::package'], before => Elasticsearch::Service[$name] } # build up new config $instance_conf = merge($main_config, $instance_node_name, $instance_config, $instance_datadir_config) # defaults file content if (is_hash($elasticsearch::init_defaults)) { $global_init_defaults = $elasticsearch::init_defaults } else { $global_init_defaults = { } } $instance_init_defaults_main = { 'CONF_DIR' => $instance_configdir, 'CONF_FILE' => "${instance_configdir}/elasticsearch.yml", 'LOG_DIR' => "/var/log/elasticsearch/${name}", 'ES_HOME' => '/usr/share/elasticsearch' } if (is_hash($init_defaults)) { $instance_init_defaults = $init_defaults } else { $instance_init_defaults = { } } $init_defaults_new = merge($global_init_defaults, $instance_init_defaults_main, $instance_init_defaults ) $user = $elasticsearch::elasticsearch_user $group = $elasticsearch::elasticsearch_group file { "${instance_configdir}/elasticsearch.yml": ensure => file, content => template("${module_name}/etc/elasticsearch/elasticsearch.yml.erb"), mode => '0644', notify => $notify_service, require => Class['elasticsearch::package'] } $require_service = Class['elasticsearch::package'] $before_service = undef } else { file { $instance_configdir: ensure => 'absent', recurse => true, force => true, } $require_service = undef $before_service = File[$instance_configdir] $init_defaults_new = {} } elasticsearch::service { $name: ensure => $ensure, status => $status, init_defaults => $init_defaults_new, init_template => "${module_name}/etc/init.d/${elasticsearch::params::init_template}", require => $require_service, before => $before_service } }