Назад | Перейти на главную страницу

поддержание записей в файлах конфигурации Linux, таких как syslog.conf, автоматически и надежно

иногда я хочу автоматически добавить конфигурацию в файл 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. Предположим, что

  • У вас есть репозиторий svn для каждого хоста: http: //svn.localnet/thishost/ и вы хотите начать вносить необычные изменения в настоящий /etc/syslog.conf на «thishost».
  • У вас уже есть локальная проверка репозитория конфигурации для этого хоста в / configs /

начать управлять конфигурацией для этого файла

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, и вы знаете, что самая последняя вещь в репозитории такая же, как и живой файл конфигурации в файловой системе: