web-dev-qa-db-ja.com

rpmを使用して既存のファイルを更新/置換するにはどうすればよいですか?

Rpmを使用してデプロイしたいアプリケーションがいくつかあります。アプリケーションデプロイメント内の一部のファイルは、他のデプロイされたパッケージのファイルをオーバーライドします。展開パッケージに新しいファイルを含めるだけでは、rpmの競合が発生します。

Rpmを使用して、すでにインストールされているファイルを更新/置換する適切な方法を探しています。

私はすでにいくつかの解決策を考え出しましたが、何も正しくないようです。

  • 元のファイルを含むrpmのカスタムバージョンを維持します。

これは、他のいくつかの可能な解決策よりもハッキングのようには感じられませんが、比較的小さな報酬のために大量の作業のように見えます。

  • Rpmに別の名前でファイルを含め、それらをpostセクションにコピーします。

これは機能しますが、ファイルの複数のコピーをシステムに散らかすことを意味します。また、各ファイルのrpmビルド仕様の追加メンテナンスを意味します。

  • 投稿セクションでwgetを使用して、既知のサーバーの元のファイルを置き換えます。

これはコピー手法に似ていますが、ファイルはrpmでさえ存在しません。ただし、これはニースの中央構成機関のように機能する可能性があります。

  • ファイルを新しいファイルとしてデプロイしてから、シンボリックリンクを使用して元のファイルを上書きします。

これもコピー手法に似ていますが、煩雑さが少なくなります。ここでの問題は、一部のファイルがシンボリックリンクとして適切に動作しないことです。

21
tremoloqui

私の知る限り、RPMは既存のファイルの更新/置換を許可するようには設計されていないため、あなたが行うことはすべてハックになります。

あなたがリストするオプションの中で、ターゲットシステムが私が管理するシステムである場合は、最も悪いハックとして#1を選択します(あなたが言うように、それはより多くの作業ですが、最もクリーンなソリューションです)#2と#4の組み合わせ(他のシステムのRPMを作成している場合は(可能な場合はシンボリックリンク、そうでない場合はコピー)(RPMの束を配布する必要をなくすためですが、veryドキュメントで私がやっていることを明確にします)。

どのファイルを更新または置換する必要があるか、およびどのように更新する必要があるかを説明していません。これらの質問への回答によっては、他にいくつかのオプションがある場合があります。

  • 多くのプログラムは、単一のデフォルト構成ファイルを使用するように設計されており、.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を参照)では、複数のRPMを使用できます。これらのユーティリティは並べてインストールされます。繰り返しますが、変更する必要のあるファイルが、このパターンに従わないが作成できるコマンドラインユーティリティである場合は、パッケージメンテナにこの機能を追加するように提案できます。
  • 管理するシステムでの構成ファイルの変更は、カスタムRPMではなく、 CfenginePuppet などのツールを使用して管理する方が適切です。 RedHatはPuppetを好むと思います。
  • 管理していないシステムのRPMを作成している場合は、Bitrockなどのサードパーティツールを使用して、インストールされているファイルを踏みにじる必要がないように、すべてのものを/optにダンプすることを検討します。他の管理者のRPMによる。
  • 編集(2019):最近、 ソフトウェアコレクション は便利な代替手段を提供します。 /optの下のどこかにインストールするパッケージを作成できます。ソフトウェアコレクションツールは、ユーザーが/usrの下に通常インストールされるものの代わりにそれらを使用することを選択するための標準化された方法を提供します。 Red Hatはこれを使用して、他の点では安定していて長寿命の(つまり、古い)Red Hat EnterpriseLinuxディストリビューション用の新しいバージョンのツールを配布します。
10
Josh Kelley

また、rpm -U --replacefiles --replacepkgs ...を実行して、必要なものを取得することもできます。

3
Cirque

RPM%filesディレクティブの詳細については、こちらを参照してください。

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

RPMスクリプトレットの%postおよび%preセクションの引数を使用して、パッケージをインストール、アップグレード、または削除するかどうかを判断できます。

$ 1が0の場合、古いものは削除されます。インストールされている0個のパッケージをターゲットにしています。 $ 1が1の場合、新しいものをインストールしています。合計1つのパッケージをインストールすることを目標としています。 $ 1が2以上の場合、このパッケージをアップグレードしています。$ 1は、すでにインストールされているパッケージの数を表します。

これらのセクションは、バージョン間のファイルの管理に役立ちます。バージョン間で何をしているのかを追跡し、1つまたは2つのバージョンをスキップした場合に実行できることを検討します。

これらのことを考慮してください、そしてあなたは行ってもいいはずです!

3
Markizano