systemd_service role for OpenStack-Ansible

tags

openstack, systemd_service, cloud, ansible

category

*nix

This role will configure Systemd units:

Default variables

systemd_user_name: root
systemd_group_name: root
systemd_slice_name: system

# Restart services when a change occurs
systemd_service_restart_changed: yes

# This is the prefix used for all temp files of a given type.
systemd_tempd_prefix: tempd

# Give a reasonable amount of time for the server to start up/shut down
systemd_TimeoutSec: 120
systemd_Restart: on-failure
systemd_RestartSec: 2

# Accounting options
systemd_CPUAccounting: true
systemd_BlockIOAccounting: true
systemd_MemoryAccounting: true
systemd_TasksAccounting: true

# Sandboxing options
systemd_PrivateTmp: false
systemd_PrivateDevices: false
systemd_PrivateNetwork: false
systemd_PrivateUsers: false

# Start service after a given target. This is here because we want to define common
#  after targets used on most services. This can be overridden or agumented using
#  the "systemd_services" dictionary option "after_targets".
systemd_after_targets:
  - syslog.target
  - network-online.target

# List of documentation information that will be presented in the unit. This
#  option is a list of documentation items which can be local or online.
#  Usage: https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Documentation=
systemd_unit_docs: []

# Set the service enabled state. Valid options are: [yes, no]
systemd_service_enabled: yes

# Set global service overrides used within the service unit file.
systemd_service_config_overrides: {}

# Systemd service type. Options include simple, forking, oneshot, etc.
# https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
systemd_default_service_type: simple

# System run directory used for services by default.
#   Service name will be added to make a unique path.
#   This option can also be defined for specific service entries under "systemd_services".
systemd_run_dir: "/run"

# System lock directory used for services by default.
#   Service name will be added to make a unique path.
#   This option can also be defined for specific service entries under "systemd_services".
systemd_lock_dir: "/run/lock"

# Global Environment variables for system services.
#  This option will provide the operator a way to set additional environment options
#  used within the execution of a given service. Environment variables can be passed
#  into the service using ADHOC options or through a given environment file. If both
#  options are specified, and a collision occurs options will be set in the order in
#  which they are read (top to bottom) with a given file being processed last.
#
#  If the `systemd_environment_file` is defined a file will be read into the systemd service
#  unit, the contents of the file will be added to the execution environment of the service.
#
# The `systemd_environment_file` option is a string. The full path to a given file must be used.
#  systemd_environment_file: "/etc/default/default-file"
#
# The `systemd_environmen`t option is a hash. each item in the hash is expected to be a sting
# Example
#   systemd_environment:
#     VAR1: "word1 word2"
#     VAR2: "word3"
#     VAR3: "$word 5 6"
systemd_environment: {}

# Set the systemd "partof" directive. This ties a service unit to another.
# Documentation for PartOf can be found here
# https://www.freedesktop.org/software/systemd/man/systemd.unit.html#PartOf=
# systemd_partof: unit-name.service

# The systemd services dictionary is a set of services that will be created. The dictionary
#  can contain the following options:
#  `service_name` -- (required) used to define the name of the service. This is typically the name of the executable.
#  `service_type` -- (optional) Set the service type, default is "simple".
#  `execstarts` -- (required) Set the program to start, when the service is simple the list has a max length of 1.
#  `execstops` -- (optional) Set the program to stop, when the service is simple the list has a max length of 1.
#  `after_targets` -- (optional) Start the service after this list of dependency units.
#  `partof` -- (optional) Set the systemd "partof" directive. This ties a service unit to another.
#  `config_overrides` -- (optional) This allows any section or key=value pair to be set within the systemd unit file.
#  `program_sandboxing` -- (optional) Case sensitive Key=Value pairs for service Sandboxing
#  `program_accounting` -- (optional) Case sensitive Key=Value pairs for service Accounting
#  `enabled` -- (optional) Set the enabled state of the service.
#  `state` -- (optional) Set the running state of the service.
#  `environment` -- (optional) set additional environment settings, this option is a hash of strings.
#  `environment_file` -- (optional) set additional environment settings through a given file. this option is a string.
#  `dynamic_user` -- (optional) Dynamically set a UNIX user and group when the unit is started; only works if systemd >= 235.
#  `template_arguments` -- (optional) List of arguments that would be enabled/started in case service is a template.
#                          For that to work properly, service_name should end with `@`, ie `dhcpcd@`
#                          Systemd service template documentation can be found by the link:
#                          https://www.freedesktop.org/software/systemd/man/systemd.service.html#Service%20Templates
#  `state_directory` -- (optional) Relative path the state directory; only works if systemd >= 235.
#  `systemd_overrides` -- (optional) Dictionary that may contain custom structure in config_overrides format that
#                         will be used to generate systemd overrides in /etc/systemd/system/service_name.service.d/overrides.conf
#  `systemd_overrides_only` -- (optional) Boolean variable, when True no service_name.service will be generated and role
#                              will place only overrides for the existing service.
#  `systemd_run_dir` -- (optional) Run directory that will be used for service runtime. Service slice or name is added to the path
#  `systemd_lock_dir` -- (optional) Lock directory that will be used for service runtime. Service slice or name is added to the path
#  `load` -- (optional) Boolean to set if the service is loaded. Socket activated services with '@' may not need to be loaded.
#  `standard_output` -- (optional) Set the stdout of the service to go to a non default destination, such as 'socket'

