иногда я хочу автоматически добавить конфигурацию в файл conf, который я могу позже удалить с помощью сценария, например, я хочу временно сделать журнал 10 хостов на удаленном сервере системного журнала. Итак, я сделал что-то вроде этого в скрипте;
##some other commands
echo "kern.* @syslog.server.local" >> /etc/syslog.conf
service syslogd restart
однако довольно часто я обновляю некоторые другие команды и снова запускаю скрипт. очевидно, что это не идемпотент, я не могу повторно применить его без некоторых jiggerpokery grep / delete, и я не могу легко его удалить.
так что я сделал что-то вроде этого;
cat <<HEREDOC >>/etc/syslog.conf
###some unique string###
echo "kern.* @syslog.server.local"
###end some unique string###
HEREDOC
что позволяет мне сделать это, чтобы операция повторялась ...
sed -e 's/###some unique string###(*)###end some unique string###/replacement/g' /tmp/syslog.conf > /tmp/syslog.conf
cat <<HEREDOC >>$dfile
###some unique string###
echo "kecrn.* @syslog.server.local"
###end some unique string###
HEREDOC
однако это все кажется многовато ...
(очевидно, что меры /etc/httpd/conf.d/someconffile.conf решили эту проблему для новых пакетов)
есть способ сделать это попроще?
какие-либо предостережения, о которых я должен знать при таком подходе?
В рамках развертывания марионеточного проекта я обнаружил augeas; http://augeas.net/
который является инструментом управления файлами конфигурации.
sed
обычно не делает таких многострочных шаблонов. Вы могли сделать:
read -d '' -r replacement<<HEREDOC
###some unique string###
echo "kecrn.* @syslog.server.local"
###end some unique string###
HEREDOC
sed -e "/beginmark/i\beginmark\n$replacement\nendmark" -e '/beginmark/,/endmark/d'` filename
Вы также не можете перенаправить на тот же файл. Сначала он обрежет файл, а затем запустит sed
на нем (который сейчас пуст). Вы должны использовать временный файл или использовать --in-place
(или -i
) вариант:
sed -i 'sed commands' filename
или
sed 'sed commands' filename > tmpfile
mv tmpfile filename
Я использовал для этого SVN. Предположим, что
начать управлять конфигурацией для этого файла
cp /etc/syslog.conf /configs/etc/
svn add /configs/etc/syslog.conf
svn commit -m "Managing syslog.conf"
вносить изменения через скрипт
#echo some stuff into the file.. no need for extra markup/metadata
cp /etc/syslog.conf /configs/etc/
svn commit -m "I added some junk temporarily"
service syslogd restart
Теперь вы можете вернуться к предыдущей версии. Если между добавлением и откатом вы внесли другие, постоянные изменения, вы можете использовать svn, чтобы получить различия между версиями и объединить все вместе.
Конечно, замените контроль версий на git или что угодно. А также создайте несколько постоянных сценариев, чтобы уменьшить вероятность ошибок, например, функция bash, которая помещает файл в ваше извлеченное репо на основе пути, принимает комментарий фиксации в качестве аргумента. или что угодно.
Если у вас есть репозиторий конфигурации в svn: /// config / который содержит и т.д. / syslog.conf, и вы знаете, что самая последняя вещь в репозитории такая же, как и живой файл конфигурации в файловой системе: