解决厨师的systemd_unit资源

时间:2018-11-02 00:47:56

标签: chef systemd

chef systemd resource允许您通过content属性(采用字符串或哈希)来指定服务文件。这两种感觉都令人反感。他们的例子是:

systemd_unit 'sysstat-collect.timer' do
  content <<-EOU.gsub(/^\s+/, '')
  [Unit]
  Description=Run system activity accounting tool every 10 minutes

  [Timer]
  OnCalendar=*:00/10

  [Install]
  WantedBy=sysstat.service
  EOU

  action [:create, :enable]
end

这感觉非常错误...将我的厨师食谱与应该只是配置文件(或模板文件)混合在一起。我尝试过各种尝试,尝试将文件写入目标(使用cookbook_file),然后再读回以传递给内容,但这仍然让人感到不满意,并且到目前为止还没有奏效。

编辑以提出希望更好的问题:

是否有某种机制可以使用Chef systemd资源,以便我不会将配置文件作为字符串嵌入到配方文件本身中?

3 个答案:

答案 0 :(得分:2)

您可以使用类似template "/etc/systemd/system/#{unit_name}" do ... enddaemon-reload的通知。

答案 1 :(得分:2)

刚开始使用systemd_unit时,我的想法几乎相同,但是现在我的看法有所不同。我不将JSON,YAML或TOML配置文件保留为模板,因为它们可以从属性哈希值生成。这样可以确保它们在语法上是正确的,并且更改属性比食谱文件更灵活。单位是INI格式的文件,因此我以相同的方式对待它们。

有时候,您只需要读取一个文本文件并将其传递给资源即可。我敢肯定,这种方法可以改进,但是可以做到。

unit_temp_path = "#{Chef::Config[:file_cache_path]}/foo.service"

cookbook_file unit_temp_path do
  action :create
end

systemd_unit 'foo.service' do
  # delay reading until convergence phase
  content lazy { ::File.read(unit_temp_path) }
  action :create
end

答案 2 :(得分:0)

我不确定OP面临两个问题中的哪个:

  • 不将原始字符串放入systemd_unit
  • systemd_unit在设置非.service的广告单元时行为异常

在Chef13上的systemd_unit资源上,对于非.timer和非.service单元,我遇到了问题。具体来说,它似乎讨厌.network.netdev,这迫使我使用template_file链接到在:/

之后称为systemctl daemon-reload的东西

关于不将原始字符串放入systemd_unit中,也许以下示例可以提供帮助?

systemd_unit 'portage-sync.timer' do
  verify true
  content(
    Unit: {
      Description: 'Timer to synchronize portage tree',
    },
    Timer: {
      OnCalendar: '*-*-* 12:00:00 UTC',
      Persistent: true,
      RemainAfterElapse: true,
      Unit: 'portage-sync.service',
    },
    Install: {
      WantedBy: 'multi-user.target',
    },
  )
end