使用厨师食谱保持文件更新

时间:2018-06-25 22:54:16

标签: ruby synchronization chef auto-update

challenge prompt

挑战提示在上方,而我的最新尝试在下方。目录和文件已按预期创建,执行chef-apply multipleCopies.rb后的读取结果告诉我文件已链接,但是当我更新其中任何一个文件时,其他文件都不遵循。有任何想法吗?这是我的代码:

for x in 1..3
    directory "multipleCopy#{x}" do
        mode '0755'
        action :create
    end
end
file "multipleCopy1/secret.txt" do
        mode '0755'
        action :create
end
for x in 2..3
    link "multipleCopy#{x}/secret.txt" do
        to "multipleCopy1/secret.txt"
        link_type :hard
        subscribes :reload, "multipleCopy1/secret.txt", :immediately
    end
end

注意:为了减轻头痛,在将其上载到提示中引用的ubuntu服务器之前,请先对本机进行测试,这就是为什么我的文件路径不同以及为什么尚未包括所有权属性的原因。 / p>

1 个答案:

答案 0 :(得分:1)

因此,文件硬链接似乎不是问题的根源(尽管我会说您的解决方案可能更好,因为这实际上不是Chef的目的,稍后再介绍)。相反,他们似乎希望您拥有三个实际上不同的文件,但要同步内容。

因此,首先简单一些,创建目录和空的初始文件。尽管在语法上是有效的,但很少见到在Ruby代码中使用过这些for循环:

3.times do |n|
  directory "/var/save/multipleCopy#{n+1}" do
    owner "ubuntu"
    group "root"
    mode "755"
  end

  file "/var/save/multipleCopy#{n+1}/secret.txt" do
    owner "root
    group "root"
    mode "755"
  end
end

但是,这并没有实现同步文件的困难部分。为此,我们需要首先分析文件的mtimes并使用最新的文件内容进行设置。

latest_file = 3.times.sort_by { |n| ::File.mtime("/var/save/multipleCopy#{n+1}/secret.txt") rescue 0 }
latest_content = ::File.read("/var/save/multipleCopy#{latest_file+1}/secret.txt") rescue nil

,然后在文件资源中:

  file "/var/save/multipleCopy#{n+1}/secret.txt" do
    owner "root
    group "root"
    mode "755"
    content latest_content
  end

至于这不是Chef的很好用:Chef是关于编写断言机器所需状态的代码。如果是这样的文件,您可以说Chef拥有这三个文件的内容,而不必更新这类时髦的东西来检查文件是否已被编辑,则可以通过以下方式进行操作:您的食谱(然后通常使用templatecookbook_file资源)。