ruby - 使用 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
提示中引用的服务器之前在本地测试配方,这就是为什么我的文件路径不同以及为什么我还没有包含所有权属性的原因。
解决方案
因此,文件硬链接似乎不是问题所在(尽管我会说您的解决方案可能更好,因为这实际上不是 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 拥有这三个文件的内容,如果你想更新它,你可以通过你的食谱(然后通常使用template
或cookbook_file
资源)。
推荐阅读
- python - 在机器人框架中找不到名为“foo”的关键字
- javascript - 控制台说 Math.Floor 不是函数。我怎样才能解决这个问题
- macos - VSCode 等宽字体不是等宽字体,如何解决这个问题?
- graphql - Apollo Server:如何根据回调发送响应?
- vba - VBA excel从文件夹中获取文件名
- python - Bazel:如何在测试前运行 py_binary 以生成输入文件
- mysql - 将多个订单项合并为一个
- node.js - 如何在 NestJS 服务器上动态更改 TypeORM 配置?
- hazelcast - setStoreByValueJCache + Hazelcast 接口不起作用
- reactjs - 无法在全新的 create-react-app 上运行 npm install