当systemd服务无法启动时,如何使Ansible失败?

Gab*_*vay 5 python service daemon systemd ansible

我有一个已部署的systemd服务,希望由Ansible启动。

我的系统服务单元文件是这样的:

[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
Run Code Online (Sandbox Code Playgroud)

我正在使用,Type=simple因为这看起来像是正确的解决方案(也是此Question中的首选解决方案)。

我尝试使用Type=oneshot,以及(由初始用户使这个问题进行重复的建议这个问题),但问题是,/opt/collector/app.py脚本是一个长期运行的进程:

while True:
    t = threading.Thread(...)
    t.start()
    t.join()
    time.sleep(15)
Run Code Online (Sandbox Code Playgroud)

并且Type=oneshotAnsible将永远阻止

我的Ansible起始代码是:

- name: start Collector service
  systemd:
    name: collector
    state: started
    enabled: yes
Run Code Online (Sandbox Code Playgroud)

在目标系统上,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
....
Run Code Online (Sandbox Code Playgroud)

由于Python进程异常(使用未定义的变量),该服务失败。

但是我的Ansible剧本运行不会失败:

TASK [inventory : start Collector service] *********************************
changed: [srv01]
Run Code Online (Sandbox Code Playgroud)

我尝试systemdserviceAnsible模块一起使用,其行为是相同的。

我如何使Ansible:

  • 系统单元无法启动时失败?
  • 不会阻止和系统进入进程active running状态while True

小智 3

当我遇到同样的问题时,我偶然发现了这个问题,服务默默失败。我还发现了一份描述此问题的错误报告,经过一番研究后我找到了解决方法:

- name: start Collector service
  systemd:
    name: collector
    state: started
    enabled: yes

- name: make sure Collector service is really running
  command: systemctl is-active collector
Run Code Online (Sandbox Code Playgroud)

请注意,对于Type=simple服务,只有当服务本身在启动后立即失败时,这才会失败。