Как я могу изменить файл с помощью Chef?

У меня 7 файлов и 1 война. Мне нужно изменить значения при их развертывании. У меня есть это:

##usuario
#alfresco.user=*****
alfresco.user=********
##pass 
#alfresco.password= sfsfs
alfresco.password=sfgsf

alfresco.rutaAnexos=/gthtfdh/dfgdf/cm:

#atributo.type.anexo=ANEXO_INFO_OBJETO
atributo.type.anexo=AN
atributo.type.observaciones=OBSERVACIONES

Мне нужно прокомментировать некоторые строки и раскомментировать некоторые другие строки. Затем мне нужно сделать семь шаблонов и поставить переменные в зависимости от окружения и создать файл в рецепте.

Как я могу это сделать?


person Marcelino Juarez Valderrama    schedule 13.02.2013    source источник
comment
См. docs.opscode.com/essentials_cookbook_templates.html и docs.opscode.com/resource_template.html, как работают шаблоны.   -  person StephenKing    schedule 13.02.2013


Ответы (4)


Chef фактически позволяет и использует это. Вы можете найти пример в коде операции

cookbooks/chef-server/recipes/default.rb:

ruby_block "ensure node can resolve API FQDN" do
  block do
    fe = Chef::Util::FileEdit.new("/etc/hosts")
    fe.insert_line_if_no_match(/#{node['chef-server']['api_fqdn']}/,
                               "127.0.0.1 #{node['chef-server']['api_fqdn']}")
    fe.write_file
  end
  not_if { Resolv.getaddress(node['chef-server']['api_fqdn']) rescue false }
end

Вот вариант использования. После установки из исходников пришлось раскомментировать строки в каком-то созданном конфигурационном файле, который не был одинаковым во всех версиях программы, поэтому использование шаблонов было нецелесообразным. Методы, которые я использовал, были:

  • (Объект) search_file_replace(regex, replace)
  • (Объект) search_file_replace_line (регулярное выражение, новая строка)

Вы можете найти полную документацию здесь:

ДЛЯ ПОДТВЕРЖДЕНИЯ: Этот метод следует использовать только в том случае, если использование шаблонов и партиалов неуместно. Как уже сказал @StephenKing, шаблоны - это распространенный способ сделать это.

person Konzulic    schedule 03.10.2013
comment
Конечно, вы можете сделать это таким образом, но я решительно утверждаю, что размещение целых файлов на месте является лучшей практикой по сравнению с их редактированием. Я думаю, вы видите это, когда сравниваете свой код с использованием ресурса шаблона. - person StephenKing; 05.10.2013
comment
@StephenKing, если это так, я бы хотел, чтобы вы ответили на мой вопрос: если у вас есть 7 версий программного обеспечения, каждая из которых имеет различия в файле конфигурации, и в этом файле вы должны установить некоторую базовую конфигурацию, которая никогда не меняется, не могли бы вы поставить 7 файлов в шаблоне? Или вы бы использовали этот метод, чтобы раскомментировать 3 строки кода и сделать свою кулинарную книгу шеф-повара универсальной? - person Konzulic; 07.10.2013
comment
@StephenKing, если у вас есть способ, о котором я не подумал, предоставьте его здесь. Думаю, что такого рода рассуждения принесли бы пользу всей теме. Кроме того, я согласен, что приведенный мною метод следует использовать осторожно и только в случае неизбежной необходимости. - person Konzulic; 07.10.2013
comment
Я не спорил, я пытался спорить. Одна идея: передать части вашего шаблона, которые изменяются, как переменные в ваш шаблон и решить, какое содержание зависит от версии в рецепте. Другая идея: попробуйте частичные шаблоны: docs.opscode.com/ - person StephenKing; 07.10.2013
comment
@Konzula Спасибо за этот ответ. Я только начинаю использовать Chef, но мне также кажется странным, что они предпочитают заменять целые файлы. Я хотел бы, чтобы мне давали варианты, а не единственный и «правильный» путь. - person Peter Vrabel; 07.10.2013
comment
Хороший! Частицы великолепны и облегчают жизнь. Тем не менее, я думаю, что редактирование файлов иногда необходимо. PS. Когда я сказал спорить, я не подумал ничего плохого. Извините, я неправильно употребил выражение. @Питер, спасибо :) - person Konzulic; 09.12.2013
comment
Это действительно хороший ответ, так как прямо сейчас я хочу отредактировать файл, созданный ОС, поэтому я не могу создавать для него шаблоны. УДИВИТЕЛЬНЫЙ Ответ человек! Намного лучше принятого :| - person JGutierrezC; 03.08.2014
comment
Да, шаблоны (или отправка необработанного контента в файловый ресурс) отлично подходят, если Chef создает всю установку. Но mediawiki (например) генерирует свой собственный файл LocalSettings.php. Ваш выбор: 1) запустить сценарий инициализации mediawiki, а затем внести некоторые изменения в сгенерированный файл LocalSettings.php, или 2) заново изобрести велосипед, создать весь файл LocalSettings.ini из шаблона и выяснить, как создать структуру базы данных. , и т.д. - person Tom Wilson; 28.05.2015
comment
Основным недостатком редактирования файлов является обеспечение идемпотентности процесса. Это может быть нетривиально! Используйте шаблон, и это просто работает. - person Tom Wilson; 28.05.2015
comment
Во многих случаях шаблон является правильным ответом, но если вы управляете конфигурацией программного обеспечения, которое вы хотите периодически обновлять, и вы не хотите воссоздавать золотой мастер после каждого обновления, использование частичного FileEdits намного лучше, чем установка и настройка программного обеспечения вручную или частично автоматически только для получения новых полей настроек/и т.д. - person dragon788; 09.10.2017
comment
Кроме того, их использование переместилось из default.rb в helpers.rb. github.com/chef-cookbooks/chef-server/ блоб/мастер/библиотеки/ - person dragon788; 11.10.2017

Вот пример того, как вы можете использовать Chef для раскомментирования строки в файле конфигурации. ruby_block защищен ::File::grep. Тест для Debian просто для удовольствия.

pam_config = "/etc/pam.d/su"
commented_limits = /^#\s+(session\s+\w+\s+pam_limits\.so)\b/m

ruby_block "add pam_limits to su" do
  block do
    sed = Chef::Util::FileEdit.new(pam_config)
    sed.search_file_replace(commented_limits, '\1')
    sed.write_file
  end
  only_if { ::File.readlines(pam_config).grep(commented_limits).any? }
end if platform_family?('debian')
person Stuart Pook    schedule 07.02.2014

С 2020 г. предлагаемые решения не рекомендуются — см. здесь и здесь.

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

Пример:

replace_or_add "why hello" do
  path "/some/file"
  pattern "Why hello there.*"
  line "Why hello there, you beautiful person, you."
end

Крайне важно, прежде чем использовать такую ​​стратегию, быть на 100% уверенным, что ручное редактирование действительно требуется, но это строго зависит от варианта использования.

person Marcus    schedule 17.09.2020

По замыслу вы не изменяете файлы с помощью Chef. Вместо этого вы помещаете заполнители (<%= ..%>) в шаблоны файлов, которые затем заменяются динамическими значениями (так называемыми атрибутами).

person StephenKing    schedule 13.02.2013
comment
Что делать, если файл также редактируется другим программным обеспечением? Шаблоны — это хорошо, но есть необходимость в редактировании файлов (даже в ansible есть модуль lineinfile). - person neutrinus; 01.12.2015
comment
Тогда смотрите ответ ниже. - person StephenKing; 01.12.2015