From a985edc791653bd6d1114e8080409f63b5ec00ea Mon Sep 17 00:00:00 2001 From: Cosmin Lehene Date: Tue, 19 Aug 2014 17:58:13 -0700 Subject: [PATCH 1/6] Systemd service units for RHEL/CENTOS 7+ --- manifests/common.pp | 26 +++++++++++++++++++++ manifests/master.pp | 6 +++++ manifests/service.pp | 16 +++++++++++++ templates/service/systemd/mesos.service.erb | 25 ++++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 manifests/common.pp create mode 100644 templates/service/systemd/mesos.service.erb diff --git a/manifests/common.pp b/manifests/common.pp new file mode 100644 index 0000000..c4c3a33 --- /dev/null +++ b/manifests/common.pp @@ -0,0 +1,26 @@ +# == Define: common::mkdir_p +# +# Provide `mkdir -p` functionality for a directory +# +# Idea is to use this mkdir_p in conjunction with a file resource +# +# Example usage: +# +# common::mkdir_p { '/some/dir/structure': } +# +# file { '/some/dir/structure': +# ensure => directory, +# require => Common::Mkdir_p['/some/dir/structure'], +# } +# +define mesos::common::mkdir_p () { + + validate_absolute_path($name) + + exec { "mkdir_p-${name}": + creates => "${name}", + command => "mkdir -p ${name}", + unless => "test -d ${name}", + path => '/bin:/usr/bin', + } +} diff --git a/manifests/master.pp b/manifests/master.pp index 9bc7146..7870537 100644 --- a/manifests/master.pp +++ b/manifests/master.pp @@ -95,6 +95,12 @@ ensure => directory, owner => $owner, group => $group, + } + + # TODO this duplicated in master / slave. move up + common::mkdir_p { $conf_dir: } -> + file { $conf_dir: + ensure => directory, recurse => true, purge => true, force => true, diff --git a/manifests/service.pp b/manifests/service.pp index 7d6cfc7..ecd8519 100644 --- a/manifests/service.pp +++ b/manifests/service.pp @@ -15,8 +15,24 @@ $manage = true, ) { + if $::osfamily == 'RedHat' and $::operatingsystemmajrelease >= 7 { + notice("Installing mesos-${name} service") + file { "/etc/systemd/system/mesos-${name}.service": + path => "/etc/systemd/system/mesos-${name}.service", + content => template('mesos/service/systemd/mesos.service.erb'), + backup => false, + ensure => file, + owner => $owner, + group => $group, + mode => 755 + }->Exec["systemd_reload_${name}"] include ::mesos + exec { "systemd_reload_${name}": + command => '/bin/systemctl daemon-reload', + } + } + $zk = $mesos::zk if $manage { if $enable { $ensure_service = 'running' diff --git a/templates/service/systemd/mesos.service.erb b/templates/service/systemd/mesos.service.erb new file mode 100644 index 0000000..489335f --- /dev/null +++ b/templates/service/systemd/mesos.service.erb @@ -0,0 +1,25 @@ +[Unit] +Description=Mesos <%= @name %> +After=network.target +Wants=network.target + +[Service] +Delegate=yes +ExecStart=/usr/sbin/mesos-<%= @name %> <% if @name=='slave' -%>-containerizers=docker,mesos<% end -%> + +EnvironmentFile=/etc/default/mesos-<%= @name %> +ExecReload=/bin/kill -HUP $MAINPID +User=root +Restart=always +; TODO check if 16K is enough +LimitNOFILE=16384 + +<% if @name=='slave' -%> +Slice=mesos +CPUAccounting=true +CPUShares=1024 +MemoryAccounting=true +<% end -%> + +[Install] +WantedBy=multi-user.target From 1c8b406ca0dd27fefbfdfd9182e1bc06a71086d0 Mon Sep 17 00:00:00 2001 From: Cosmin Lehene Date: Sat, 26 Mar 2016 15:57:54 -0700 Subject: [PATCH 2/6] Refactor config: removed owner/group duplication by setting global File class settings --- manifests/config.pp | 13 +++++-------- manifests/master.pp | 16 +++++----------- manifests/slave.pp | 17 +++++------------ 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/manifests/config.pp b/manifests/config.pp index 2224ec3..b6e3987 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -26,25 +26,24 @@ ){ validate_bool($manage_zk_file) + File { + owner => $owner, + group => $group, + } + if $log_dir { file { $log_dir: ensure => directory, - owner => $owner, - group => $group, } } file { $conf_dir: ensure => directory, - owner => $owner, - group => $group, } file { $conf_file: ensure => 'present', content => template('mesos/default.erb'), - owner => $owner, - group => $group, mode => '0644', require => Package['mesos'], } @@ -57,8 +56,6 @@ false => present, }, content => $zookeeper_url, - owner => $owner, - group => $group, } } diff --git a/manifests/master.pp b/manifests/master.pp index 7870537..c4e10e5 100644 --- a/manifests/master.pp +++ b/manifests/master.pp @@ -91,12 +91,15 @@ $zookeeper_url = zookeeper_servers_url($zookeeper, $zk_path, $zk_default_port) } - file { $conf_dir: - ensure => directory, + File { owner => $owner, group => $group, } + file { $conf_dir: + ensure => directory, + } + # TODO this duplicated in master / slave. move up common::mkdir_p { $conf_dir: } -> file { $conf_dir: @@ -109,23 +112,17 @@ file { $work_dir: ensure => directory, - owner => $owner, - group => $group, } file { $acls_file: ensure => $acls_ensure, content => $acls_content, - owner => $owner, - group => $group, mode => '0444', } file { $credentials_file: ensure => $credentials_ensure, content => $credentials_content, - owner => $owner, - group => $group, mode => '0400', } @@ -151,10 +148,7 @@ ) file { $conf_file: - ensure => present, content => template('mesos/master.erb'), - owner => $owner, - group => $group, mode => '0644', require => [File[$conf_dir], Package['mesos']], } diff --git a/manifests/slave.pp b/manifests/slave.pp index 15fd620..4d0b04b 100644 --- a/manifests/slave.pp +++ b/manifests/slave.pp @@ -99,10 +99,13 @@ $zookeeper_url = zookeeper_servers_url($zookeeper, $zk_path, $zk_default_port) } - file { $conf_dir: - ensure => directory, + File { owner => $owner, group => $group, + } + + file { $conf_dir: + ensure => directory, recurse => true, purge => true, force => true, @@ -110,8 +113,6 @@ file { "${conf_dir}/resources": ensure => directory, - owner => $owner, - group => $group, require => File[$conf_dir], recurse => true, purge => true, @@ -119,8 +120,6 @@ file { "${conf_dir}/attributes": ensure => directory, - owner => $owner, - group => $group, require => File[$conf_dir], recurse => true, purge => true, @@ -176,15 +175,11 @@ file { $work_dir: ensure => directory, - owner => $owner, - group => $group, } file { $credentials_file: ensure => $credentials_ensure, content => $credentials_content, - owner => $owner, - group => $group, mode => '0400', } @@ -221,8 +216,6 @@ file { $conf_file: ensure => 'present', content => template('mesos/slave.erb'), - owner => $owner, - group => $group, mode => '0644', require => [Class['mesos::config'], File[$conf_dir], Package['mesos']], } From 826c02cbb736a97c30f8eff0149fd41d5215fa44 Mon Sep 17 00:00:00 2001 From: Cosmin Lehene Date: Sat, 26 Mar 2016 16:19:13 -0700 Subject: [PATCH 3/6] Changed $work_dir defaults to /var/lib/mesos/{master, slave} Ensure the directories are created with mkdir -p --- manifests/master.pp | 6 +++++- manifests/slave.pp | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/manifests/master.pp b/manifests/master.pp index c4e10e5..4bf8153 100644 --- a/manifests/master.pp +++ b/manifests/master.pp @@ -23,7 +23,7 @@ $enable = true, $cluster = 'mesos', $conf_dir = '/etc/mesos-master', - $work_dir = '/var/lib/mesos', # registrar directory, since 0.19 + $work_dir = '/var/lib/mesos/master', # registrar directory, since 0.19 $conf_file = '/etc/default/mesos-master', $acls_file = '/etc/mesos/acls', $credentials_file = '/etc/mesos/master-credentials', @@ -96,6 +96,8 @@ group => $group, } + # TODO this duplicated in master / slave. move up + common::mkdir_p { $work_dir: } -> file { $conf_dir: ensure => directory, } @@ -110,6 +112,8 @@ require => Class['::mesos::install'], } + # TODO this duplicated in master / slave. move up + common::mkdir_p { $work_dir: } -> file { $work_dir: ensure => directory, } diff --git a/manifests/slave.pp b/manifests/slave.pp index 4d0b04b..11baf80 100644 --- a/manifests/slave.pp +++ b/manifests/slave.pp @@ -51,7 +51,7 @@ class mesos::slave ( $enable = true, $port = 5051, - $work_dir = '/tmp/mesos', + $work_dir = '/var/lib/mesos/slave', $checkpoint = false, $isolation = '', $conf_dir = '/etc/mesos-slave', @@ -104,6 +104,7 @@ group => $group, } + common::mkdir_p { $conf_dir: } -> file { $conf_dir: ensure => directory, recurse => true, @@ -173,6 +174,7 @@ notify => Service['mesos-slave'], } + common::mkdir_p { $work_dir: } -> file { $work_dir: ensure => directory, } From a943007358ea06789f5d2eea108610054430f0f5 Mon Sep 17 00:00:00 2001 From: Cosmin Lehene Date: Sat, 26 Mar 2016 15:43:14 -0700 Subject: [PATCH 4/6] Added master.pp $quorum variable --- manifests/master.pp | 1 + templates/master.erb | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/manifests/master.pp b/manifests/master.pp index 4bf8153..3cba86a 100644 --- a/manifests/master.pp +++ b/manifests/master.pp @@ -41,6 +41,7 @@ $credentials = [], $syslog_logger = true, $force_provider = undef, #temporary workaround for starting services + $quorum = $mesos::quorum, $use_hiera = $mesos::use_hiera, $single_role = $mesos::single_role, ) inherits mesos { diff --git a/templates/master.erb b/templates/master.erb index 4ca2997..549c00b 100644 --- a/templates/master.erb +++ b/templates/master.erb @@ -14,6 +14,12 @@ # ZooKeeper URL (used for leader election amongst masters) export MESOS_ZK="<%= @zookeeper_url %>" +# The size of the quorum of replicas when using 'replicated_log' based +# registry. It is imperative to set this value to be a majority of +# masters i.e., quorum > (number of masters)/2. + +QUORUM=<%= @quorum %> + # Human readable name for the cluster, displayed in the webui export MESOS_CLUSTER="<%= @cluster %>" From 0a904090ebef393595c4be03129ad3c9c97aa2b5 Mon Sep 17 00:00:00 2001 From: Cosmin Lehene Date: Fri, 23 Jan 2015 14:44:41 -0800 Subject: [PATCH 5/6] =?UTF-8?q?Expire=20yum=20cache=20when=20setting=20the?= =?UTF-8?q?=20repo=E2=80=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifests/repo.pp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/manifests/repo.pp b/manifests/repo.pp index 1673bf6..4caa930 100644 --- a/manifests/repo.pp +++ b/manifests/repo.pp @@ -57,6 +57,11 @@ } case $osrel { '6', '7': { + exec { 'yum-clean-expire-cache': + user => 'root', + path => '/usr/bin', + command => 'yum clean expire-cache', + } -> package { 'mesosphere-el-repo': ensure => present, provider => 'rpm', From d70b90d7d2ece532a24577dae6e7b2f302eeeea5 Mon Sep 17 00:00:00 2001 From: Cosmin Lehene Date: Wed, 1 Apr 2015 17:38:53 -0700 Subject: [PATCH 6/6] Changed templates to set `MESOS_` env vars This may cause conflicts, but it's better than relying on Mesosphere script that all it seems to do is to replace these with MESOS prefixed vars anyway. --- manifests/slave.pp | 1 + templates/master.erb | 37 ++++++++++++------------------------- templates/slave.erb | 34 +++++++++++++++++++++++++++------- 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/manifests/slave.pp b/manifests/slave.pp index 11baf80..8a6a33a 100644 --- a/manifests/slave.pp +++ b/manifests/slave.pp @@ -75,6 +75,7 @@ $secret = undef, $syslog_logger = true, $force_provider = undef, #temporary workaround for starting services + $containerizers = "docker,mesos", $use_hiera = $mesos::use_hiera, $single_role = $mesos::single_role, ) inherits mesos { diff --git a/templates/master.erb b/templates/master.erb index 549c00b..11a039f 100644 --- a/templates/master.erb +++ b/templates/master.erb @@ -1,4 +1,3 @@ -#!/bin/sh # Managed by Puppet # # A list of the available options can be seen by running `mesos-master --help`. Each @@ -11,30 +10,18 @@ # Configuration values are searched for first in the environment, thus values set # in here precede those loaded from /etc/mesos-master (passed as command line arguments). -# ZooKeeper URL (used for leader election amongst masters) -export MESOS_ZK="<%= @zookeeper_url %>" +MESOS_WORK_DIR="<%= @work_dir %>" +MESOS_ZK="<%= @zookeeper %>" +MESOS_QUORUM=<%= @quorum %> +<% if @listen_address && @listen_address != "" %> +MESOS_IP="<%= @listen_address %>" +<% end %> +MESOS_PORT=<%= @master_port %> +MESOS_CLUSTER="<%= @cluster %>" +MESOS_LOG_DIR="<%= @log_dir %>" +MESOS_LOGBUFSECS=1 +MESOS_LOGGING_LEVEL="INFO" -# The size of the quorum of replicas when using 'replicated_log' based -# registry. It is imperative to set this value to be a majority of -# masters i.e., quorum > (number of masters)/2. - -QUORUM=<%= @quorum %> - -# Human readable name for the cluster, displayed in the webui -export MESOS_CLUSTER="<%= @cluster %>" - -# IP address to listen on (in case that you start master -# on this node, it will bind to this address) -<% if @listen_address -%> -export MESOS_IP="<%= @listen_address %>" -<% else -%> -#export MESOS_IP="" -<% end -%> - -# Port to listen on (default: 5050) -export MESOS_PORT=<%= @master_port %> - -# master environment variables <% @env_var.sort.each do |key,val| -%> -export <%= key %>="<%= val %>" +<%= key %>="<%= val %>" <% end if @env_var -%> diff --git a/templates/slave.erb b/templates/slave.erb index 9982a3d..e31c24c 100644 --- a/templates/slave.erb +++ b/templates/slave.erb @@ -15,26 +15,46 @@ # If zookeeper URL is not specified, slaves will connect directly # to specified master (not a fault-tolerant mode) <% if !@zookeeper_url.nil? && !@zookeeper_url.empty? -%> -export MESOS_MASTER="<%= @zookeeper_url %>" +MESOS_MASTER="<%= @zookeeper_url %>" <% else -%> -export MESOS_MASTER="<%= @master %>:<%= @master_port %>" +MESOS_MASTER="<%= @master %>:<%= @master_port %>" <% end -%> # public slave's ip, must be unique in mesos cluster <% if @listen_address -%> -export MESOS_IP="<%= @listen_address %>" +MESOS_IP="<%= @listen_address %>" <% else -%> -#export MESOS_IP="" +#MESOS_IP="" <% end -%> # Port to listen on (default: 5051) -export MESOS_PORT=<%= @port %> +MESOS_PORT=<%= @port %> <% @cgroups.sort.each do |key, val| -%> -export MESOS_CGROUPS_<%= key.upcase %>="<%= val %>" +MESOS_CGROUPS_<%= key.upcase %>="<%= val %>" <% end if @isolation == 'cgroups' -%> + +MESOS_isolation='cgroups/cpu,cgroups/mem' +MESOS_cgroups_root='system.slice/mesos-slave.service' +MESOS_cgroups_hierarchy=/sys/fs/cgroup +MESOS_slave_subsystems=cpu,memory +MESOS_gc_delay=1days + +MESOS_executor_registration_timeout=5mins + +<% if @listen_address && @listen_address != "" %> +MESOS_ip="<%= @listen_address %>" +<% end %> +MESOS_port=<%= @port %> +MESOS_log_dir="<%= @log_dir %>" +MESOS_logbufsecs=1 +MESOS_logging_level="INFO" +#TODO(clehene) note that we're also passing -containerizers to mesos-slave as this doesn't seem to be working +MESOS_containerizers=<%= @containerizers %> +MESOS_hadoop_home=$HADOOP_HOME + # slave environment variables <% @env_var.sort.each do |key,val| -%> -export <%= key %>="<%= val %>" +<%= key %>="<%= val %>" <% end if @env_var -%>