我们每次启动时都会运行 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