Использование рецепта шеф-повара для добавления нескольких строк в файл конфигурации

Я пытаюсь создать рецепт шеф-повара, чтобы добавить несколько строк (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 ищет регулярное выражение/строку, и оно вставит значение после совпадения.