通过 RPM 管理配置?

通过 RPM 管理配置?

我需要为我们小部门网络中的几台服务器提供一些配置定制。我们目前正在使用 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 之类的工具,但实现起来并不太简单。

相关内容