谁能告诉更好的方法来替换Chef中的一行

时间:2017-09-01 08:29:06

标签: ruby chef

当前厨师食谱代码

ruby_block 'replace_line' do
  block do
    file = Chef::Util::FileEdit.new(common_conf)
    file.search_file_replace_line(/fs.type.*/, 'fs.type='+fs_type)
    file.write_file
  end
  only_if { File.exist?(common_conf) }
end

我收到以下警告:

 Running handlers complete
 [0m[2017-09-01T03:22:36-05:00] INFO: Report handlers complete

Deprecated features used!
 Cloning resource attributes for ruby_block[replace_line] from prior resource
[0mPrevious ruby_block[replace_line]: /var/chef/cache/cookbooks/spark_deployer/recipes/execution_component.rb:61:in `from_file'
 [0mCurrent  ruby_block[replace_line]: /var/chef/cache/cookbooks/spark_deployer/recipes/execution_component.rb:70:in `from_file' at 1 location:[0m
     - /var/chef/cache/cookbooks/spark_deployer/recipes/execution_component.rb:70:in `from_file'[0m
   See https://docs.chef.io/deprecations_resource_cloning.html for further details

有人可以帮助我更好地编写上面的代码吗?

2 个答案:

答案 0 :(得分:1)

你有没有试过

  

有关详细信息,请参阅https://docs.chef.io/deprecations_resource_cloning.html

因为错误信息清楚地告诉你了吗?如果你有,你可能会在这个食谱之前看到另一个名字完全相同:'replace_line'。要解决此问题,您需要将此配方(以及可能的所有引用)重命名为独特的内容,例如:

ruby_block 'replace_line_fs_type' do

答案 1 :(得分:1)

因为您要问的是更好的方式,'你可以查看line cookbook。它提供了一些用于编辑行的基元,例如:

append_if_no_line "make sure a line is in some file" do
  path "/some/file"
  line "HI THERE I AM STRING"
end

最佳解决方案是在Chef中管理整个文件,并在您的食谱中嵌入模板,从您的食谱中复制文件,或将整个文件作为{{ {1}}。部分管理的文件可能充满危险。

此外,与the other answer一样,您依赖资源克隆,因为您拥有多个同名资源。即使您切换到行菜谱,您还应确保所有资源名称都是唯一的(或将所有编辑组合到一个资源中)。