使用 Chef file.insert_line_if_no_match 方法获取 CIDR 地址

use Chef file.insert_line_if_no_match method for CIDR address

我正在尝试使用 file.insert_line_if_no_match 作为 CIDR 地址:

attributes/default.rb:

default["chefclustercidr"]["ip"] = "a.b.c.d/24"

recipe/default.rb

ruby_block "chef-backend.rb" do
block do
  file = Chef::Util::FileEdit.new("/etc/chef-backend/chef-backend.rb")
  file.insert_line_if_no_match("/publish_address/" , "publish_address i#{node['chefclusterbe1']['ip']}")
  file.insert_line_if_no_match("/postgresql/" , "postgresql.md5_auth_cidr_addresses = ["samehost", "samenet", "#{node['chefclustercidr']['ip']}/24"]")
  file.write_file
  end
end

但出现 ruby 语法错误 $ruby -c default.rb

default.rb:95: syntax error, unexpected tIDENTIFIER, expecting ')'
th_cidr_addresses = ["samehost", "samenet","#{node['chefclus
                              ^
default.rb:95: syntax error, unexpected tIDENTIFIER, expecting keyword_end
resses = ["samehost", "samenet","#{node['chefclustercidr']['
                              ^
default.rb:99: syntax error, unexpected keyword_end, expecting end-of-input

FileEdit 是一个内部 class,不支持 在配方代码中使用它。不要使用它。期间.

就是说,问题是您的字符串中有未转义的双引号。

您可以使用bash 和grep 以另一种方式处理它,而不是insert_line_if_no_match。我在另一个问题中添加了方法你可以看看here

这是 bash 资源,我通常仅在没有匹配项时才将其附加到文件:

bash 'append line(s) to file if it doesnt exist' do
  user 'user'
  code <<-EOS
    cat >>/home/file <<EOL
      *.* @@172.167.189.67:514
    EOL
   EOS
  not_if "grep -q 172.167.189.67 /home/file"
end

你可能需要 运行 烹饪风格 ^