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é.
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
.
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:
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.
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
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