(UPDATE 2: there’s also a systemd module now, which should provide a neater wrapper round these commands. Explicit daemon-reload is still required)
(UPDATE: there is now a PR open to add this functionality)
We recently migrated to Debian 8 which, by default, uses systemd. I can appreciate why some people have misgivings about it, but from my point of view it’s been a massive improvement.
Our unit files look like this now:
[Service] ExecStart=/var/www/{{ app_name }}/app.js Restart=always StandardOutput=syslog StandardError=syslog SyslogIdentifier={{ app_name }} User={{ app_name }} Group={{ app_name }} Environment=NODE_ENV={{ env }} WorkingDirectory=/var/www/{{ app_name }} [Install] WantedBy=multi-user.target
Compared to a 3 page init script, using start-stop-daemon. And we no longer need a watchdog like monit.
We do our deployments using ansible, which already knows how to play nice with systemd. One thing missing though, is that if you change a unit file you need to call systemctl daemon-reload before the changes will be picked up.
There’s a discussion underway as to whether ansible should take care of it. But for now, the easiest thing to do is add another handler:
- name: Install unit file sudo: true copy: src=foo.service dest=/lib/systemd/system/ owner=root mode=644 notify: - reload systemd - restart foo
with a handler like this:
- name: reload systemd sudo: yes command: systemctl daemon-reload
UPDATE: if you need to restart the service later in the same play, you can flush the handlers to ensure daemon-reload has been called:
- meta: flush_handlers
Since v2.2 release there’s a new ‘systemd’ module with the ‘reload’ builtin: https://docs.ansible.com/ansible/systemd_module.html
yes, that’s true. although I would have preferred it if they had taken care of calling daemon-reload when necessary, rather than delegating the decision to the playbook writer:
https://github.com/ansible/ansible-modules-core/pull/3660#issuecomment-220618272
Moreover, from what I can tell, the `systemd` ansible module wouldn’t work on a non-systemd system, which makes *this* post all the more relevant.