diff --git a/library/service b/library/service index 14b231a2ef9..58d20d3cc53 100644 --- a/library/service +++ b/library/service @@ -369,10 +369,20 @@ class LinuxService(Service): elif location.get('systemctl', None): # verify service is managed by systemd - rc, out, err = self.execute_command("%s --all" % (location['systemctl'])) - look_for = "%s.service" % self.name - if look_for in out: - self.enable_cmd = location['systemctl'] + rc, out, err = self.execute_command("%s list-unit-files" % (location['systemctl'])) + + # adjust the service name to account for template service unit files + index = self.name.find('@') + if index == -1: + name = self.name + else: + name = self.name[:index+1] + + look_for = "%s.service" % name + for line in out.splitlines(): + if line.startswith(look_for): + self.enable_cmd = location['systemctl'] + break # Locate a tool for runtime service management (start, stop etc.) self.svc_cmd = '' @@ -473,10 +483,15 @@ class LinuxService(Service): return if self.enable_cmd.endswith("systemctl"): - (rc, out, err) = self.execute_command("%s is-enabled %s.service" % (self.enable_cmd, self.name)) - if self.enable and rc == 0: - return - elif not self.enable and rc == 1: + (rc, out, err) = self.execute_command("%s show %s.service" % (self.enable_cmd, self.name)) + + d = dict(line.split('=', 1) for line in out.splitlines()) + if "UnitFileState" in d: + if self.enable and d["UnitFileState"] == "enabled": + return + elif not self.enable and d["UnitFileState"] == "disabled": + return + elif not self.enable: return # we change argument depending on real binary used @@ -499,7 +514,7 @@ class LinuxService(Service): self.changed = True - if self.module.check_mode and changed: + if self.module.check_mode and self.changed: self.module.exit_json(changed=True) return self.execute_command("%s %s %s" % args)