盐:基于systemd的条件是否可用

gue*_*tli 1 systemd salt-stack

我想通过盐堆栈安装此文件。

# /etc/logrotate.d/foo

/home/foo/log/foo.log {
    compress
    # ...
    postrotate
      systemctl restart foo.service
    endscript
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,有些旧机器还没有安装系统。

对于那些机器,我需要以下postrotate脚本:

/etc/init.d/foo restart
Run Code Online (Sandbox Code Playgroud)

如何用盐做这件事?

我想我需要这样的东西:

postrotate
 {% if ??? %}
   /etc/init.d/foo restart
 {% else %}
   systemctl restart foo.service
 {% endif %} 
endscript
Run Code Online (Sandbox Code Playgroud)

但是如何实施???

don*_*mus 6

我们可以利用service模块来发现这一点,该模块是一个虚拟模块,最终由适用于机器的特定模块实现。

在命令行中,我们可以发现与一起使用的特定模块test.provider。这是一个例子:

$ sudo salt 'some.*' test.provider service
some.debian.8.machine:
    systemd
some.debian.7.machine:
    debian_service
some.redhat.5.machine:
    rh_service
Run Code Online (Sandbox Code Playgroud)

要在模板中发现这一点,我们可以使用:

{{ salt["test.provider"]("service") }}
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用类似:

postrotate
  {% if salt["test.provider"]("service") != "systemd" %}
   /etc/init.d/foo restart
 {% else %}
   systemctl restart foo.service
 {% endif %} 
endscript
Run Code Online (Sandbox Code Playgroud)

注意:

的可能返回值test.provider会因平台而异。从源头上看,这些似乎是当前可用的提供程序:

$ cd salt/modules && grep -l "__virtualname__ = 'service'" *.py
debian_service.py
freebsdservice.py
gentoo_service.py
launchctl.py
netbsdservice.py
openbsdrcctl.py
openbsdservice.py
rest_service.py
rh_service.py
smf.py
systemd.py
upstart.py
win_service.py
Run Code Online (Sandbox Code Playgroud)