231 lines
8.5 KiB
Ruby
231 lines
8.5 KiB
Ruby
unified_mode true
|
|
# this is what helps the various resources find each other
|
|
property :instance_name, String
|
|
|
|
# If you override one of these, you should probably override them all
|
|
property :path_home, String, default: '/usr/share/elasticsearch'
|
|
property :path_conf, String, default: '/etc/elasticsearch'
|
|
property :path_data, [String, Array], default: '/var/lib/elasticsearch'
|
|
property :path_logs, String, default: '/var/log/elasticsearch'
|
|
property :path_pid, String, default: '/var/run/elasticsearch'
|
|
property :path_plugins, String, default: '/usr/share/elasticsearch/plugins'
|
|
property :path_bin, String, default: '/usr/share/elasticsearch/bin'
|
|
|
|
property :template_elasticsearch_env, String, default: 'elasticsearch.in.sh.erb'
|
|
property :cookbook_elasticsearch_env, String, default: 'elasticsearch'
|
|
|
|
property :template_jvm_options, String, default: 'jvm_options.erb'
|
|
property :cookbook_jvm_options, String, default: 'elasticsearch'
|
|
|
|
property :template_elasticsearch_yml, String, default: 'elasticsearch.yml.erb'
|
|
property :cookbook_elasticsearch_yml, String, default: 'elasticsearch'
|
|
|
|
property :template_log4j2_properties, String, default: 'log4j2.properties.erb'
|
|
property :cookbook_log4j2_properties, String, default: 'elasticsearch'
|
|
|
|
property :logging, Hash, default: {}.freeze
|
|
property :java_home, String
|
|
|
|
# other settings in /etc/default or /etc/sysconfig
|
|
property :memlock_limit, String, default: 'unlimited'
|
|
property :max_map_count, String, default: '262144'
|
|
property :nofile_limit, String, default: '65535'
|
|
property :startup_sleep_seconds, [String, Integer], default: 5
|
|
property :restart_on_upgrade, [true, false], default: false
|
|
|
|
# Calculations for this are done in the provider, as we can't do them in the
|
|
# resource definition. default is 50% of RAM or 31GB, which ever is smaller.
|
|
property :allocated_memory, String
|
|
|
|
property :jvm_options, Array, default:
|
|
%w(
|
|
8-13:-XX:+UseConcMarkSweepGC
|
|
8-13:-XX:CMSInitiatingOccupancyFraction=75
|
|
8-13:-XX:+UseCMSInitiatingOccupancyOnly
|
|
14-:-XX:+UseG1GC
|
|
-Djava.io.tmpdir=${ES_TMPDIR}
|
|
-XX:+HeapDumpOnOutOfMemoryError
|
|
9-:-XX:+ExitOnOutOfMemoryError
|
|
-XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log
|
|
8:-XX:+PrintGCDetails
|
|
8:-XX:+PrintGCDateStamps
|
|
8:-XX:+PrintTenuringDistribution
|
|
8:-XX:+PrintGCApplicationStoppedTime
|
|
8:-Xloggc:/var/log/elasticsearch/gc.log
|
|
8:-XX:+UseGCLogFileRotation
|
|
8:-XX:NumberOfGCLogFiles=32
|
|
8:-XX:GCLogFileSize=64m
|
|
9-:-Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m
|
|
).freeze
|
|
|
|
# These are the default settings. Most of the time, you want to override
|
|
# the `configuration` attribute below. If you do override the defaults, you
|
|
# must supply ALL needed defaults, and don't use nil as a value in the hash.
|
|
property :default_configuration, Hash, default: {
|
|
'cluster.name' => 'elasticsearch',
|
|
'node.name' => Chef::Config[:node_name],
|
|
}
|
|
|
|
# These settings are merged with the `default_configuration` attribute,
|
|
# allowing you to override and set specific settings. Unless you intend to
|
|
# wipe out all default settings, your configuration items should go here.
|
|
#
|
|
property :configuration, Hash, default: {}
|
|
|
|
include ElasticsearchCookbook::Helpers
|
|
|
|
action :manage do
|
|
# lookup existing ES resources
|
|
es_user = find_es_resource(Chef.run_context, :elasticsearch_user, new_resource)
|
|
es_svc = find_es_resource(Chef.run_context, :elasticsearch_service, new_resource)
|
|
es_install = find_es_resource(Chef.run_context, :elasticsearch_install, new_resource)
|
|
|
|
default_configuration = new_resource.default_configuration.dup
|
|
# if a subdir parameter is missing but dir is set, infer the subdir name
|
|
# then go and be sure it's also set in the YML hash if it wasn't given there
|
|
if new_resource.path_data && default_configuration['path.data'].nil?
|
|
default_configuration['path.data'] = new_resource.path_data
|
|
end
|
|
|
|
if new_resource.path_logs && default_configuration['path.logs'].nil?
|
|
default_configuration['path.logs'] = new_resource.path_logs
|
|
end
|
|
|
|
# Calculation for memory allocation; 50% or 31g, whatever is smaller
|
|
#
|
|
unless new_resource.allocated_memory
|
|
half = ((node['memory']['total'].to_i * 0.5).floor / 1024)
|
|
malloc_str = (half > 30_500 ? '30500m' : "#{half}m")
|
|
new_resource.allocated_memory malloc_str
|
|
end
|
|
|
|
# Create ES directories
|
|
#
|
|
[new_resource.path_conf, "#{new_resource.path_conf}/scripts"].each do |path|
|
|
directory path do
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
end
|
|
|
|
directory new_resource.path_logs do
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
|
|
if new_resource.path_data.is_a?(String)
|
|
directory new_resource.path_data do
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
else
|
|
new_resource.path_data.each do |path|
|
|
directory path.strip do
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0750'
|
|
recursive true
|
|
action :create
|
|
end
|
|
end
|
|
end
|
|
|
|
# Create elasticsearch shell variables file
|
|
#
|
|
# Valid values in /etc/sysconfig/elasticsearch or /etc/default/elasticsearch
|
|
# ES_HOME JAVA_HOME ES_PATH_CONF DATA_DIR LOG_DIR PID_DIR ES_JAVA_OPTS
|
|
# RESTART_ON_UPGRADE ES_USER ES_GROUP ES_STARTUP_SLEEP_TIME MAX_OPEN_FILES
|
|
# MAX_LOCKED_MEMORY MAX_MAP_COUNT
|
|
#
|
|
# We provide these values as resource attributes/parameters directly
|
|
params = {}
|
|
params[:ES_HOME] = new_resource.path_home
|
|
params[:JAVA_HOME] = new_resource.java_home
|
|
params[:ES_PATH_CONF] = new_resource.path_conf
|
|
params[:DATA_DIR] = new_resource.path_data
|
|
params[:LOG_DIR] = new_resource.path_logs
|
|
params[:PID_DIR] = new_resource.path_pid
|
|
params[:RESTART_ON_UPGRADE] = new_resource.restart_on_upgrade
|
|
params[:ES_USER] = es_user.username if es_install.type == 'tarball'
|
|
params[:ES_GROUP] = es_user.groupname if es_install.type == 'tarball'
|
|
params[:ES_STARTUP_SLEEP_TIME] = new_resource.startup_sleep_seconds.to_s
|
|
params[:MAX_OPEN_FILES] = new_resource.nofile_limit
|
|
params[:MAX_LOCKED_MEMORY] = new_resource.memlock_limit
|
|
params[:MAX_MAP_COUNT] = new_resource.max_map_count
|
|
|
|
default_config_name = es_svc.service_name || es_svc.instance_name || new_resource.instance_name || 'elasticsearch'
|
|
|
|
with_run_context :root do
|
|
template "elasticsearch.in.sh-#{default_config_name}" do
|
|
path platform_family?('rhel', 'amazon') ? "/etc/sysconfig/#{default_config_name}" : "/etc/default/#{default_config_name}"
|
|
source new_resource.template_elasticsearch_env
|
|
cookbook new_resource.cookbook_elasticsearch_env
|
|
mode '0644'
|
|
variables(params: params)
|
|
action :create
|
|
end
|
|
end
|
|
|
|
template "jvm_options-#{default_config_name}" do
|
|
path "#{new_resource.path_conf}/jvm.options"
|
|
source new_resource.template_jvm_options
|
|
cookbook new_resource.cookbook_jvm_options
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0644'
|
|
variables(jvm_options: [
|
|
"-Xms#{new_resource.allocated_memory}",
|
|
"-Xmx#{new_resource.allocated_memory}",
|
|
new_resource.jvm_options,
|
|
].flatten.join("\n"))
|
|
action :create
|
|
end
|
|
|
|
template "log4j2_properties-#{default_config_name}" do
|
|
path "#{new_resource.path_conf}/log4j2.properties"
|
|
source new_resource.template_log4j2_properties
|
|
cookbook new_resource.cookbook_log4j2_properties
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0640'
|
|
variables(logging: new_resource.logging)
|
|
action :create
|
|
end
|
|
|
|
# Create ES elasticsearch.yml file
|
|
#
|
|
merged_configuration = default_configuration.merge(new_resource.configuration.dup)
|
|
|
|
# Warn if someone is using symbols. We don't support.
|
|
found_symbols = merged_configuration.keys.select { |s| s.is_a?(Symbol) }
|
|
unless found_symbols.empty?
|
|
Chef::Log.warn("Please change the following to strings in order to work with this Elasticsearch cookbook: #{found_symbols.join(',')}")
|
|
end
|
|
|
|
# workaround for https://github.com/sous-chefs/elasticsearch/issues/590
|
|
config_vars = ElasticsearchCookbook::HashAndMashBlender.new(merged_configuration).to_hash
|
|
|
|
with_run_context :root do
|
|
template "elasticsearch.yml-#{default_config_name}" do
|
|
path "#{new_resource.path_conf}/elasticsearch.yml"
|
|
source new_resource.template_elasticsearch_yml
|
|
cookbook new_resource.cookbook_elasticsearch_yml
|
|
owner es_user.username
|
|
group es_user.groupname
|
|
mode '0640'
|
|
helpers(ElasticsearchCookbook::Helpers)
|
|
variables(config: config_vars)
|
|
action :create
|
|
end
|
|
end
|
|
end
|