Ruby厨师配方中的多文件替换

Ruby厨师配方中的多文件替换,ruby,chef-infra,Ruby,Chef Infra,厨师新手在这里,也知道一点红宝石 我不知道为什么我不能在我正在研究的样本配方的文件中写两次 我的配置文件中有两种模式需要替换,但这样做 不更新两个模式;只更新一个,而不更新另一个 ruby_block " Update Config File " do block do file_name = config_file text = File.read(file_name) File.write(file_name, text.gsub(search_value, re

厨师新手在这里,也知道一点红宝石

我不知道为什么我不能在我正在研究的样本配方的文件中写两次

我的配置文件中有两种模式需要替换,但这样做 不更新两个模式;只更新一个,而不更新另一个

ruby_block " Update Config File " do
  block do
    file_name = config_file
    text = File.read(file_name)
    File.write(file_name, text.gsub(search_value, replace_value))
    File.write(file_name, text.gsub(second_search_value, second_replace_value))
  end
  only_if { File.exists?("#{config_file}") }
end

我知道我可以做另一个ruby_块,但我只是想知道我错过了什么,使这项工作。我只需要一个ruby_块,而不是两个,因为我正在编辑同一个文件。

让我们逐行查看:

  • text=File.read(文件名)
  • 简单,我们**将*文件内容读入
    text

  • File.write(文件名,text.gsub(搜索值,替换值))
  • 我们在原始
    text
    中执行
    g
    lobal
    sub
    组合,并将其写入文件

  • File.write(文件名,text.gsub(第二个搜索值,第二个替换值))
  • 我们在原始
    text
    中执行
    g
    lobal
    sub
    组合,并将其写入文件

    当然,您正在覆盖2中的更改。当你用3写的时候

    一种可能的方法是gsub两次,最后只写一次,但实际上不要这样做,做这种更改很脆弱,随时可能中断,或者在每次运行时插入更改并中断配置。

    让chef用,

    管理整个文件让我们逐行查看:

  • text=File.read(文件名)
  • 简单,我们**将*文件内容读入
    text

  • File.write(文件名,text.gsub(搜索值,替换值))
  • 我们在原始
    text
    中执行
    g
    lobal
    sub
    组合,并将其写入文件

  • File.write(文件名,text.gsub(第二个搜索值,第二个替换值))
  • 我们在原始
    text
    中执行
    g
    lobal
    sub
    组合,并将其写入文件

    当然,您正在覆盖2中的更改。当你用3写的时候

    一种可能的方法是gsub两次,最后只写一次,但实际上不要这样做,做这种更改很脆弱,随时可能中断,或者在每次运行时插入更改并中断配置。

    让chef使用,

    来管理整个文件,只是为了回应底部部分,使用模板资源确实更好,因为它是一种更收敛的方法。正如您的示例所示,如果您的regexp编写得不仔细,您可能会遇到意外的替换。只是为了回应下面的部分,使用模板资源确实更好,因为它是一种更收敛的方法。在您的示例中,如果您的regexp编写得不仔细,则可能会出现意外的替换。