--- /dev/null
+# == Define: elasticsearch::instance
+#
+# This define allows you to create or remove an elasticsearch instance
+#
+# === Parameters
+#
+# [*ensure*]
+# String. Controls if the managed resources shall be <tt>present</tt> or
+# <tt>absent</tt>. If set to <tt>absent</tt>:
+# * 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 <tt>present</tt>.
+#
+# [*status*]
+# String to define the status of the service. Possible values:
+# * <tt>enabled</tt>: Service is running and will be started at boot time.
+# * <tt>disabled</tt>: Service is stopped and will not be started at boot
+# time.
+# * <tt>running</tt>: 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.
+# * <tt>unmanaged</tt>: 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 <tt>enabled</tt>. 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 <tt>service.pp</tt> 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 <mailto:richard.pijnenburg@elasticsearch.com>
+#
+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
+ }
+
+}