Browse Source

Add common SystemD file for RPM/DEB package

Tanguy Leroux 10 years ago
parent
commit
340b7ef6ef

+ 10 - 1
docs/reference/setup/repositories.asciidoc

@@ -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
 

+ 23 - 7
pom.xml

@@ -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>

+ 1 - 0
src/packaging/common/systemd/elasticsearch.conf

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

+ 50 - 0
src/packaging/common/systemd/elasticsearch.service

@@ -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})

+ 1 - 0
src/packaging/common/systemd/sysctl/elasticsearch.conf

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

+ 4 - 1
src/packaging/deb/init.d/elasticsearch

@@ -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"
 

+ 0 - 30
src/packaging/deb/systemd/elasticsearch.service

@@ -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

+ 2 - 1
src/packaging/rpm/init.d/elasticsearch

@@ -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

+ 0 - 1
src/packaging/rpm/systemd/elasticsearch.conf

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

+ 0 - 25
src/packaging/rpm/systemd/elasticsearch.service

@@ -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

+ 0 - 1
src/packaging/rpm/systemd/sysctl.d/elasticsearch.conf

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

+ 146 - 0
src/test/resources/packaging/scripts/50_systemd.bats

@@ -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"
+}

+ 10 - 1
src/test/resources/packaging/scripts/packaging_test_utils.bash

@@ -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