![创建仅运行 %post 脚本来修改另一个 RPM 拥有的文件的 RPM 是否合法?](https://linux22.com/image/635586/%E5%88%9B%E5%BB%BA%E4%BB%85%E8%BF%90%E8%A1%8C%20%25post%20%E8%84%9A%E6%9C%AC%E6%9D%A5%E4%BF%AE%E6%94%B9%E5%8F%A6%E4%B8%80%E4%B8%AA%20RPM%20%E6%8B%A5%E6%9C%89%E7%9A%84%E6%96%87%E4%BB%B6%E7%9A%84%20RPM%20%E6%98%AF%E5%90%A6%E5%90%88%E6%B3%95%EF%BC%9F.png)
我正在编写一些 RPM,它们为各种内部 YUM 存储库安装 YUM 存储库配置文件,其结构和概念与 EPEL 存储库 RPM 相同。
我们将拥有多个具有同等存储库的环境,因此我们使用 yum 优先级插件来确保部署序列中较早的环境存储库(即 QA)优先于较晚的环境存储库(即生产)。我们还在内部镜像上复制我们使用的 CentOS 版本。我们已完成所有这些工作,包括发布这些存储库配置 RPM,但还有一个特殊情况,我希望得到一些关于处理设计问题的最佳方法的建议。
那就是:CentOS 基础 repo 配置文件 /etc/yum.repos.d/CentOS-Base.repo 归 centos-release RPM 所有,因此我无法在自己的 RPM 中覆盖此文件,除非替换此系统 RPM,而我不想这样做。但是,我需要对此文件进行一些更改,以便它与上述设计兼容。在每个 repo 部分中,
我需要改变这些行:
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
至以下几行:
mirrorlist=http://mirrorlist.MYCOMPANY.com/?platform=centos&release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.MYCOMPANY.com/centos/$releasever/os/$basearch/
priority=2
我目前正在创建一个 RPM,用于安装 /etc/yum.repos.d/CentOS-Base-pr.repo,然后在 %post 中将现有的 CentOS-Base.repo 重命名为 CentOS-Base.repo.orig,然后将新的 CentOS-Base-pr.repo 重命名为 CentOS-Base.repo。在 %postun 中,它会反转此操作以恢复原始文件。我觉得这可行,但有点不方便。
我想做的是,不安装任何文件,而是运行 sed 脚本对 %post 中的原始 CentOS-Base.repo 文件进行这些更改,并运行另一个 sed 脚本撤消 %postun 中的更改。这样,我就可以以相同的方式处理所有自定义存储库的安装/卸载,并对现有存储库和新存储库获得一致的结果。
我不知道的是 - 当您尝试对其他 RPM 安装的现有文件进行这种类型的配置“调整”时,这是一种有效或推荐的方法吗?
在我得到关于这个问题的答案之前,我们正在使用 Chef 进行大多数与此类似的 RPM 后配置,但不想在这种情况下使用它,因为我们不想在这个实例中对 repo 配置有一个特殊情况,并且我们试图使用 RPM 将“繁重的”安装/升级逻辑封装在其他地方的 RPM 中。我们希望我们自己的软件能够像其他开源软件一样运行,因为它可以在不依赖 Chef 进行基本安装的情况下安装和运行,Chef 仅用于自定义(即 Chef 如何配置 nginx 或 tomcat)。
提前感谢任何建议...
答案1
如果您愿意,可以单独使用脚本或嵌入在 rpm 中的脚本。我喜欢使用空 rpm 或元 rpm 来创建您自己的虚拟组或执行某些任务。在这种情况下,我会担心后来的 centos-release 包会破坏我的更改。如果您的包中包含您想要的文件并且您使用该选项安装它,则跟踪此问题似乎更容易--replacefiles
。