Мне нужно настроить конфигурацию нескольких серверов в нашей сети небольшого отдела. В настоящее время мы используем RHEL5, и, поскольку я не хочу повторять работу, я хотел бы создать RPM-пакеты с этой конфигурацией и загрузить их в нашу RHN.
Теперь проблема: если я хочу распространить конфигурацию NTP через /etc/ntp.conf
. К сожалению, нет /etc/ntp.d/
чтобы разместить мои файлы, поэтому мне пришлось бы перезаписать ntp.conf
с моим RPM. Как мне сделать это правильно, то есть без потери конфигурации, когда ntp
обновляется и тоже без возможных конфликтов файлов конфигурации?
Могу я предложить альтернативное решение? Вы можете обнаружить, что такой инструмент управления конфигурацией, как Puppet или Cfengine2, делает то, что вы хотите. Вы пишете файлы манифеста, которые описывают, как вы хотите, чтобы система выглядела, а они исчезают и изменяют систему так, чтобы она выглядела так. Обратите внимание на важное различие: вы описываете, как должна выглядеть система, а не то, как вы ее изменяете. Примером для ntp может быть:
class ntp {
package {"ntpd":
ensure => latest,
}
file { "/etc/ntp/ntp.conf":
source => "puppet:///ntp/ntp.conf",
owner => "root",
group => "root",
mode => 644,
require => Package["ntpd"],
}
service { "ntpd":
ensure => running,
enable => true,
subscribe => File["/etc/ntp/ntp.conf"],
}
}
Когда вы включаете этот класс в конкретный узел, вы устанавливаете пакет ntpd, копируете свой файл на сервер и убедитесь, что демон запущен. Если puppet внесет какие-либо изменения в ntp.conf, он перезапустит демон ntp (благодаря строке подписки).
Как это решает ваши проблемы? Что ж, при установке новой версии ntp, если пакет перезаписывает файл конфигурации, puppet скопирует старую обратно. Если есть какие-либо различия, он будет отображать разницу по мере ее изменения, чтобы вы могли видеть, какие изменения были внесены, чтобы вы могли заметить любые различия и обновить свою центральную версию, если вы хотите эти изменения.
Воспользуйтесь решением Дэвида использовать вместо этого марионетку. В самом деле.
Однако, если вы настроены решительно, вы можете создать пакет rassie-ntp-conf, содержащий «/etc/ntp.conf.rassie». В файле спецификации вам понадобится %post
который копирует вашу конфигурацию поверх конфигурации по умолчанию, а также "%triggerin -- ntp-server
", который делает то же самое. Таким образом, если более позднее обновление перезапишет конфигурацию, триггер скопирует ее обратно. Может быть, добавьте что-нибудь в /etc/cron.daily, чтобы сделать то же самое, чтобы быть действительно уверенным ... Вероятно, нужно иметь все эти сценарии делают service ntpd condrestart
после cp тоже.
Это основы. Если вы хотите сделать это для большего количества пакетов, вы можете вместо этого создать стандартный сценарий, который запускается через / etc / rassie /, чтобы найти конфигурации для копирования в / etc, и вместо этого запускать файлы% post и% triggerin.
Но на самом деле игнорируйте это и используйте puppet, Chef или cfengine ... Такая схема «выталкивания конфигурации через RPM» чревата тонкими проблемами, вытекающими из фундаментальной проблемы, заключающейся в том, что RPM не предназначен для борьбы двух разных пакетов. один файл. Трудно протестировать, трудно отладить, именно такое умное решение, которое позже заставит вас пожалеть о том, что вы вообще не использовали марионетку.
Независимо от того, как вы решите внести изменения, если вам нужно изменить ntp.conf (или любой другой файл конфигурации, на самом деле) и не хотите заменять файл оптом, взгляните на Augeas (http://augeas.net). Требуется небольшая кривая обучения, но при этом значительно уменьшается сложность синтаксического анализа / редактирования файлов.
Я думаю, что Puppet или CFEngine - лучший вариант в долгосрочной перспективе. Но в качестве первого шага должна работать более простая в реализации система контроля версий, такая как subversion или git. Вы захотите сохранить историю изменений файлов конфигурации даже в Puppet и CFEngine.
Я пытался справиться, используя только rpms. Это возможно только тогда, когда ваши файлы конфигурации очень простые.
Лучший подход, но его непросто реализовать, - это использовать такие инструменты, как puppet и cfengine, как все предлагали.