使用chef 11.x实现模板化配置文件时,我想在更新时将当前日期/时间插入文件。
例如:
# Created By : core::time-settings
# On : <%= Time.now %>
显然,这会对每个配方运行进行评估,并且即使其他属性都正常,也会不断更新目标文件 - 这是不可取的。
因此有人知道解决方案吗?我不知道Chef内部有任何内置逻辑来实现这一点,我不知道我可以在ruby块中评估内置的chef变量,只有当其他属性不合规时才会这样(因为这将提供潜在的解决方法)。
我知道我可以运行一个只在模板资源被触发后运行的执行类型操作,并且它会扩展文件中的变量来实现这一点,但我不喜欢这样做的概念或想法
谢谢,
答案 0 :(得分:4)
虽然我同意Tensibai,但你所期望的并不是厨师的目标。
我想要添加的内容(因为前段时间我搜索的很长时间)是如何在文件中包含当前时间戳,一旦它通过Chef修改(不知何故你必须绕过它总是更新时间戳)。
结果可以找到here,简化,未经测试的版本:
time = Time.new.strftime("%Y%m%d%H%M%S")
template "/tmp/example.txt" do
source "/tmp/example.txt.erb" # the source is not in a cookbook, but on the disk of the node!
local true
variables(
:time => time
)
action :nothing
end
template "/tmp/example.txt.erb" do
variables(
variable1 => "test"
)
notifies :create, resources(:template => "/tmp/example.txt"), :immediately
end
每当/tmp/example.txt.erb
的内容发生变化时,它都会触发/tmp/example.txt
- 从本地磁盘而不是从食谱中取/tmp/example.txt.erb
作为模板(因为local true
})并用当前时间替换time
变量。
因此,编写/tmp/example.txt
时唯一必须替换的变量是时间,因此example.txt.erb
模板如下所示:
# my template
time: <%%= @time %>
other stuff here.. <%= @variable1 %>
答案 1 :(得分:1)
这就是大厨的工作方式,它在渲染模板和实际文件之间形成差异,因为时间戳与替换它的时间不同。
由于同样的原因,您的备用解决方案无效,占位符与替换的日期时间不同。
你能做的最好的事情就是把一个名为'myfile-last-update'的文件写成一个例子,里面有一个描述最后一次更新的文本。
但是最后一个问题:为什么你要在文件中有时间,因为它已经存在于文件属性中(ls -l
应该给你这个信息)?