Add common SystemD file for RPM/DEB package

This commit is contained in:
Tanguy Leroux 2015-04-22 16:02:20 +02:00
parent ee26ab8bb4
commit 340b7ef6ef
13 changed files with 247 additions and 68 deletions

View File

@ -51,13 +51,22 @@ Run apt-get update and the repository is ready for use. You can install it with:
sudo apt-get update && sudo apt-get install elasticsearch
--------------------------------------------------
Configure Elasticsearch to automatically start during bootup:
Configure Elasticsearch to automatically start during bootup. If your
distribution is using SysV init, then you will need to run:
[source,sh]
--------------------------------------------------
sudo update-rc.d elasticsearch defaults 95 10
--------------------------------------------------
Otherwise if your distribution is using systemd:
[source,sh]
--------------------------------------------------
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
--------------------------------------------------
[float]
=== YUM

30
pom.xml
View File

@ -43,6 +43,9 @@
<packaging.elasticsearch.log.dir>/var/log/elasticsearch</packaging.elasticsearch.log.dir>
<packaging.elasticsearch.plugins.dir>${packaging.elasticsearch.home.dir}/plugins</packaging.elasticsearch.plugins.dir>
<packaging.elasticsearch.pid.dir>/var/run/elasticsearch</packaging.elasticsearch.pid.dir>
<packaging.elasticsearch.systemd.dir>/usr/lib/systemd/system</packaging.elasticsearch.systemd.dir>
<packaging.elasticsearch.systemd.sysctl.dir>/usr/lib/sysctl.d</packaging.elasticsearch.systemd.sysctl.dir>
<packaging.elasticsearch.tmpfilesd.dir>/usr/lib/tmpfiles.d</packaging.elasticsearch.tmpfilesd.dir>
<deb.sign>false</deb.sign>
<deb.sign.method>dpkg-sig</deb.sign.method>
</properties>
@ -800,7 +803,19 @@
<!-- Adds systemd file -->
<data>
<src>${project.build.directory}/generated-packaging/deb/systemd/elasticsearch.service</src>
<dst>/usr/lib/systemd/system/elasticsearch.service</dst>
<dst>${packaging.elasticsearch.systemd.dir}/elasticsearch.service</dst>
<type>file</type>
</data>
<!-- Adds systemd/sysctl.d configuration file -->
<data>
<src>${project.build.directory}/generated-packaging/deb/systemd/sysctl/elasticsearch.conf</src>
<dst>${packaging.elasticsearch.systemd.sysctl.dir}/elasticsearch.conf</dst>
<type>file</type>
</data>
<!-- Adds systemd/tmpfiles.d configuration file -->
<data>
<src>${project.build.directory}/generated-packaging/deb/systemd/elasticsearch.conf</src>
<dst>${packaging.elasticsearch.tmpfilesd.dir}/elasticsearch.conf</dst>
<type>file</type>
</data>
<!-- Add lintian files -->
@ -978,8 +993,8 @@
</mapping>
<!-- Adds systemd file -->
<mapping>
<directory>/usr/lib/systemd/system/</directory>
<filemode>755</filemode>
<directory>${packaging.elasticsearch.systemd.dir}</directory>
<directoryIncluded>false</directoryIncluded>
<configuration>true</configuration>
<sources>
<source>
@ -990,21 +1005,22 @@
</source>
</sources>
</mapping>
<!-- Adds systemd/sysctl.d configuration file -->
<mapping>
<directory>/usr/lib/sysctl.d/</directory>
<filemode>755</filemode>
<directory>${packaging.elasticsearch.systemd.sysctl.dir}</directory>
<configuration>true</configuration>
<sources>
<source>
<location>${project.build.directory}/generated-packaging/rpm/systemd/sysctl.d</location>
<location>${project.build.directory}/generated-packaging/rpm/systemd/sysctl</location>
<includes>
<include>elasticsearch.conf</include>
</includes>
</source>
</sources>
</mapping>
<!-- Adds systemd/tmpfiles.d configuration file -->
<mapping>
<directory>/usr/lib/tmpfiles.d/</directory>
<directory>${packaging.elasticsearch.tmpfilesd.dir}</directory>
<configuration>true</configuration>
<sources>
<source>

View File

@ -0,0 +1 @@
d ${packaging.elasticsearch.pid.dir} 0755 ${packaging.elasticsearch.user} ${packaging.elasticsearch.group} - -

View File

