Использование рецепта шеф-повара для добавления нескольких строк в файл конфигурации
Я пытаюсь создать рецепт шеф-повара, чтобы добавить несколько строк (20-30) в конкретный файл конфигурации.
Я знаю, что рекомендуемый шаблон - изменить целые файлы конфигурации, а не просто добавлять к файлу, но мне не нравится этот подход по нескольким причинам.
До сих пор единственным решением, которое я нашел, было использование cookbook_file
, а затем использовать ресурс bash:
cat lines_to_append >> /path/configfile
Очевидно, что это не сработает должным образом, так как он будет добавлять файл снова и снова при каждом запуске chef-client. Мне нужно создать небольшой bash script, чтобы сначала проверить определенную строку и , если не найден, добавить к файлу.
Но это, похоже, преследует цель использования шеф-повара. Должен быть лучший способ.
Одним из перспективных решений было line cookbook из сообщества OpsCode. Он стремился решить эту точную проблему. К сожалению, функциональность неполна, глючит, а код - просто быстрый хак. Далеко не твердое решение.
Другой вариант, который я оценил, был augeas. Кажется довольно мощным, но он добавит еще один слой абстракции в систему. Overkill, в моем случае.
Учитывая, что это одна из самых очевидных задач для любого sysadmin, есть ли простое и красивое решение с шеф-поваром, которого я не вижу?
EDIT: вот как я его решаю до сих пор:
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
Он работает, но не уверен, что это рекомендуемый образец шеф-повара.
Ответы
Ответ 1
Как вы сами сказали, рекомендуемый образец Chef - управлять всем файлом.
Если вы используете шеф-повар 11, вы, вероятно, можете использовать частичные для того, чего вы пытаетесь достичь.
Там больше информации здесь и на этой примерной книге.
Пока у вас есть доступ к исходному шаблону конфигурации, просто добавьте <%= render "original_config.erb" %>
в начало вашего шаблона parms_to_append.conf
.
Ответ 2
Как уже говорилось, использование шаблонов и partials - это обычный способ сделать это, но шеф-повар позволяет добавлять файлы и даже изменять (редактировать) файловые строки. Appendind выполняется с использованием следующих функций:
- insert_line_after_match (regex, newline);
- insert_line_if_no_match (regex, newline)
Вы можете найти и пример здесь в stackoverflow и полную документацию по rubydoc.info
Пожалуйста, используйте его с осторожностью, и только если частичные и шаблоны не подходят.
Ответ 3
Я сделал что-то вроде этого:
monit_overwrites/шаблоны/по умолчанию /monitrc.erb:
#---FLOWDOCK-START
set mail-format { from: [email protected] }
#---FLOWDOCK-END
В моем рецепте я сделал это:
monit_overwrites/Рецепты/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
Самый простой способ справиться с этим - создать строку и передать ее в контент. Конечно, bash блокирует работу... но я думаю, что файловые ресурсы элегантны.
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
Ответ 5
Вот пример блока ruby для вставки 2 новых строк после совпадения:
ruby_block "insert_lines" do
block do
file = Chef::Util::FileEdit.new("/etc/nginx/nginx.conf")
file.insert_line_after_match("worker_rlimit_nofile", "load_module 1")
file.insert_line_after_match("pid", "load_module 2")
file.write_file
end
end
insert_line_after_match
ищет регулярное выражение/строку, и оно вставит значение после совпадения.