1
0
Fork 0
ansible-systemd/plugins/modules/system_service.py

213 Zeilen
7.1 KiB
Python

#!/usr/bin/python3
import pathlib
from typing import List, Union
try:
from ansible_collections.sebastian.systemd.plugins.module_utils.generic import SYSTEMD_SERVICE_CONFIG, Types
from ansible_collections.sebastian.systemd.plugins.module_utils.module import SystemdUnitModule, installable
except ImportError:
from plugins.module_utils.generic import SYSTEMD_SERVICE_CONFIG, Types
from plugins.module_utils.module import SystemdUnitModule, installable
@installable
class Module(SystemdUnitModule):
"""Creates System Services units"""
name = "system_service"
module_spec = dict(
argument_spec=dict(
name=Types.str(required=True),
user=Types.str(),
group=Types.str(),
type=Types.str(
choices=("simple", "exec", "forking", "oneshot", "dbus", "notify", "notify-reload", "idle"),
default="simple",
help="Type of the systemd service.\n"
"simple and exec start long running services that run in the same process over the whole time, exec is waiting until the process was started completly.\n"
"forking does some things in the foreground, starts an background process and then exits to leave the work to the background process.\n"
"oneshot processes are started by systemd, do their work and then exit, similar to cronjobs.\n"
"dbus services will be considered started up once they aquire the specified dbus bus"
"notify and notify-reload notify systemd about the start up via sd_notify. notify-reload needs also inform systemd on reloads and when it is ready again after an reload.\n"
"idle is similar to simple, but it can delay the start up by a few seconds.",
),
pre=Types.list(str, help="command or list of commands that are started before the main command(Types.str)"),
start=Types.list(
str,
True,
help="command or list of commands that are started as main programm. Multiple commands are only allowed in a oneshot command",
),
post=Types.list(str, help="Command or list of commands that are started after the main command(s) stopped without problems."),
),
)
def prepare(self):
self.unitfile = (SYSTEMD_SERVICE_CONFIG / self.get("name")).with_stem(".service")
if self.get("type", "simple") != "oneshot" and len(self.get("start")) > 1:
self.module.fail_json("only oneshot services are allowed to have multiple start commands", **self.result)
def service(self):
section = "[Service]\n"
if self.get("type"):
section += "Type=".format(self.get("type"))
if self.get("pre", False):
for cmd in self.get("pre"):
section += "ExecStartPre={}".format(cmd)
if self.get("start", False):
for cmd in self.get("start"):
section += "ExecStart={}".format(cmd)
if self.get("post", False):
for cmd in self.get("post"):
section += "ExecStartPost={}".format(cmd)
if self.get("user", False):
section += "User={}".format(self.get("user"))
if self.get("group", False):
section += "Group={}".format(self.get("group"))
return section
def unit(self) -> str:
if self.__unit is None:
self.__unit = "\n".join(
(
self.header(),
self.service(),
self.install(),
)
)
return self.__unit
DOCUMENTATION = """---
description:
- Creates System Services units
module: system_service
options:
after:
default: []
description:
- list of units that this unit wants to be started after this unit
elements: str
required: false
type: list
before:
default: []
description:
- list of units that this unit needs to be started before this unit.
elements: str
required: false
type: list
description:
description:
- An description for programs that access systemd
required: false
type: str
documentation:
default: []
description:
- Paths where documentation can be found
elements: str
required: false
type: list
group:
required: false
type: str
name:
required: true
type: str
partof:
default: []
description:
- list of units that this unit is part of.
- If the restart this unit does it too, but if this restarts it does not affect
the other units.
elements: str
required: false
type: list
post:
default: []
description:
- Command or list of commands that are started after the main command(s) stopped
without problems.
elements: str
required: false
type: list
pre:
default: []
description:
- command or list of commands that are started before the main command(Types.str)
elements: str
required: false
type: list
required_by:
default: []
description:
- systemd units that require this mount
elements: str
required: false
type: list
requires:
default: []
description:
- list of units that this unit requires. If it fails or can't be started this
unit fails. without before/after this is started at the same time
elements: str
required: false
type: list
start:
description:
- command or list of commands that are started as main programm. Multiple commands
are only allowed in a oneshot command
elements: str
required: true
type: list
type:
choices:
- simple
- exec
- forking
- oneshot
- dbus
- notify
- notify-reload
- idle
default: simple
description:
- Type of the systemd service.
- simple and exec start long running services that run in the same process over
the whole time, exec is waiting until the process was started completly.
- forking does some things in the foreground, starts an background process and
then exits to leave the work to the background process.
- oneshot processes are started by systemd, do their work and then exit, similar
to cronjobs.
- dbus services will be considered started up once they aquire the specified dbus
busnotify and notify-reload notify systemd about the start up via sd_notify.
notify-reload needs also inform systemd on reloads and when it is ready again
after an reload.
- idle is similar to simple, but it can delay the start up by a few seconds.
required: false
type: str
user:
required: false
type: str
wanted_by:
default: []
description:
- systemd units that want the mount, but not explicitly require it. Commonly used
for target if not service explicitly require it.
elements: str
required: false
type: list
wants:
default: []
description:
- list of units that this unit wants. If it fails or can't be started it does
not affect this unit
elements: str
required: false
type: list
short_description: Creates System Services units
"""
if __name__ == "__main__":
Module()()