@ -0,0 +1,50 @@
[Unit]
Description=Elasticsearch
Documentation=http://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
Environment=ES_HOME=${packaging.elasticsearch.home.dir}
Environment=CONF_DIR=${packaging.elasticsearch.conf.dir}
Environment=CONF_FILE=${packaging.elasticsearch.conf.dir}/elasticsearch.yml
Environment=DATA_DIR=${packaging.elasticsearch.data.dir}
Environment=LOG_DIR=${packaging.elasticsearch.log.dir}
Environment=PID_DIR=${packaging.elasticsearch.pid.dir}
EnvironmentFile=-${packaging.env.file}
User=${packaging.elasticsearch.user}
Group=${packaging.elasticsearch.group}
ExecStart=${packaging.elasticsearch.bin.dir}/elasticsearch \
-Des.pidfile=$PID_DIR/elasticsearch.pid \
-Des.default.path.home=$ES_HOME \
-Des.default.path.logs=$LOG_DIR \
-Des.default.path.data=$DATA_DIR \
-Des.default.config=$CONF_FILE \
-Des.default.path.conf=$CONF_DIR
# Connects standard output to /dev/null
StandardOutput=null
# Connects standard error to journal
StandardError=journal
# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=${packaging.os.max.open.files}
# Specifies the maximum number of bytes of memory that may be locked into RAM
# Set to "infinity" if you use the 'bootstrap.mlockall: true' option
# in elasticsearch.yml and 'MAX_LOCKED_MEMORY=unlimited' in ${packaging.env.file}
#LimitMEMLOCK=infinity
# Shutdown delay in seconds, before process is tried to be killed with KILL (if configured)
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${packaging.type})

View File

@ -0,0 +1 @@
vm.max_map_count=${packaging.os.max.map.count}

View File

@ -94,6 +94,9 @@ MAX_MAP_COUNT=262144
# Path to the GC log file
#ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log
# Elasticsearch PID file directory
PID_DIR="${packaging.elasticsearch.pid.dir}"
# End of variables that can be overwritten in $DEFAULT
# overwrite settings from default file
@ -102,7 +105,7 @@ if [ -f "$DEFAULT" ]; then
fi
# Define other required variables
PID_FILE=/var/run/$NAME.pid
PID_FILE="$PID_DIR/$NAME.pid"
DAEMON=$ES_HOME/bin/elasticsearch
DAEMON_OPTS="-d -p $PID_FILE --default.config=$CONF_FILE --default.path.home=$ES_HOME --default.path.logs=$LOG_DIR --default.path.data=$DATA_DIR --default.path.conf=$CONF_DIR"

View File

@ -1,30 +0,0 @@
[Unit]
Description=Starts and stops a single elasticsearch instance on this system
Documentation=http://www.elasticsearch.org
Wants=network-online.target
After=network-online.target
[Service]
Environment=CONF_FILE=${packaging.elasticsearch.conf.dir}/elasticsearch.yml
Environment=ES_HOME=${packaging.elasticsearch.home.dir}
Environment=LOG_DIR=${packaging.elasticsearch.log.dir}
Environment=DATA_DIR=${packaging.elasticsearch.data.dir}
Environment=CONF_DIR=${packaging.elasticsearch.conf.dir}
EnvironmentFile=-${packaging.env.file}
User=elasticsearch
Group=elasticsearch
ExecStart=/usr/share/elasticsearch/bin/elasticsearch \
-Des.default.config=$CONF_FILE \
-Des.default.path.home=$ES_HOME \
-Des.default.path.logs=$LOG_DIR \
-Des.default.path.data=$DATA_DIR \
-Des.default.path.conf=$CONF_DIR
# See MAX_OPEN_FILES in sysconfig
LimitNOFILE=65535
# See MAX_LOCKED_MEMORY in sysconfig, use "infinity" when MAX_LOCKED_MEMORY=unlimited and using bootstrap.mlockall: true
#LimitMEMLOCK=infinity
# Shutdown delay in seconds, before process is tried to be killed with KILL (if configured)
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target

View File

@ -41,6 +41,7 @@ LOG_DIR="${packaging.elasticsearch.log.dir}"
DATA_DIR="${packaging.elasticsearch.data.dir}"
CONF_DIR="${packaging.elasticsearch.conf.dir}"
CONF_FILE="${packaging.elasticsearch.conf.dir}/elasticsearch.yml"
PID_DIR="${packaging.elasticsearch.pid.dir}"
# Source the default env file
ES_ENV_FILE="${packaging.env.file}"
@ -50,7 +51,7 @@ fi
exec="$ES_HOME/bin/elasticsearch"
prog="elasticsearch"
pidfile=/var/run/elasticsearch/${prog}.pid
pidfile="$PID_DIR/${prog}.pid"
export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE

View File

@ -1 +0,0 @@
d /run/elasticsearch 0755 elasticsearch elasticsearch - -

View File

