2013-02-13 81 views
26

我有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 

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

我该怎么做?

+2

见http://docs.opscode.com/essentials_cookbook_templates.html和http://docs.opscode.com/resource_template.html,模板是如何工作的。 – StephenKing 2013-02-13 08:13:14

回答

0

通过设计,您不需要使用厨师修改文件。而是将占位符(<%= ..%>)放入文件模板中,然后用动态值(所谓的属性)替换。

+7

如果该文件也被其他软件编辑过,该怎么办?模板非常棒,但也需要编辑文件(甚至有可能有lineinfile模块)。 – neutrinus 2015-12-01 11:23:42

+0

然后看下面的答案。 – StephenKing 2015-12-01 11:36:04

67

厨师实际上允许和使用这个。你可以找到在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所说,模板是这样做的常用方式。

+0

当然,你可以这样做,但我坚决主张,把整个文件放在适当的位置是最好的实践,而不是对它们进行编辑。我想你会在使用模板资源比较代码时看到它。 – StephenKing 2013-10-05 17:36:33

+0

@StephenKing如果是这样的话,我想让你回答我的问题: 如果你有7个版本的软件,每个软件有不同的配置文件,并且在那个文件中,你必须设置一些永不改变的核心配置,你把7个文件放在模板中?或者你会使用这种方法取消注释3行代码,并使您的厨师菜谱通用? – Konzula 2013-10-07 09:00:53

+1

@StephenKing,如果你有什么我没有想到的方式,请在这里提供。我认为这种争论会给整个话题带来好处。 此外,我同意,我提供的方法应该谨慎使用,只有在不可避免的需要的情况下。 – Konzula 2013-10-07 09:14:57

16

下面是如何使用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') 
+0

正是我想要的! – brauliobo 2015-03-08 01:28:46