【问题标题】:Chef Template - Timestamping厨师模板 - 时间戳
【发布时间】:2015-03-20 00:35:13
【问题描述】:

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

例如:

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

显然,这会在每次运行配方时进行评估,并不断更新目标文件,即使其他属性都正常 - 这是不希望的。

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

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

谢谢,

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    这就是 chef 的工作方式,它会在渲染的模板和实际文件之间产生差异,因为时间戳与替换它的时间戳不同。

    由于同样的原因,您的替代解决方案也不起作用,占位符将不同于替换的日期时间。

    您可以做的最好的事情是在旁边写一个名为“myfile-last-update”的文件,例如,其中包含描述它的最后更新的文本。

    但最后一个问题:你为什么要在文件中拥有时间,因为它已经存在于文件属性中(ls -l 应该给你这个信息)?

    【讨论】:

    • 文件的属性不一定是厨师上次编辑它的时间 - 外部力量可能在此期间编辑和/或触及文件,因此文件中的时间戳将为任何人提供一些信息谁读取文件。
    • 如果外力触摸文件,厨师会重写它......并且外力不会总是更新文件顶部的时间戳,所以我不明白它可以提供什么你根本......
    • 假设 chef 将定期运行,但在某些环境中可能并非如此 - 因此 chef 运行之间的差异可能很大。我知道这远非理想,但这与某些文件的历史布局相结合是我希望按照这些思路实现某些东西的原因。
    • Chef 将在覆盖文件时输出差异(并在 /var/chef/backups 中使用时间戳备份它)。文件中的时间戳无论如何都不可靠,这是一种诱饵,认为它会提供任何可信的东西。无论如何,厨师模板不是这样设计的,所以如果您真的希望文件中的时间,可能不是您尝试实现的工具。
    【解决方案2】:

    虽然我同意 Tensibai 的观点,但您所期望的并不是 Chef 的用途。

    我想要添加的(因为前段时间我搜索了很长时间)是如何在文件中包含当前时间戳,一旦它通过 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 %>
    

    【讨论】:

    • 不错的一个(即使我仍然没有看到用例),也许值得注意的是&lt;%%= 是在渲染器本地模板源中有一个&lt;%= ,它将被替换为第二个模板调用。
    • 感谢您的留言!实际用例链接在答案中:对于PowerDNS,我从模板渲染区域文件。这样的 DNS 区域需要一个序列号,通常是从当前时间派生的。但我只想在模板发生变化(新主机、IP 更改等)时更新序列号。
    • 确实,这是一个明确的用例 :) 欢迎您的注意。
    • 哈哈@StephenKing,正是我正在寻找一种方法来做到这一点的原因(除了我正在为绑定创建一个自定义食谱):D
    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多