28

我有 7 个文件和 1 个战争。我需要在部署它们时更改值。我有这个:

##usuario
#alfresco.user=*****
alfresco.user=********
##pass 
#alfresco.password= sfsfs
alfresco.password=sfgsf

alfresco.rutaAnexos=/gthtfdh/dfgdf/cm:

#atributo.type.anexo=ANEXO_INFO_OBJETO
atributo.type.anexo=AN
atributo.type.observaciones=OBSERVACIONES

我需要注释一些行并取消注释其他一些行。然后我需要制作七个模板并根据环境放置变量并在配方中创建一个文件。

我怎样才能做到这一点?

4

4 回答 4

81

Chef 实际上允许并使用它。您可以在 opscode 中找到一个示例

cookbooks/chef-server/recipes/default.rb

ruby_block "ensure node can resolve API FQDN" do
  block do
    fe = Chef::Util::FileEdit.new("/etc/hosts")
    fe.insert_line_if_no_match(/#{node['chef-server']['api_fqdn']}/,
                               "127.0.0.1 #{node['chef-server']['api_fqdn']}")
    fe.write_file
  end
  not_if { Resolv.getaddress(node['chef-server']['api_fqdn']) rescue false }
end

这是用例。从源代码安装后,我不得不取消注释某些创建的配置文件中的行,这些行在所有版本的软件中都不相同,因此不适合使用模板。我使用的方法是:

  • (对象)search_file_replace(正则表达式,替换)
  • (对象)search_file_replace_line(正则表达式,换行符)

您可以在这里找到完整的文档:

强调:此方法仅在使用模板和部分不合适时使用。正如@StephenKing 已经说过的,模板是这样做的常用方法。

于 2013-10-03T19:00:28.847 回答
17

下面是一个示例,说明如何使用 Chef 取消注释配置文件中的一行。受ruby_block保护::File::grep。Debian 的测试只是为了好玩。

pam_config = "/etc/pam.d/su"
commented_limits = /^#\s+(session\s+\w+\s+pam_limits\.so)\b/m

ruby_block "add pam_limits to su" do
  block do
    sed = Chef::Util::FileEdit.new(pam_config)
    sed.search_file_replace(commented_limits, '\1')
    sed.write_file
  end
  only_if { ::File.readlines(pam_config).grep(commented_limits).any? }
end if platform_family?('debian')
于 2014-02-07T16:26:46.547 回答
5

截至 2020 年,不鼓励提供所提供的解决方案 - 请参阅此处此处

执行文件手动编辑的现代方式是使用官方的、社区维护的说明书

例子:

replace_or_add "why hello" do
  path "/some/file"
  pattern "Why hello there.*"
  line "Why hello there, you beautiful person, you."
end

在使用这种策略之前,100% 确定确实需要手动编辑是至关重要的,但这完全取决于用例。

于 2020-09-17T08:12:53.187 回答
-5

按照设计,您无需使用 Chef 修改文件。相反,您将占位符 ( <%= ..%>) 放入文件模板中,然后将其替换为动态值(所谓的属性)。

于 2013-02-13T08:11:34.280 回答