如何使用Chef更改文件?

Mar*_*ama 26 chef-infra 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
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

Kon*_*lic 78

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 编辑文件的一个主要缺点是确保过程是幂等的.这可能是非平凡的!使用模板,"只是工作". (3认同)
  • 我没有争论,我试图争论.一个想法:将模板中作为变量更改的部分传递给模板,并确定配方中特定于版本的内容.其他想法:尝试部分模板:http://docs.opscode.com/essentials_cookbook_templates.html#partial-templates (2认同)
  • 在许多情况下,模板是正确的答案,但如果您正在管理要定期升级的软件的配置,并且您不想在每次升级后都重新创建“黄金大师”,那么使用部分 FileEdits 是很多比手动或部分自动化安装和配置软件更好,只是为了获得新的设置字段/等。 (2认同)

Stu*_*ook 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')
Run Code Online (Sandbox Code Playgroud)


Mar*_*cus 5

自 2020 年起,不鼓励使用所提供的解决方案 - 请参阅此处此处

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

例子:

replace_or_add "why hello" do
  path "/some/file"
  pattern "Why hello there.*"
  line "Why hello there, you beautiful person, you."
end
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ing -5

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

  • 如果该文件也被其他软件编辑过怎么办?模板很棒,但也需要编辑文件(甚至 ansible 也有 lineinfile 模块)。 (10认同)