@ -1,25 +0,0 @@
[Unit]
Description=Starts and stops a single elasticsearch instance on this system
Documentation=http://www.elasticsearch.org
[Service]
Type=forking
Environment=CONF_FILE=${packaging.elasticsearch.conf.dir}/elasticsearch.yml
Environment=ES_HOME=${packaging.elasticsearch.home.dir}
Environment=LOG_DIR=${packaging.elasticsearch.log.dir}
Environment=DATA_DIR=${packaging.elasticsearch.data.dir}
Environment=CONF_DIR=${packaging.elasticsearch.conf.dir}
EnvironmentFile=-${packaging.env.file}
User=elasticsearch
Group=elasticsearch
PIDFile=/var/run/elasticsearch/elasticsearch.pid
ExecStart=/usr/share/elasticsearch/bin/elasticsearch -d -p /var/run/elasticsearch/elasticsearch.pid -Des.default.config=$CONF_FILE -Des.default.path.home=$ES_HOME -Des.default.path.logs=$LOG_DIR -Des.default.path.data=$DATA_DIR -Des.default.path.conf=$CONF_DIR
# See MAX_OPEN_FILES in sysconfig
LimitNOFILE=65535
# See MAX_LOCKED_MEMORY in sysconfig, use "infinity" when MAX_LOCKED_MEMORY=unlimited and using bootstrap.mlockall: true
#LimitMEMLOCK=infinity
# Shutdown delay in seconds, before process is tried to be killed with KILL (if configured)
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target

View File

@ -1 +0,0 @@
vm.max_map_count=262144

View File

@ -0,0 +1,146 @@
#!/usr/bin/env bats
# This file is used to test the elasticsearch Systemd setup.
# WARNING: This testing file must be executed as root and can
# dramatically change your system. It removes the 'elasticsearch'
# user/group and also many directories. Do not execute this file
# unless you know exactly what you are doing.
# The test case can be executed with the Bash Automated
# Testing System tool available at https://github.com/sstephenson/bats
# Thanks to Sam Stephenson!
# Licensed to Elasticsearch under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# Load test utilities
load packaging_test_utils
# Cleans everything for the 1st execution
setup() {
if [ "$BATS_TEST_NUMBER" -eq 1 ]; then
clean_before_test
fi
# Installs a package before test
if is_dpkg; then
dpkg -i elasticsearch*.deb >&2 || true
fi
if is_rpm; then
rpm -i elasticsearch*.rpm >&2 || true
fi
}
@test "[SYSTEMD] daemon reload" {
skip_not_systemd
run systemctl daemon-reload
[ "$status" -eq 0 ]
}
@test "[SYSTEMD] enable" {
skip_not_systemd
run systemctl enable elasticsearch.service
[ "$status" -eq 0 ]
run systemctl is-enabled elasticsearch.service
[ "$status" -eq 0 ]
}
@test "[SYSTEMD] start" {
skip_not_systemd
run systemctl start elasticsearch.service
[ "$status" -eq 0 ]
wait_for_elasticsearch_status
assert_file_exist "/var/run/elasticsearch/elasticsearch.pid"
}
@test "[SYSTEMD] start (running)" {
skip_not_systemd
run systemctl start elasticsearch.service
[ "$status" -eq 0 ]
}
@test "[SYSTEMD] is active (running)" {
skip_not_systemd
run systemctl is-active elasticsearch.service
[ "$status" -eq 0 ]
[ "$output" = "active" ]
}
@test "[SYSTEMD] status (running)" {
skip_not_systemd
run systemctl status elasticsearch.service
[ "$status" -eq 0 ]
}
##################################
# Check that Elasticsearch is working
##################################
@test "[SYSTEMD] test elasticsearch" {
skip_not_systemd
run_elasticsearch_tests
}
@test "[SYSTEMD] restart" {
skip_not_systemd
run systemctl restart elasticsearch.service
[ "$status" -eq 0 ]
wait_for_elasticsearch_status
run service elasticsearch status
[ "$status" -eq 0 ]
}
@test "[SYSTEMD] stop (running)" {
skip_not_systemd
run systemctl stop elasticsearch.service
[ "$status" -eq 0 ]
run systemctl status elasticsearch.service
echo "$output" | grep "Active:" | grep "inactive"
}
@test "[SYSTEMD] stop (stopped)" {
skip_not_systemd
run systemctl stop elasticsearch.service
[ "$status" -eq 0 ]
run systemctl status elasticsearch.service
echo "$output" | grep "Active:" | grep "inactive"
}
@test "[SYSTEMD] status (stopped)" {
skip_not_systemd
run systemctl status elasticsearch.service
echo "$output" | grep "Active:" | grep "inactive"
}

View File

@ -217,6 +217,12 @@ verify_package_installation() {
# License file
assert_file "/usr/share/elasticsearch/LICENSE.txt" f root 644
fi
if is_systemd; then
assert_file "/usr/lib/systemd/system/elasticsearch.service" f root 644
assert_file "/usr/lib/tmpfiles.d/elasticsearch.conf" f root 644
assert_file "/usr/lib/sysctl.d/elasticsearch.conf" f root 644
fi
}
@ -294,7 +300,10 @@ clean_before_test() {
"/etc/sysconfig/elasticsearch" \
"/var/run/elasticsearch" \
"/usr/share/doc/elasticsearch" \
"/tmp/elasticsearch")
"/tmp/elasticsearch" \
"/usr/lib/systemd/system/elasticsearch.conf" \
"/usr/lib/tmpfiles.d/elasticsearch.conf" \
"/usr/lib/sysctl.d/elasticsearch.conf")
if [ "$ES_CLEAN_BEFORE_TEST" = "true" ]; then
# Kills all processes of user elasticsearch