I have a systemd service that I deploy and want to be started by Ansible.
My systemd service unit file is this:
[Unit]
Description=Collector service
After=network.target mariadb.service
Requires=mariadb.service
[Service]
Type=simple
ExecStart=/opt/collector/app.py
WorkingDirectory=/opt/collector
Restart=on-abort
User=root
[Install]
WantedBy=multi-user.target
I am using Type=simple
since this looks like the correct solution (also the preferred one in this Question).
I tried using Type=oneshot
as well (as suggested by the initial user making this question as duplicate of this question) but the problem is that the /opt/collector/app.py script is a long running process:
while True:
t = threading.Thread(...)
t.start()
t.join()
time.sleep(15)
and with Type=oneshot
, Ansible will block forever.
And my Ansible starting code is:
- name: start Collector service
systemd:
name: collector
state: started
enabled: yes
On the target system, systemctl
will display:
[root@srv01 /]# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
dev-sda1.device loaded activating tentative /dev/sda1
-.mount loaded active mounted /
dev-mqueue.mount loaded active mounted POSIX Message Queue File System
etc-hostname.mount loaded active mounted /etc/hostname
etc-hosts.mount loaded active mounted /etc/hosts
etc-resolv.conf.mount loaded active mounted /etc/resolv.conf
run-user-0.mount loaded active mounted /run/user/0
session-73.scope loaded active running Session 73 of user root
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
haproxy.service loaded active running HAProxy Load Balancer
<E2><97><8F> collector.service loaded failed failed Collector service
....
The service fails because of the Python process exception (using un undefined variable).
But my Ansible playbook run does not fail:
TASK [inventory : start Collector service] *********************************
changed: [srv01]
I tried with both systemd
and service
Ansible modules and the behavior is the same.
How can I make Ansible:
- fail when the systemd unit fails to start?
- not block and systemd getting in
active running
status with awhile True
process?