Как прокомментировать строку в файле /etc/sudoers с помощью Chef Recipe?

Я хочу прокомментировать строку "Defaults requiretty" в файле /etc/sudoers с помощью Chef. Если он уже прокомментирован, код ruby ​​не должен его комментировать. Я использую операционную систему CentOS 6.7. До сих пор я сделал это в своем рецепте:

files = Dir.glob("/home/cent/etc/*")

files.each do |file_name|
  text = File.read(sudoers)
  replace = text.gsub!(/Defaults    requiretty/, "#Defaults    requiretty")
  File.open(sudoers, "w") { |file| file.puts replace }
end

person Shesh Kumar Bhombore    schedule 04.02.2016    source источник
comment
Добро пожаловать в СО. Прочтите Как задать хороший вопрос?.   -  person StephenKing    schedule 04.02.2016
comment
Возможно, сначала выполните поиск, это может помочь..   -  person StephenKing    schedule 04.02.2016
comment
Извините, ребята ... Новичок в SO :( Я отредактировал свой вопрос. Пожалуйста, смотрите. !!   -  person Shesh Kumar Bhombore    schedule 04.02.2016


Ответы (3)


Правильное решение — использовать ресурс template для управления содержимым файла, а не выполнять дифференциальные обновления для файла, предоставленного дистрибутивом. Это обеспечивает общее конвергентное поведение и упрощает мысленное моделирование состояния системы.

person coderanger    schedule 04.02.2016

Чтобы расширить другие ответы и комментарии. Один из принципов Chef заключается в том, что поваренные книги и рецепты должны быть идемпотентными и конвергентными. Они определяют состояние, в котором вы хотите, чтобы ваши узлы находились, они проверяют, что нужно сделать, чтобы привести его в это состояние, и применяют только эти изменения.

Это логически логично, сводит к минимуму ненужные изменения и то, как Chef структурирован для работы «из-под капота».

Запуск кода Ruby в вашем примере не добавит дополнительных символов «#», но будет обновлять ваш файл при каждом запуске. Это вводит в заблуждение и может повлиять, если какое-то приложение проверит время обновления вашего файла, чтобы увидеть, произошло ли изменение конфигурации.

Ресурс шаблона, предложенный @coderanger, будет обновлять файл только при необходимости. Кроме того, шаблон, скорее всего, понятнее, чем какой-нибудь Ruby Code. Этот подход показывает, как должен работать другой (хороший) код Chef.

person matt freake    schedule 05.02.2016

У нас есть ответ!

ruby_block "replace_line" do
  block do
    file = Chef::Util::FileEdit.new("/etc/sudoers")
    file.search_file_replace_line(/Defaults    requiretty/, "#Defaults    requiretty")
    file.write_file
  end
end
person Shesh Kumar Bhombore    schedule 04.02.2016
comment
у рецепта, который вы используете, есть шаблон sudoers? или он просто использует значение по умолчанию. Обычно я создаю свой собственный шаблон вместо того, чтобы пытаться регулярно выражать/комментировать строки, - person Doon; 04.02.2016
comment
@Doon Привет .. Нет, мы не использовали никаких шаблонов. - person Shesh Kumar Bhombore; 04.02.2016
comment
Использование FileEdit не рекомендуется. В частности, это будет обновлять файл каждый раз, потому что ваше регулярное выражение не является идемпотентным. - person coderanger; 04.02.2016
comment
@coderanger Мы запускали этот рецепт снова и снова, просто чтобы увидеть, есть ли несколько префиксов # перед строкой requiretty по умолчанию. Но этого не произошло. Мы могли видеть одиночный символ «#» с префиксом :) - person Shesh Kumar Bhombore; 05.02.2016