web-dev-qa-db-fra.com

Utilisation d'une recette Chef pour ajouter plusieurs lignes à un fichier de configuration

J'essaie de créer une recette de Chef pour ajouter plusieurs lignes (20-30) à un fichier de configuration spécifique. 

Je suis conscient que le modèle recommandé est de changer des fichiers de configuration entiers plutôt que de simplement ajouter un fichier, mais je n'aime pas cette approche pour plusieurs raisons.

Jusqu'à présent, la seule solution que j'ai trouvée consistait à utiliser un cookbook_file, puis une ressource bash pour effectuer les tâches suivantes: 

cat lines_to_append >> /path/configfile

Évidemment, cela ne fonctionnerait pas correctement car cela ajouterait le fichier à chaque fois, à chaque fois que vous exécuteriez chef-client. Il me faudrait d'abord créer un petit script bash pour rechercher une chaîne spécifique, puis ajouter si non trouvé au fichier. 

Mais cela semble aller à l'encontre de l'objectif d'utiliser Chef. Il doit y avoir un meilleur moyen.

Une solution prometteuse était le line cookbook de OpsCode Community. Il visait à résoudre ce problème exact. Malheureusement, la fonctionnalité est incomplète, buggy, et le code est juste un hack rapide. Loin d'être une solution solide.

Une autre option que j'ai évaluée était augeas . Cela semble assez puissant, mais cela ajouterait encore une autre couche d'abstraction au système. Overkill, dans mon cas.

Étant donné qu’il s’agit d’une des tâches les plus évidentes de tous les administrateurs système, existe-t-il une solution simple et belle avec Chef que je ne vois pas?


EDIT: voici comment je le résous jusqu'à présent:

 cookbook_file "/tmp/parms_to_append.conf" do
   source "parms_to_append.conf"
 end

 bash "append_to_config" do
   user "root"
   code <<-EOF
      cat /tmp/parms_to_append.conf >> /etc/config
      rm /tmp/parms_to_append.conf
   EOF
   not_if "grep -q MY_IDENTIFIER /etc/config"
 end

Cela fonctionne, mais je ne suis pas sûr que ce soit le motif Chef recommandé.

11
Gui Ambros

Comme vous l'avez dit vous-même, le modèle Chef recommandé consiste à gérer l'ensemble du fichier.

Si vous utilisez Chef 11, vous pouvez probablement utiliser des partiels pour ce que vous essayez d’atteindre.

Il y a plus d'informations ici et sur ce exemple livre de cuisine .

Tant que vous avez accès au modèle de configuration d'origine, ajoutez simplement <%= render "original_config.erb" %> en haut de votre modèle parms_to_append.conf.

11
cassianoleal

Comme indiqué précédemment, utiliser des modèles et partiels est une méthode courante, mais Chef permet d'ajouter des fichiers et même de modifier (modifier) ​​les lignes de fichier. L'ajout est effectué à l'aide des fonctions suivantes:

  • insert_line_after_match (regex, nouvelle ligne);
  • insert_line_if_no_match (regex, nouvelle ligne)

Vous pouvez trouver et exemple ici sur stackoverflow, et la documentation complète sur rubydoc.info

Utilisez-le avec prudence, et uniquement lorsque les partiels et les modèles ne sont pas appropriés.

9
Konzula

J'ai fait quelque chose comme ça:

monit_overwrites/templates/default/monitrc.erb:

#---FLOWDOCK-START
set mail-format { from: [email protected] }
#---FLOWDOCK-END

Dans ma recette j'ai fait ceci:

monit_overwrites/recipes/default.rb:

execute "Clean up monitrc from earlier runs" do
  user "root"
  command "sed '/#---FLOWDOCK-START/,/#---FLOWDOCK-END/d' > /etc/monitrc"
end

template "/tmp/monitrc_append.conf" do
  source "monitrc_append.erb"
end

execute "Setup monit to Push notifications into flowdock" do
  user "root"
  command "cat /tmp/monitrc_append.conf >> /etc/monitrc"
end

execute "Remove monitrc_append" do
  command "rm /tmp/monitrc_append.conf"
end
4
Kasper Grubbe

Le moyen le plus simple de résoudre ce problème serait de créer une chaîne et de la transmettre au contenu. Bien sûr, les blocs bash fonctionnent ... mais je pense que les ressources de fichiers sont élégantes.

lines = ""
File.open('input file') do |f|
   f.lines.each do |line|
      lines = lines  + line + "\n"
   end
end
file "file path"  do
   content line
end
1
ABCD