【问题标题】:Working around chef's systemd_unit resource围绕厨师的 systemd_unit 资源工作
【发布时间】:2019-03-17 20:21:47
【问题描述】:

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-infra systemd


    【解决方案1】:

    当我第一次开始使用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】:

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

      【讨论】:

      • 我是否正确理解您的方法只是绕过使用 chef systemd_unit 资源,而只是将文件放下并执行重新加载守护程序的命令?
      • 是的。该资源在构建时并未考虑到食谱内容,因为 Facebook 宁愿尽可能不使用它们。更容易查看单个代码文件。
      【解决方案3】:

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

      • 不将原始字符串放入systemd_unit
      • systemd_unit 设置不是.service 的单位时行为不端

      对于非 .timer 和非 .service 单位,我在使用 Chef13 上的 systemd_unit 资源时遇到了问题。具体来说,它似乎讨厌.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
      

      【讨论】:

        猜你喜欢
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多