web-dev-qa-db-fra.com

Comment puis-je modifier un fichier avec Chef?

J'ai 7 fichiers et 1 guerre. Je dois changer des valeurs lorsque je les déploie. J'ai ceci:

##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

Je dois commenter certaines lignes et décommenter d'autres lignes. Ensuite, je dois créer sept modèles et mettre des variables en fonction des environnements et créer un fichier dans la recette.

Comment puis-je faire ceci?

26

Le chef le permet et l'utilise. Vous pouvez trouver un exemple dans le 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

Voici le cas d'utilisation. Après l'installation à partir de la source, j'ai dû décommenter les lignes d'un fichier de configuration créé qui n'était pas le même dans toutes les versions du logiciel, donc l'utilisation de modèles n'avait pas été appropriée. Les méthodes que j'ai utilisées étaient les suivantes:

  • (Objet) search_file_replace (regex, replace)
  • (Objet) search_file_replace_line (regex, newline)

Vous pouvez trouver la documentation complète ici:

POUR SOULIGNER: Cette méthode doit être utilisée uniquement lorsque l'utilisation de modèles et de partiels est inappropriée. Comme @StephenKing l'a déjà dit, les modèles sont un moyen courant de le faire.

78
Konzulic

Voici un exemple d'utilisation de Chef pour supprimer la mise en commentaire d'une ligne dans un fichier de configuration. Le Ruby_block est protégé par un ::File::grep. Le test pour Debian est juste pour le plaisir.

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')
17
Stuart Pook