# Under the service dictionary the "sockets" key can be added, which may contain list of the sockets
#  for the given service_name. Each socket in the lsit may have following structure:
#  `socket_name` -- (required) Name of created socket
#  `after_targets` -- (optional) Start the socket after this list of dependency units.
#  `before_targets` -- (optional) Start the socket before this list of dependency units.
#  `bind_targets` -- (optional) Bind the socket to this dependency unit.
#  `enabled` -- (optional) Set the enabled state of the socket.
#  `options` -- (optional) Additional options, like `ListenStream` or other. Specifying ListenStream in
#               the options will suppress the default 'Service' field in [Socket]. 
#  `state` -- (optional) Set the running state of the socket.

# Under the service dictionary the "timer" key can be added which will enable a given service
#  as a timer (Legacy cron job).
#  `options` -- (optional) This allows any section or key=value pair to be set within the systemd timer file.
#  `cron_minute` -- (optional) This allows for "on calendar configuration" (AKA CRON) for the minute segment.
#  `cron_hour` -- (optional) This allows for "on calendar configuration" (AKA CRON) for the hour segment.
#  `cron_day` -- (optional) This allows for "on calendar configuration" (AKA CRON) for the day segment.
#  `cron_weekday` -- (optional) This allows for "on calendar configuration" (AKA CRON) for the weekday segment.
#  `cron_month` -- (optional) This allows for "on calendar configuration" (AKA CRON) for the month segment.

#  Examples:
#   systemd_services:
#     - service_name: ServiceU
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - ServiceU
#           environment_file: "/etc/default/default-file"
#
#     - service_name: ServiceV
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - ServiceV
#           environment:
#             VAR1: "word1 word2"
#             VAR2: "word3"
#             VAR3: "$word 5 6"
#
#     - service_name: ServiceW
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - ServiceW
#
#     - service_name: ServiceX
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - ServiceX
#       program_sandboxing:
#         PrivateTmp: true
#       program_accounting:
#         CPUAccounting: true
#
#     - service_name: ServiceY
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - '/usr/bin/ServiceY'
#       execstarts:
#         - '/usr/bin/stopcmd'
#       restart_changed: no
#
#     - service_name: ServiceZ
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       enabled: no
#       state: stopped
#       service_type: oneshot
#       execstarts:
#         - /usr/bin/startcmd1
#         - /usr/bin/startcmd2
#       execstops
#         - /usr/bin/stopcmd1
#         - /usr/bin/stopcmd2
#       sockets:
#         - socket_name: SocketServiceZ
#           after_targets:
#             - ServiceZ.socket
#           before_targets:
#             - ServiceY.service
#           bind_targets:
#             - ServiceZ.socket
#           enabled: true
#           state: started
#           options:
#             SocketMode: 0600
#             ListenStream: /var/run/ServiceZ
#
#     - service_name: TimerServiceW
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - '/usr/bin/ServiceY'
#       restart_changed: no
#       timer:
#         state: "started"
#         options:
#           OnBootSec: 30min
#           OnUnitActiveSec: 1h
#           Persistent: true
#
#     - service_name: TimerServiceX
#       config_overrides: {}  # This is used to add in arbitratry unit file options
#       execstarts:
#         - '/usr/bin/ServiceY'
#       restart_changed: no
#       timer:
#         state: "started"
#         cron_minute: 30
#         cron_hour: 1
#
#     - service_name: ExistingService
#       config_overrides: {}
#       systemd_overrides_only: True
#       systemd_overrides:  # This is used for adjusting existing services with arbitratry options
#         Unit:
#           Wants:
#             - ServiceZ
#             - ServiceY
#       restart_changed: no
#
# Example below will result in creating 2 templated services: Templated@arg1 and Templated@arg2
#     - service_name: Templated@
#       execstarts:
#         - /tmp/script %i
#       template_arguments:
#         - arg1
#         - arg2
systemd_services: []

Example playbook

---

- name: Create a systemd unit file for ServiceX
  hosts: localhost
  become: true
  roles:
    - role: "systemd_service"
      systemd_services:
        - service_name: "test oneshot service1"
          config_overrides:
            Unit:
              Description: Test oneshot service
              After: network-online.target
              Wants: network-online.target
            Service:
              RemainAfterExit: yes
          service_type: oneshot
          execstarts:
            - "/bin/bash -c 'echo start1'"
            - "/bin/bash -c 'echo start2'"
          execstops:
            - "/bin/bash -c 'echo stop1'"
            - "/bin/bash -c 'echo stop2'"
          enabled: yes
          state: started
          systemd_tempd_prefix: openstack
          systemd_lock_path: /var/lock/networking

Tags

This role supports one tag: systemd-init.