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资源,以便我不会将配置文件作为字符串嵌入到配方文件本身中?
答案 0 :(得分:2)
您可以使用类似template "/etc/systemd/system/#{unit_name}" do ... end
和daemon-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