如何使用Chef更改文件?

时间:2013-02-13 06:58:17

标签: chef chef-recipe

我有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 个答案:

答案 0 :(得分:77)

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(正则表达式,换行符)

您可以在此处找到完整的文档:

TO STRESS:此方法仅在使用模板和部分不合适时使用。正如@StephenKing所说,模板是这样做的常用方式。

答案 1 :(得分: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')

答案 2 :(得分:3)

从2020年开始,我们不鼓励提供解决方案-参见herehere

执行文件手动编辑的现代方法是使用社区维护的官方食谱line

示例:

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

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

答案 3 :(得分:-3)

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