ansible playbook 执行完成后启动 systemd 服务

ansible playbook 执行完成后启动 systemd 服务

我们每次启动时都会运行 ansible playbook,它会在主机上执行一系列检查和配置任务。我们还有一些需要在该主机上运行的 systemd 服务。如何让这些服务依赖于 ansible playbook 的完成?我希望这些服务仅在我的 ansible playbook 执行完成后运行。在 systemd 中是否有任何直接的方法来建立这种依赖关系,或者我应该在 ansible 完成后在路径上写入一些文件并将其用作我的 systemd 服务文件中的检查?如果您有更好的方法,请告诉我。

答案1

为您想要在脚本之后启动的服务的单元定义创建插件。

插件是覆盖原始单元定义中的指令的文件。它们属于具有架构的目录/etc/systemd/system/<servicename>.service.d

举一个具体的例子,我们使用 apache。

首先,您需要找出After=单元定义的当前行。您可以通过运行以下命令找到单元定义systemctl status

$ systemctl status apache2
* apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)

现在让我们看一下/lib/systemd/system/apache2.service

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

After=行就是我们想要修改的。

接下来我们为插入文件创建一个目录(您可以使用自动创建该目录sudo systemctl edit apache2.service,但我想让您了解它是如何工作的):

sudo mkdir /etc/systemd/system/apache2.service.d

您可以在目录中放置一个或多个文件。

sudo vi /etc/systemd/system/apache2.service.d/10-after-ansible.conf

这个文件只包含我们想要覆盖的行:

[Unit]
After=network.target remote-fs.target nss-lookup.target my-ansible-script.service

保存文件并让 systemd 重新加载服务定义:

sudo systemctl daemon-reload

从现在开始,该服务仅在运行apache2后才启动。my-ansible-script

如果需要,您可以添加Requires=同一个文件。

答案2

在我看来,在 Ansible playbook 末尾启动这些服务比尝试在 systemd 中实现更容易。我只想补充一点:

- name: start service
  service:
     name: service_name
     state: started

到剧本的结尾。Ansible 快速失败,这样当该任务到达剧本结尾时,其余任务的完成就可以确保。

答案3

如果您说剧本是通用的,您可以配置一些变量,这是一个简短的例子:

主机文件:

[t1]
host1

[t2]
host2


[t1:vars]
service=chronyd

[t2:vars]
service=ntpd


[t:children]
t1
t2

- hosts: t在剧本的结尾,你将其与 进行对比:

- name: start specific
  service:
    name: "{{ service }}"
    state: started

相关内容