blob: 60a771926222aa64945ab1f9c02e4f157f53b39c [file] [log] [blame]
Sean Dague5edae542017-03-21 20:50:24 -04001===========================
2 Using Systemd in DevStack
3===========================
4
Sean Dague8b8441f2017-05-02 06:14:11 -04005By default DevStack is run with all the services as systemd unit
Sean Dague5edae542017-03-21 20:50:24 -04006files. Systemd is now the default init system for nearly every Linux
7distro, and systemd encodes and solves many of the problems related to
8poorly running processes.
9
10Why this instead of screen?
11===========================
12
13The screen model for DevStack was invented when the number of services
14that a DevStack user was going to run was typically < 10. This made
15screen hot keys to jump around very easy. However, the landscape has
16changed (not all services are stoppable in screen as some are under
17Apache, there are typically at least 20 items)
18
19There is also a common developer workflow of changing code in more
20than one service, and needing to restart a bunch of services for that
21to take effect.
22
Sean Dague5edae542017-03-21 20:50:24 -040023Unit Structure
24==============
25
26.. note::
27
28 Originally we actually wanted to do this as user units, however
29 there are issues with running this under non interactive
30 shells. For now, we'll be running as system units. Some user unit
31 code is left in place in case we can switch back later.
32
33All DevStack user units are created as a part of the DevStack slice
Sean Dague8b8441f2017-05-02 06:14:11 -040034given the name ``devstack@$servicename.service``. This makes it easy
35to understand which services are part of the devstack run, and lets us
36disable / stop them in a single command.
Sean Dague5edae542017-03-21 20:50:24 -040037
38Manipulating Units
39==================
40
41Assuming the unit ``n-cpu`` to make the examples more clear.
42
43Enable a unit (allows it to be started)::
44
45 sudo systemctl enable devstack@n-cpu.service
46
47Disable a unit::
48
49 sudo systemctl disable devstack@n-cpu.service
50
51Start a unit::
52
53 sudo systemctl start devstack@n-cpu.service
54
55Stop a unit::
56
57 sudo systemctl stop devstack@n-cpu.service
58
59Restart a unit::
60
61 sudo systemctl restart devstack@n-cpu.service
62
63See status of a unit::
64
65 sudo systemctl status devstack@n-cpu.service
66
Sean Daguedef07b22017-03-30 07:18:49 -040067Operating on more than one unit at a time
68-----------------------------------------
69
70Systemd supports wildcarding for unit operations. To restart every
71service in devstack you can do that following::
72
73 sudo systemctl restart devstack@*
74
75Or to see the status of all Nova processes you can do::
76
77 sudo systemctl status devstack@n-*
78
79We'll eventually make the unit names a bit more meaningful so that
80it's easier to understand what you are restarting.
Sean Dague5edae542017-03-21 20:50:24 -040081
Sean Dague8b8441f2017-05-02 06:14:11 -040082.. _journalctl-examples:
83
Sean Dague5edae542017-03-21 20:50:24 -040084Querying Logs
85=============
86
87One of the other major things that comes with systemd is journald, a
88consolidated way to access logs (including querying through structured
89metadata). This is accessed by the user via ``journalctl`` command.
90
91
92Logs can be accessed through ``journalctl``. journalctl has powerful
93query facilities. We'll start with some common options.
94
95Follow logs for a specific service::
96
97 journalctl -f --unit devstack@n-cpu.service
98
99Following logs for multiple services simultaneously::
100
Sean Daguedef07b22017-03-30 07:18:49 -0400101 journalctl -f --unit devstack@n-cpu.service --unit
Sean Dague5edae542017-03-21 20:50:24 -0400102 devstack@n-cond.service
103
Sean Daguedef07b22017-03-30 07:18:49 -0400104or you can even do wild cards to follow all the nova services::
105
106 journalctl -f --unit devstack@n-*
107
Sean Dague5edae542017-03-21 20:50:24 -0400108Use higher precision time stamps::
109
110 journalctl -f -o short-precise --unit devstack@n-cpu.service
111
Eric Fried8cd310d2017-05-16 13:52:03 -0500112By default, journalctl strips out "unprintable" characters, including
113ASCII color codes. To keep the color codes (which can be interpreted by
114an appropriate terminal/pager - e.g. ``less``, the default)::
115
116 journalctl -a --unit devstack@n-cpu.service
117
118When outputting to the terminal using the default pager, long lines
119appear to be truncated, but horizontal scrolling is supported via the
120left/right arrow keys.
121
122See ``man 1 journalctl`` for more.
Sean Dague5edae542017-03-21 20:50:24 -0400123
124Known Issues
125============
126
127Be careful about systemd python libraries. There are 3 of them on
128pypi, and they are all very different. They unfortunately all install
129into the ``systemd`` namespace, which can cause some issues.
130
131- ``systemd-python`` - this is the upstream maintained library, it has
Sean Dague8b8441f2017-05-02 06:14:11 -0400132 a version number like systemd itself (currently ``234``). This is
Sean Dague5edae542017-03-21 20:50:24 -0400133 the one you want.
134- ``systemd`` - a python 3 only library, not what you want.
135- ``python-systemd`` - another library you don't want. Installing it
136 on a system will break ansible's ability to run.
137
138
139If we were using user units, the ``[Service]`` - ``Group=`` parameter
140doesn't seem to work with user units, even though the documentation
141says that it should. This means that we will need to do an explicit
142``/usr/bin/sg``. This has the downside of making the SYSLOG_IDENTIFIER
143be ``sg``. We can explicitly set that with ``SyslogIdentifier=``, but
144it's really unfortunate that we're going to need this work
145around. This is currently not a problem because we're only using
146system units.
147
148Future Work
149===========
150
Sean Dague5edae542017-03-21 20:50:24 -0400151user units
152----------
153
154It would be great if we could do services as user units, so that there
155is a clear separation of code being run as not root, to ensure running
156as root never accidentally gets baked in as an assumption to
157services. However, user units interact poorly with devstack-gate and
158the way that commands are run as users with ansible and su.
159
160Maybe someday we can figure that out.
161
162References
163==========
164
165- Arch Linux Wiki - https://wiki.archlinux.org/index.php/Systemd/User
166- Python interface to journald -
167 https://www.freedesktop.org/software/systemd/python-systemd/journal.html
168- Systemd documentation on service files -
169 https://www.freedesktop.org/software/systemd/man/systemd.service.html
170- Systemd documentation on exec (can be used to impact service runs) -
171 https://www.freedesktop.org/software/systemd/man/systemd.exec.html