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

Salt: Condition based on systemd being available or not

我想通过 salt-stack 安装这个文件。

# /etc/logrotate.d/foo

/home/foo/log/foo.log {
    compress
    # ...
    postrotate
      systemctl restart foo.service
    endscript
}

不幸的是,有些旧机器还没有 systemd。

对于那些机器,我需要这个后旋转脚本:

/etc/init.d/foo restart

如何在盐中完成这项工作?

我想我需要这样的东西:

postrotate
 {% if ??? %}
   /etc/init.d/foo restart
 {% else %}
   systemctl restart foo.service
 {% endif %} 
endscript

但是如何实现???

我们可以利用 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

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

{{ salt["test.provider"]("service") }}

所以,您可以使用类似的东西:

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

注意:

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

$ 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

我只是直接调用 Salt 的 service 模块,它将根据 OS.

做正确的事情
postrotate
  salt-call service.restart foo
endscript

更 "salty" 的方法是这样的:

my_file:
  file.managed:
    - source: salt://logrotate.d/foo
    - name: /etc/logrotate.d/foo
    - watch_in:
      - service: my_foo_service

my_foo_service:
  service.running:
    - name: foo

这将为您放置文件,然后在进行任何更改后重新启动 foo 服务。