厨师模板 - 时间戳

时间:2015-01-21 13:11:22

标签: ruby chef

使用chef 11.x实现模板化配置文件时,我想在更新时将当前日期/时间插入文件。

例如:

# Created By : core::time-settings
# On         : <%= Time.now %>

显然,这会对每个配方运行进行评估,并且即使其他属性都正常,也会不断更新目标文件 - 这是不可取的。

因此有人知道解决方案吗?我不知道Chef内部有任何内置逻辑来实现这一点,我不知道我可以在ruby块中评估内置的chef变量,只有当其他属性不合规时才会这样(因为这将提供潜在的解决方法)。

我知道我可以运行一个只在模板资源被触发后运行的执行类型操作,并且它会扩展文件中的变量来实现这一点,但我不喜欢这样做的概念或想法

谢谢,

2 个答案:

答案 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应该给你这个信息)?