Muehlenhoff has submitted this change and it was merged. Change subject: Provide override file for base::service_unit ......................................................................
Provide override file for base::service_unit systemd implements a two-stage lookup for unit files: /lib/systemd/system/foo.service is meant for distro-shipped units and /etc/systemd/system/foo.service takes precedence over that. base::service_unit writes puppet-generated systemd units to /lib/systemd, because the "systemctl mask" command adds a symlink to /dev/null in /etc/systemd, which fails if we have a puppet-generated unit present. We need this functionality to allow service owners to prevent services from starting without disabling puppet entirely. On the other hand, this creates a problem for packages which ship a systemd unit as part of their Debian package, but which we need to customise. In particular HHVM: It ships a native hhvm.service unit, but we're extending it heavily to apply site-specific resource limits, restart behaviour and handling of environment variables. That means that after an upgrade HHVM, is running with incorrect settings until the next Puppet run. This patch provides support for passing an override file to base::service_unit; the settings made in override files amend / extend the ones provided by the Debian package. There are some notable gotchas for override files: - Dependencies cannot be overridden - To wipe an existing setting from a vendor file, it needs to be reset in the override with a blank line, e.g ExecStart= ExecStart=/bin/foo --daemon Change-Id: I101b5f817bc429d9c252e3b4c485bb3515b006e0 --- M modules/base/lib/puppet/parser/functions/pick_initscript.rb M modules/base/manifests/service_unit.pp 2 files changed, 27 insertions(+), 6 deletions(-) Approvals: Giuseppe Lavagetto: Looks good to me, but someone else must approve Muehlenhoff: Looks good to me, approved jenkins-bot: Verified diff --git a/modules/base/lib/puppet/parser/functions/pick_initscript.rb b/modules/base/lib/puppet/parser/functions/pick_initscript.rb index b433e39..02db052 100644 --- a/modules/base/lib/puppet/parser/functions/pick_initscript.rb +++ b/modules/base/lib/puppet/parser/functions/pick_initscript.rb @@ -2,18 +2,19 @@ Puppet::Parser::Functions.newfunction(:pick_initscript, :type => :rvalue, - :arity => 6, + :arity => 7, :doc => <<-'HEREDOC' Takes as an input the init system currently installed, the available init scripts, and returns the chosen one. HEREDOC ) do |vals| - name, init_system, has_systemd, has_upstart, has_sysvinit, strict = vals + name, init_system, has_systemd, has_systemd_override, has_upstart, has_sysvinit, strict = vals has_custom = (has_systemd || has_upstart || has_sysvinit) # if we don't have custom scripts, we use the system defaults return false unless has_custom case init_system when 'systemd' + return 'systemd_override' if has_systemd_override return 'systemd' if has_systemd return 'sysvinit' if has_sysvinit return false unless strict diff --git a/modules/base/manifests/service_unit.pp b/modules/base/manifests/service_unit.pp index 1f21805..c60b8d9 100644 --- a/modules/base/manifests/service_unit.pp +++ b/modules/base/manifests/service_unit.pp @@ -26,6 +26,13 @@ # $module/initscripts/$template_name.systemd.erb for systemd (and # similarly for other init systems) # +# [*systemd_override*] +# Boolean - if enabled, make the resource use a systemd unit provided +# by a Debian package, while applying an override file with site- +# specific changes. +# You are expected to place the override file in specific subdirectory of +# the current module: $module/initscripts/$template_name.systemd_override.erb +# # [*upstart*] # As the preceding param, but for upstart scripts # @@ -67,6 +74,7 @@ define base::service_unit ( $ensure = present, $systemd = false, + $systemd_override = false, $upstart = false, $sysvinit = false, $strict = true, @@ -80,7 +88,7 @@ # Validates the service name, and picks the valid init script $initscript = pick_initscript( - $name, $::initsystem, $systemd, $upstart, $sysvinit, $strict) + $name, $::initsystem, $systemd, $systemd_override, $upstart, $sysvinit, $strict) # we assume init scripts are templated if $initscript { @@ -91,9 +99,10 @@ } $path = $initscript ? { - 'systemd' => "/lib/systemd/system/${name}.service", - 'upstart' => "/etc/init/${name}.conf", - default => "/etc/init.d/${name}" + 'systemd' => "/lib/systemd/system/${name}.service", + 'systemd_override' => "/etc/systemd/system/${name}.service.d/puppet-override.conf", + 'upstart' => "/etc/init/${name}.conf", + default => "/etc/init.d/${name}" } # systemd complains if unit files are executable @@ -103,6 +112,17 @@ $i_mode = '0544' } + + if $systemd_override { + file { "/etc/systemd/system/${name}.service.d": + ensure => directory, + owner => 'root', + group => 'root', + mode => '0555', + before => File[$path] + } + } + file { $path: ensure => $ensure, content => template($template), -- To view, visit https://gerrit.wikimedia.org/r/305635 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I101b5f817bc429d9c252e3b4c485bb3515b006e0 Gerrit-PatchSet: 6 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: Muehlenhoff <mmuhlenh...@wikimedia.org> Gerrit-Reviewer: Gehel <gleder...@wikimedia.org> Gerrit-Reviewer: Giuseppe Lavagetto <glavage...@wikimedia.org> Gerrit-Reviewer: Muehlenhoff <mmuhlenh...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits