首页 > 解决方案 > 使用 Chef 食谱更新文件

问题描述

挑战提示

挑战提示在上面,我最近的尝试在下面。目录和文件按预期创建,执行后的读数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提示中引用的服务器之前在本地测试配方,这就是为什么我的文件路径不同以及为什么我还没有包含所有权属性的原因。

标签: rubysynchronizationchef-infraauto-update

解决方案


因此,文件硬链接似乎不是问题所在(尽管我会说您的解决方案可能更好,因为这实际上不是 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

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

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资源)。


推荐阅读