解决chef的systemd_unit资源问题

问题描述 投票:1回答:3

chef systemd resource允许您通过内容属性(采用字符串或哈希)指定服务文件。这两种感觉都像一个令人反感的坏主意;他们的例子是:

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资源,这样我就不会在配方文件本身中将配置文件嵌入为字符串?

chef systemd
3个回答
2
投票

当我第一次开始使用systemd_unit时,我的想法大致相同,但现在我以不同的方式看待它。我没有将JSON,YAML或TOML配置文件保留为模板,因为它们可以从属性哈希生成。这确保了它们在语法上是正确的,并且更改属性比使用cookbook文件更灵活。单位是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
投票

你可以使用template "/etc/systemd/system/#{unit_name}" do ... end之类的东西和daemon-reload的通知。


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
© www.soinside.com 2019 - 2024. All rights reserved.