diff --git a/README.md b/README.md index 1d618190..a36f9c4f 100644 --- a/README.md +++ b/README.md @@ -259,6 +259,8 @@ systemd::network{'eth0.network': ### Services +The default target is managed via the `default_target` parameter. If this is left at its default value (`undef`), the default-target will be unmanaged by puppet. + Systemd provides multiple services. Currently you can manage `systemd-resolved`, `systemd-timesyncd`, `systemd-networkd`, `systemd-journald`, `systemd-coredump` and `systemd-logind` diff --git a/manifests/init.pp b/manifests/init.pp index 297da22a..fb962a8e 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -2,6 +2,9 @@ # # @api public # +# @param default_target +# The default systemd boot target, unmanaged if set to undef. +# # @param service_limits # May be passed a resource hash suitable for passing directly into the # ``create_resources()`` function as called on ``systemd::service_limits`` @@ -160,6 +163,7 @@ # Add --backtrace to systemd-coredump call systemd-coredump@.service unit # class systemd ( + Optional[Pattern['^.+\.target$']] $default_target = undef, Hash[String,String] $accounting = {}, Hash[String[1],Hash[String[1], Any]] $service_limits = {}, Hash[String[1],Hash[String[1], Any]] $networks = {}, @@ -210,6 +214,20 @@ ) { contain systemd::install + if $default_target { + $target = shell_escape($default_target) + service { $target: + ensure => 'running', + enable => true, + } + + exec { "systemctl set-default ${target}": + command => "systemctl set-default ${target}", + unless => "test $(systemctl get-default) = ${target}", + path => $facts['path'], + } + } + $service_limits.each |$service_limit, $service_limit_data| { systemd::service_limits { $service_limit: * => $service_limit_data, diff --git a/spec/classes/init_spec.rb b/spec/classes/init_spec.rb index 9a9726b6..aa3f83d3 100644 --- a/spec/classes/init_spec.rb +++ b/spec/classes/init_spec.rb @@ -18,6 +18,7 @@ it { is_expected.not_to create_service('systemd-timesyncd') } it { is_expected.not_to contain_package('systemd-resolved') } it { is_expected.not_to contain_class('systemd::coredump') } + it { is_expected.not_to contain_exec('systemctl set-default multi-user.target') } context 'when enabling resolved and networkd' do let(:params) do @@ -181,6 +182,17 @@ } end + context 'with alternate target' do + let(:params) do + { + default_target: 'example.target', + } + end + + it { is_expected.to contain_exec('systemctl set-default example.target') } + it { is_expected.to contain_service('example.target').with_enable(true).with_ensure('running') } + end + context 'when enabling timesyncd' do let(:params) do {