diff -r a2342f26c9de -r b0b56e0f8c7f dev/provisioning/modules/elasticsearch/manifests/instance.pp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dev/provisioning/modules/elasticsearch/manifests/instance.pp Fri Jan 15 15:35:00 2016 +0100 @@ -0,0 +1,317 @@ +# == 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 +# +# [*init_defaults_file*] +# Defaults file as puppet resource +# +# === 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, + $init_defaults_file = 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', + recurse => true, + 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], + } + + file { "${instance_configdir}/scripts": + ensure => 'link', + target => "${elasticsearch::params::homedir}/scripts", + } + + # build up new config + $instance_conf = merge($main_config, $instance_node_name, $instance_config, $instance_datadir_config) + + # defaults file content + # ensure user did not provide both init_defaults and init_defaults_file + if (($init_defaults != undef) and ($init_defaults_file != undef)) { + fail ('Only one of $init_defaults and $init_defaults_file should be defined') + } + + 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 + + datacat_fragment { "main_config_${name}": + target => "${instance_configdir}/elasticsearch.yml", + data => $instance_conf, + } + + datacat { "${instance_configdir}/elasticsearch.yml": + template => "${module_name}/etc/elasticsearch/elasticsearch.yml.erb", + notify => $notify_service, + require => Class['elasticsearch::package'], + owner => $elasticsearch::elasticsearch_user, + group => $elasticsearch::elasticsearch_group, + } + + $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_defaults_file => $init_defaults_file, + init_template => "${module_name}/etc/init.d/${elasticsearch::params::init_template}", + require => $require_service, + before => $before_service, + } + +}