A strange behavior
If you use a Saltstack minion on a Debian 8 (Jessie), you may have encountered a strange behavior when it comes to services.
As you know (of course, no one can ignore the systemd war on Debian), systemd is now the default service manager on Debian. Well, it's much more than a service manager, but the new service management is one of the most visible changes.
The problem is that some services managed by a state are always re-enabled, even if they were already enabled.
For example, with supervisor :
ID: supervisor Function: service.running Result: True Comment: Service supervisor has been enabled, and is in the desired state Started: 18:35:32.089750 Duration: 617.27 ms Changes: ---------- supervisor: True
The next run will yield the exact same result. Which is highly annoying if you run highstate on 20 nodes and need to read quickly the results. It's a noise.
But, why ?
For some reasons, Debian still support SysVinit scripts. There is a layer between systemd and Sysvinit scripts so systemd can (almost) manage daemons who don't have a systemd service file, old SysVinit scripts. When I say almost, I mean it : you can start, restart, reload, status, enable and disable a SysVinit scripted daemon via systemd cli tools. For example, with supervisor :
root@cs-qa-rbx-ovh-pcc-prev-aaa:~# systemctl status supervisor ● supervisor.service - LSB: Start/stop supervisor Loaded: loaded (/etc/init.d/supervisor) Active: active (running) since Sat 2015-05-16 01:32:28 CEST; 2 days ago Process: 7155 ExecStop=/etc/init.d/supervisor stop (code=exited, status=0/SUCCESS) Process: 7229 ExecStart=/etc/init.d/supervisor start (code=exited, status=0/SUCCESS)
There is only one missing information, that you can see on a true systemd service, like sshd :
root@lxcserver-a:~# systemctl status sshd ● ssh.service - OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled) Active: active (running) since Sun 2015-04-26 21:10:03 CEST; 3 weeks 1 days ago Main PID: 550 (sshd)
Because of that, Saltstack have no way to know if a SysVinit scripted daemon is enabled or not, so it enables it at each run.
A simple solution
With Saltstack, you can specify for each service how it will be managed, with the
provider parameter. The
debian_service will use standard SysVinit scripts to manage the service, and will fix our problem.
supervisor: pkg.installed:  service.running: - enable: True - provider: debian_service
Of course, if you have other distributions than Debian, use some Jinja magic to define a sensible provider =)
You may now enjoy your highstates runs without noise !