我有一个systemd服务,我想通过Ansible启动它。
我的systemd服务单元文件如下:
[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
我正在使用Type=simple
,因为这看起来像是正确的解决方案(也是此问题中首选的解决方案)。
我也尝试使用Type=oneshot
(正如最初提出这个问题的用户所建议的将其作为这个问题的重复),但问题在于/opt/collector/app.py脚本是一个长时间运行的进程:
while True:
t = threading.Thread(...)
t.start()
t.join()
time.sleep(15)
使用Type=oneshot
参数时,Ansible会永久阻塞。
我的Ansible起始代码如下:
- name: start Collector service
systemd:
name: collector
state: started
enabled: yes
在目标系统上,
systemctl
将显示以下内容:[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
....
由于Python进程异常(使用未定义的变量),服务失败了。
但是我的Ansible剧本运行并没有失败:
TASK [inventory : start Collector service] *********************************
changed: [srv01]
我尝试了使用
systemd
和service
Ansible模块,但行为都是一样的。如何让Ansible:
- 在systemd单元启动失败时失败?
- 不阻塞并使systemd以
active running
状态运行while True过程?
oneshot
不是解决方案。 - Gabriel Petrovayoneshot
是你的解决方案,还有其他选项需要你去探索和选择。我关闭了这个问题,因为你问了一个为什么它没有返回错误的原因,而另一个答案以一种很好的方式解释了这个问题。这也不是Ansible的问题,因为systemctl start
的行为完全相同 - 所以你可以从你的问题中删除所有与Ansible相关的内容。你只剩下一个开放且过于广泛的问题“如何用Python编写一个守护进程”。 - techrafsimple
vsoneshot
systemd选项明确比较的另一个问题。对于“探索其他选项[...]”,我认为你应该指向:https://www.freedesktop.org/software/systemd/man/systemd.service.html (顺便说一下,我已经阅读过它,但仍然没有找到从Ansible运行它的解决方案)。 - Gabriel PetrovayType=simple
的描述和为什么它不会在该设置下对你有用。 ・ 所以你声称systemd
的行为与 Ansible 不同,也与其设计方式不同(请阅读其他答案),对吗?然后你认为这是“正确”的?与文档相反的行为? ・ 将“认为自己知道一切”的态度归因于想要帮助的人不仅是粗鲁的,而且还会适得其反。 - techraf