使用 chef 如何在从另一个文件读取输入后更新文件



我正在使用linux命令生成文件"a.txt"。现在我需要读取文件"a.txt"的第一个单词并更新一个名为"b.txt"的现有文件。我将在 b 中搜索一个名为"/fill "的单词.txt并将其替换为从 a 读取的单词.txt 下面是代码

bash 'example' do
 code <<-EOH
 cat ex.txt >> a.txt 
  EOH
end
test = /#{'cat /a.txt'}/
file_names = ['/b.txt']
file_names.each do |file_name|
  text = File.read(file_name)
  new_contents = text.gsub(/fill, test)
  puts new_contents
  File.open(file_name, "w") {|file| file.puts new_contents }
  1. 在linux命令"cat ex.txt>>a.txt"的帮助下,我将ex.txt的内容放在a.txt。
  2. 在此之后,我想读取文件 a.txt 测试 =/#{'cat/a.txt'}/。示例 a.txt包含"azure"字
  3. 样现在在 b 中.txt我想
  4. 搜索一个单词"/fill"并替换为步骤 2 中从 b.txt 文件即 azure 中读取的内容
  5. 问题不是用 azure 替换/fill,而是用 cat/a.txt 替换。希望现在清楚了

你能在这里帮忙吗

有点难以理解,你真正想要实现的目标。您的代码有几个问题。一般建议:

  • 将 Ruby 代码放入 ruby_block 资源中,以便在 Chef 的收敛阶段执行
  • 如果要编辑不完全由 Chef 管理的文件,请使用 Chef::Util::FileEdit (请参阅此问题以获取更多灵感((。
  • 如果您确实想使用 Chef 编写完整的文件,请使用file资源并根据您使用 File.read 读取的内容指定content
  • 如前所述,ruby_block之外的 Ruby 代码在编译阶段(收阶段之前(执行。如果还为时过早(因为源文件尚未存在,则可以使用 lazy 块进行延迟计算:

    file "b.txt" do
      content lazy { File.read .. }
    end
    

最新更新