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资源,这样我就不会在配方文件本身中将配置文件嵌入为字符串?
当我第一次开始使用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
你可以使用template "/etc/systemd/system/#{unit_name}" do ... end
之类的东西和daemon-reload
的通知。
我不确定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