Chef infra 如何与厨师更改文件?

Chef infra 如何与厨师更改文件?,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我有7个文件和一场战争。我需要在部署值时更改它们。我有这个: ##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 atri

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

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


我怎样才能做到这一点?

根据设计,您不能使用Chef修改文件。相反,您将占位符(
)放入文件模板中,然后用动态值(即所谓的属性)替换这些占位符。

Chef实际上允许并使用这些占位符。您可以在opscode的

cookbook/chef server/recipes/default.rb

ruby_block“确保节点可以解析API FQDN”do
布洛克道
fe=Chef::Util::FileEdit.new(“/etc/hosts”)
fe.如果不匹配(/#{node['chef-server']['api_fqdn']}),则插入第行,
“127.0.0.1{node['chef-server']['api_fqdn']}”)
fe.write_文件
结束
如果{Resolv.getaddress(节点['chef-server']['api_fqdn'])rescue false}
结束
下面是用例。从源代码安装之后,我不得不取消注释一些创建的配置文件中的行,这些行在所有版本的软件中都不相同,因此使用模板是不合适的。我使用的方法是:

  • (对象)搜索文件替换(正则表达式,替换)
  • (对象)搜索文件替换行(正则表达式、换行符)
您可以在此处找到完整的文档:


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

下面是一个示例,说明如何使用Chef取消对配置文件中的行的注释。
ruby_块
::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')

截至2020年,不鼓励提供解决方案-请参阅和

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

例如:

替换或添加“why hello”怎么办
路径“/一些/文件”
模式“为什么在那里打招呼。*”
行“为什么你好,你漂亮的人,你。”
结束

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

请参阅和,模板如何工作。@StephenKing,如果您有我没有想到的方法,请在这里提供。我认为这种争论对整个话题都有好处。此外,我同意,我提供的方法应该小心使用,并且只有在不可避免的需要的情况下才可以使用。我不是在争论,而是在尝试争论。一个想法是:将模板中确实发生变化的部分作为变量传递给模板,并决定配方中特定于版本的内容。其他想法:尝试部分模板:是的,如果Chef正在生成整个安装,模板(或将原始内容推送到文件资源中)非常好。但mediawiki(例如)会生成自己的LocalSettings.php文件。您的选择是1)运行mediawiki初始化脚本,然后对生成的LocalSettings.php文件添加一些编辑,或者2)重新设计轮子,从模板创建整个LocalSettings.ini文件,并找出如何创建数据库结构等。编辑文件的一个主要缺点是确保过程是幂等的。这可不是小事!在很多情况下,模板是正确的答案,但是如果您正在管理要定期升级的软件的配置,并且不想在每次升级后都重新创建一个“gold master”,则,使用部分文件编辑比手动或部分自动安装和配置软件要好得多,只是为了获得新的设置字段/etc。如果文件也由其他软件编辑,该怎么办?模板很好,但也需要编辑文件(即使ansible也有lineinfile模块)。