Use systemd cookbook to configure cron dropin
authorTom Hughes <tom@compton.nu>
Thu, 8 Aug 2019 18:04:05 +0000 (19:04 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 8 Aug 2019 18:09:53 +0000 (19:09 +0100)
cookbooks/systemd/resources/service.rb
cookbooks/systemd/templates/default/service.erb
cookbooks/tools/metadata.rb
cookbooks/tools/recipes/default.rb
cookbooks/tools/templates/default/cron.service.erb [deleted file]

index c2d125b..b01f678 100644 (file)
 default_action :create
 
 property :service, String, :name_property => true
-property :description, String, :required => true
+property :dropin, String
+property :description, String
 property :after, [String, Array]
 property :wants, [String, Array]
-property :type, String,
-         :default => "simple",
-         :is => %w[simple forking oneshot dbus notify idle]
+property :type, String, :is => %w[simple forking oneshot dbus notify idle]
 property :limit_nofile, Integer
 property :limit_as, [Integer, String]
 property :limit_cpu, [Integer, String]
@@ -38,7 +37,7 @@ property :user, String
 property :group, String
 property :working_directory, String
 property :exec_start_pre, String
-property :exec_start, String, :required => true
+property :exec_start, String
 property :exec_start_post, String
 property :exec_stop, String
 property :exec_reload, String
@@ -65,6 +64,10 @@ property :pid_file, String
 action :create do
   service_variables = new_resource.to_hash
 
+  unless new_resource.dropin
+    service_variables[:type] ||= "simple"
+  end
+
   if new_resource.environment_file.is_a?(Hash)
     template "/etc/default/#{new_resource.service}" do
       cookbook "systemd"
@@ -78,21 +81,29 @@ action :create do
     service_variables[:environment_file] = "/etc/default/#{new_resource.service}"
   end
 
-  template "/etc/systemd/system/#{new_resource.service}.service" do
+  if new_resource.dropin
+    directory dropin_directory do
+      owner "root"
+      group "root"
+      mode 0o755
+    end
+  end
+
+  template config_name do
     cookbook "systemd"
     source "service.erb"
     owner "root"
     group "root"
     mode 0o644
     variables service_variables
+    notifies :run, "execute[systemctl-reload]"
   end
 
-  execute "systemctl-reload-#{new_resource.service}.service" do
+  execute "systemctl-reload" do
     action :nothing
     command "systemctl daemon-reload"
     user "root"
     group "root"
-    subscribes :run, "template[/etc/systemd/system/#{new_resource.service}.service]"
   end
 end
 
@@ -102,15 +113,29 @@ action :delete do
     only_if { new_resource.environment_file.is_a?(Hash) }
   end
 
-  file "/etc/systemd/system/#{new_resource.service}.service" do
+  file config_name do
     action :delete
+    notifies :run, "execute[systemctl-reload]"
   end
 
-  execute "systemctl-reload-#{new_resource.service}.service" do
+  execute "systemctl-reload" do
     action :nothing
     command "systemctl daemon-reload"
     user "root"
     group "root"
-    subscribes :run, "file[/etc/systemd/system/#{new_resource.service}.service]"
+  end
+end
+
+action_class do
+  def dropin_directory
+    "/etc/systemd/system/#{new_resource.service}.service.d"
+  end
+
+  def config_name
+    if new_resource.dropin
+      "#{dropin_directory}/#{new_resource.dropin}.conf"
+    else
+      "/etc/systemd/system/#{new_resource.service}.service"
+    end
   end
 end
index 151b017..9620d1c 100644 (file)
@@ -1,7 +1,9 @@
 # DO NOT EDIT - This file is being maintained by Chef
 
 [Unit]
+<% if @description -%>
 Description=<%= @description %>
+<% end -%>
 <% if @after -%>
 After=<%= Array(@after).join(" ") %>
 <% end -%>
@@ -10,7 +12,9 @@ Wants=<%= Array(@wants).join(" ") %>
 <% end -%>
 
 [Service]
+<% if @type -%>
 Type=<%= @type %>
+<% end -%>
 <% if @limit_nofile -%>
 LimitNOFILE=<%= @limit_nofile %>
 <% end -%>
@@ -47,7 +51,9 @@ WorkingDirectory=<%= @working_directory %>
 <% if @exec_start_pre -%>
 ExecStartPre=<%= @exec_start_pre %>
 <% end -%>
+<% if @exec_start -%>
 ExecStart=<%= @exec_start %>
+<% end -%>
 <% if @exec_start_post -%>
 ExecStartPost=<%= @exec_start_post %>
 <% end -%>
@@ -102,6 +108,8 @@ TimeoutSec=<%= @timeout_sec %>
 <% if @pid_file -%>
 PIDFile=<%= @pid_file %>
 <% end -%>
+<% unless @dropin -%>
 
 [Install]
 WantedBy=multi-user.target
+<% end -%>
index 47873a6..acb65d9 100644 (file)
@@ -6,3 +6,4 @@ description       "Installs system administration tools"
 long_description  IO.read(File.join(File.dirname(__FILE__), "README.md"))
 version           "1.0.0"
 supports          "ubuntu"
+depends           "systemd"
index 5154ecd..4ab9414 100644 (file)
@@ -53,19 +53,16 @@ file "/etc/init.d/screen-cleanup" do
   action :delete
 end
 
-# Create drop in directory for cron service
-directory "/etc/systemd/system/cron.service.d" do
-  owner "root"
-  group "root"
-  mode 0o755
+# Cleanup unused file
+file "/etc/systemd/system/cron.service.d/chef.conf" do
+  action :delete
 end
 
 # Configure cron to run in the local timezone of the machine
-template "/etc/systemd/system/cron.service.d/chef.conf" do
-  source "cron.service.erb"
-  owner "root"
-  group "root"
-  mode 0o644
+systemd_service "cron-timezone" do
+  service "cron"
+  dropin "timezone"
+  environment "TZ" => node[:timezone]
   notifies :restart, "service[cron]"
   only_if { node[:timezone] }
 end
diff --git a/cookbooks/tools/templates/default/cron.service.erb b/cookbooks/tools/templates/default/cron.service.erb
deleted file mode 100644 (file)
index c659ab2..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-[Service]
-Environment=TZ=<%= node[:timezone] -%>