使用厨师如何在读取其他文件的输入后更新文件?

时间:2017-02-15 11:10:43

标签: linux bash chef chef-recipe

我使用linux命令生成文件“a.txt”。现在我需要读取文件“a.txt”的第一个单词并更新名为“b.txt”的现有文件。我将在b.txt中搜索一个名为“/ fill”的单词,并将其替换为从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&gt;&gt; a.txt”的帮助下,我将ex.txt的内容放到a.txt中。
  2. 在此之后,我想用test = /#{'cat /a.txt'}/读取文件a.txt。示例a.txt包含“azure”字
  3. 现在在b.txt中我想搜索一个单词“/ fill”并替换为步骤2中从b.txt文件中读取的内容,即azure
  4. 问题是用/ / .txt取代/填充而不是用天蓝色替换/填充。 希望现在明白
  5. 你能帮忙吗

1 个答案:

答案 0 :(得分:1)

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

  • 将您的ruby代码放在ruby_block资源中,以便在Chef的收敛阶段执行
  • 如果您要编辑不完全由Chef管理的文件,请使用Chef::Util::FileEdit(有关更多灵感,请参阅this question)。)
  • 如果您确实想使用Chef编写完整文件,请使用file资源,并根据您使用content阅读的内容指定File.read
  • 如上所述,ruby_block之外的ruby代码在编译阶段(which precedes the convergence phase)执行。如果你太早了(因为源文件尚未存在,你可以使用lazy块进行延迟评估:

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