systemd
Ansible Role: systemd
This role provides a simple yet flexible way to manage all systemd unit files.
Features
- Create all systemd unit files.
- Create template units.
- Set all unit directives.
- Enable/Disable each unit.
- Restart units on change.
Requirements
- Ansible 2.8 or higher.
Role Variables
Available variables are listed below, along with default values (see defaults/main.yml
):
systemd_units: []
A list of dictionaries. For each unit, you must provide a name
, all other keys are listed in the syntax heading below.
systemd_units_restart_changed: yes
Whether to restart the unit on file change. You can also specify the parameter restart_changed
for each unit. Template units will always be skipped.
systemd_units_enabled: yes
Whether to enable units on boot. You can also specify the parameter enabled
for each unit. Template units will always be skipped.
Syntax
A systemd_unit
has all the parameters of the systemd module plus multiple keys ending with _section
, you can specify as many sections as you want. Each section is a dictionary of configuration directives. If no section is provided, an empty file will be created. Use this as an effective way to fully disable a unit.
- name: foo.service
scope: user
# other systemd module parameters...
Unit_section:
Description: Foo
Service_section:
ExecStart: /usr/sbin/foo-daemon
Install_section:
WantedBy: multi-user.target
The unit above will create a foo.service
file with following content:
[Unit]
Description=Foo
[Service]
ExecStart=/usr/sbin/foo-daemon
[Install]
WantedBy=multi-user.target
A directive key can be a string
, a list
or a dictionary
, each key type will be converted as follows:
ExecStart: "/usr/bin/foo-daemon"
Wants:
- [email protected]
- [email protected]
Environment:
VAR1: word1 word2
VAR2: word3
VAR3: $word 5 6
ExecStart=/usr/bin/foo-daemon
[email protected]
[email protected]
Environment="VAR1=word1 word2"
Environment="VAR2=word3"
Environment="VAR3=$word 5 6"
Convert snake_case keys to PascalCase
systemd_convert_snake_case_keys: yes
This variable allows you to write all directives in snake_case
. When enabled, this role will convert all snake_case
directives to PascalCase
, e.g. exec_start: "/usr/bin/foo-daemon"
will be converted to ExecStart=/usr/bin/foo-daemon
. If you don't like this feature you can disable it.
systemd_readable_snake_case_keys: # see defaults/main.yml
This role maintains a dictionary of readable snake_case
directives. In fact, some directives are abbreviated, to write CPUShares
in snake case, you have to write c_p_u_shares
. Thanks to this variable, you can to write cpu_shares
.
Dependencies
None.
Example Playbook
This is a sample playbook file for creating and starting a service unit sleep.service
.
- hosts: all
become: true
vars:
systemd_units:
- name: sleep.service
Service_section:
ExecStart: /bin/sleep 300
Install_section:
WantedBy: multi-user.target
roles:
- { role: anasbouzid.systemd, tags: [systemd] }
This is a sample systemd_units
variable for creating and starting a target unit sleep.target
that instantiates 3 service templates.
systemd_units:
- name: [email protected]
Unit_section:
Description: Sleep for %i seconds
PartOf: sleep.target
Service_section:
Restart: always
ExecStart: /bin/sleep %i
Install_section:
WantedBy: multi-user.target
- name: sleep.target
Unit_section:
Wants:
- [email protected]
- [email protected]
- [email protected]
Install_section:
WantedBy: multi-user.target
The same variable can be written in snake_case
.
systemd_units:
- name: [email protected]
unit_section:
description: Sleep for %i seconds
part_of: sleep.target
service_section:
restart: always
exec_start: /bin/sleep %i
install_section:
wanted_by: multi-user.target
- name: sleep.target
unit_section:
wants:
- [email protected]
- [email protected]
- [email protected]
install_section:
wanted_by: multi-user.target
To organize your code, your may split units into categories.
systemd_services: []
systemd_targets: []
systemd_sockets: []
systemd_units: "{{ systemd_services + systemd_targets + systemd_sockets }}"
Or you may group them by functionality.
systemd_nginx_units: []
systemd_queue_units: []
systemd_php_units: []
systemd_units: "{{ systemd_nginx_units + systemd_queue_units + systemd_php_units }}"
License
MIT