我需要为我们小部门网络中的几台服务器提供一些配置定制。我们目前正在使用 RHEL5,由于我不想重复工作,我想使用该配置创建 RPM 并将其上传到我们的 RHN。
现在的问题是:假设我想通过 分发 NTP 配置/etc/ntp.conf
。遗憾的是,没有/etc/ntp.d/
可以放入文件的地方,因此我必须用ntp.conf
我的 RPM 覆盖 。我该如何正确地做到这一点,即在ntp
更新时不丢失该配置,并且不可能发生配置文件冲突?
答案1
采用 David 的解决方案,改用 puppet。确实如此。
但是,如果您下定决心,您可以创建一个包含“/etc/ntp.conf.rassie”的 rassie-ntp-conf 包。在 spec 文件中,您需要一个%post
将您的配置复制到默认配置上的文件,以及一个%triggerin -- ntp-server
执行相同操作的“”。这样,如果以后的升级覆盖了配置,触发器将重新复制它。也许可以将某些内容放入 /etc/cron.daily 中以执行相同操作以确保万无一失……可能还需要让所有这些脚本service ntpd condrestart
在 cp 之后执行一个。
这是基础知识。如果您想对更多软件包执行此操作,您可以改为构建一个标准脚本,该脚本通过 /etc/rassie/ 运行以查找要复制到 /etc 的配置,然后让 %post 和 %triggerin 运行该脚本。
但实际上,请忽略这一点并使用 puppet 或 Chef 或 cfengine... 这种“通过 RPM 推出配置”方案充满了微妙的问题,这些问题源于一个根本问题,即 RPM 并非设计为让两个不同的软件包争夺一个文件。难以测试,难以调试,正是这种聪明的解决方案会让您后来希望当初就选择了 puppet。
答案2
我可以建议一个替代解决方案吗?您可能会发现像 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 会将旧文件复制回来。如果有任何差异,它会在更改时显示差异,这样您就可以看到所做的更改,这样您就可以注意到任何差异,并在需要这些更改时更新您的中央版本。
答案3
无论您决定如何推出更改,如果您需要修改 ntp.conf(或任何配置文件),并且不想全面替换文件,请查看 Augeas(http://augeas.net)。虽然有一点学习难度,但它消除了解析/编辑文件的复杂性。
答案4
我尝试过只使用 rpm 来处理。只有当你的配置文件非常简单时才有可能。
最好的方法是使用大家建议的 puppet 和 cfengine 之类的工具,但实现起来并不太简单。