我需要为我们的小部门networking中的多个服务器提供一些configuration定制。 我们目前正在使用RHEL5,因为我不想重复工作,所以我想用这个configuration创buildRPM并将它们上传到我们的RHN。
现在的问题是:假设我想通过/etc/ntp.conf发布NTPconfiguration。 可悲的是,没有/etc/ntp.d/把我的文件,因此我不得不用我的RPM覆盖ntp.conf 。 我该如何做到这一点,即ntp更新时,不会丢失configuration,而且没有可能的configuration文件冲突?
用大卫的傀儡解决scheme来代替。 真。
但是,如果你确定了,你可以做的是创build一个包含“/etc/ntp.conf.rassie”的软件包rassie-ntp-conf。 在spec文件中,你将需要一个%post ,通过默认的configuration复制你的configuration,还需要一个“ %triggerin -- ntp-server ”。 这样,如果稍后的升级覆盖configuration,触发器将复制它。 也许把一些东西放到/etc/cron.daily做同样的事情是真的肯定…可能需要所有这些脚本做一个service ntpd condrestart之后,也是。
这是基础知识。 如果你想要做更多的包,你可以build立一个标准的脚本,通过/ etc / rassie /findconfiguration文件复制到/ etc,然后运行%post和%triggerin。
但是,真的,忽视这一点,并使用木偶或厨师或cfengine …这种“通过RPM推出configuration”计划是充满了微妙的问题源于RPM的基本问题是不是有两个不同的包争夺一个文件。 很难testing,很难debugging,正是那种聪明的解决scheme,会让你后来希望你第一次与木偶去。
我能build议一个替代解决scheme吗? 您可能会发现像Puppet或Cfengine2这样的configurationpipe理工具可以实现您想要的function。 您可以编写清单文件来描述您希望系统如何看起来并消失,并更改系统,使其看起来像这样。 注意你描述系统应该看起来的重要区别,而不是你如何改变系统。 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时,如果这个软件包覆盖了configuration文件,那么puppet将会复制旧的。 如果有任何差异,它会显示一个差异,所以你可以看到有什么变化,所以你可以注意到任何差异,并更新您的中央版本,如果你想这些变化。
不pipe你如何决定推出这些改变,如果你需要修改ntp.conf(或者任何configuration文件,真的),而不想批量replace文件,请看看Augeas( http://augeas.net) )。 有一点点的学习曲线,但它解除了很多parsing/编辑文件的复杂性。
我认为Puppet或CFEngine是长远的路要走。 但作为第一步,更容易实现一个版本控制系统,如颠覆或混帐应该工作。 你甚至可以在Puppet和CFEngine下保存configuration文件的更改历史logging。
我试图处理使用只有rpms。 只有当你的configuration文件非常简单时才有可能。
最好的方法,但它不是简单的实施是使用像puppet和cfengine像大家所build议的工具。