如何使用rpm更新/替换现有文件?

时间:2009-04-06 16:58:50

标签: deployment configuration lamp rpm

我希望使用rpm部署多个应用程序。我的应用程序部署中的某些文件会覆盖其他已部署软件包中的文件。简单地在部署包中包含新文件将导致rpm冲突。

我正在寻找使用rpm更新/替换已安装文件的正确方法。

我已经提出了一些解决方案,但似乎没有什么是正确的。

  • 维护包含原始文件的自定义版本的rpms。

对于相对较小的奖励而言,这似乎是一项大量的工作,即使它感觉不像其他一些可能的解决方案那样的黑客攻击。

  • 使用其他名称将文件包含在rpm中,并将其复制到帖子部分。

这可行,但意味着乱丢系统的多个副本。此外,它还意味着每个文件的rpm构建规范中的额外维护。

  • 使用post部分中的wget替换某个已知服务器中的原始文件。

这与复制技术类似,但文件甚至不会存在于rpm中。这可能就像一个不错的中央配置权限。

  • 将文件部署为新文件,然后使用符号链接覆盖原件。

这也与复制技术相似,但杂乱程度较低。这里的问题是某些文件作为符号链接表现不佳。

3 个答案:

答案 0 :(得分:11)

据我所知,RPM不是为了允许更新/替换现有文件而设计的,所以你所做的任何事情都将成为一个黑客。

在你列出的选项中,如果目标系统是我管理的系统(正如你所说,它是更多的工作但是最干净的解决方案)和#2的组合,我会选择#1作为最不好的黑客攻击如果我正在为其他人的系统创建RPM,那么#4(尽可能的符号链接,不在哪里复制)(以避免分发一堆RPM,但我会在其中明确非常 docs我正在做的事。)

您尚未描述需要更新或替换哪些文件以及需要更新的文件。根据这些问题的答案,您可能还有其他几个选择:

  • 许多程序旨在使用单个默认配置文件,并从.d子目录中获取配置文件。例如,Apache使用/etc/httpd/conf/httpd.conf/etc/httpd/conf.d/*.conf,因此您的RPM可以删除/etc/httpd/conf.d下的文件,而不是修改/etc/httpd/conf/httpd.conf。如果您需要修改的文件是不遵循此模式但可以使用的配置文件,您可以向软件包维护者建议他们添加此功能;这不会立即帮助你,但会使未来的版本更容易。
  • 对于可以由多个软件包提供的sendmaillpr等命令行实用程序,alternatives系统(请参阅man alternatives)允许提供的转速超过1 RPM这些实用程序要并排安装。同样,如果您需要修改的文件是不遵循此模式但可以使用的命令行实用程序,您可以向软件包维护人员建议他们添加此功能。
  • 您管理的系统上的配置文件更改可通过CfenginePuppet等工具进行更好的管理,而非通过自定义RPM进行管理。我认为Red Hat喜欢Puppet。
  • 如果我为我不管理的系统创建RPM,我会考虑使用像Bitrock这样的第三方工具并将所有内容转储到/opt下面,这样我就不必踩踏了在其他管理员的RPMs安装的文件上。

答案 1 :(得分:3)

你也可以执行rpm -U --replacefiles --replacepkgs ...,它会为你提供你想要的东西。

答案 2 :(得分:2)

有关RPM%files指令的详细信息,请参阅此处:

http://www.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html

您可以使用RPM scriptlet中%post和%pre部分的参数来确定您是要安装,升级还是删除软件包。

如果$ 1为0 - 那么我们就会删除旧东西。目标是安装0个包。 如果1美元是1 - 那么我们正在安装新的东西。目标是总共安装1个包。 如果$ 1是2或更多 - 那么我们正在升级这个包,$ 1代表已经安装的包的数量。

这些部分有助于管理版本之间的文件。 跟踪你在版本之间做了什么,并考虑如果他们要跳过一两个版本可能会做什么。

考虑到这些事情,你应该好好去!