小さな部門のネットワーク内のいくつかのサーバーに構成のカスタマイズを提供する必要があります。現在RHEL5を使用していますが、繰り返し作業をしたくないので、その構成でRPMを作成し、RHNにアップロードしたいと思います。
ここで問題:/etc/ntp.conf
を介してNTP構成を配布したい場合。残念ながら、ファイルを入れる/etc/ntp.d/
がないため、上書きする必要があります。 RPMでntp.conf
を実行するにはどうすればよいですか。つまり、ntp
が更新されたときにその構成を失うことなく、また構成ファイルが競合する可能性もありません。
代わりにパペットを使用するというDavidのソリューションを使用してください。本当に。
ただし、決心した場合は、「/ etc /ntp.conf.rassie」を含むパッケージrassie-ntp-confを作成することができます。スペックファイルには、デフォルトの設定に設定をコピーする%post
と、同じことを行う「%triggerin -- ntp-server
」が必要です。そうすれば、後のアップグレードで構成が上書きされた場合、トリガーはその構成をコピーして戻します。たぶん、/ etc/cron.dailyに何かをドロップして、同じことを確実に実行します...おそらく、これらすべてのスクリプトにcpの後にservice ntpd condrestart
を実行させる必要があります。
それが基本です。より多くのパッケージに対してそれを実行したい場合は、代わりに/ etc/rassie /を実行する標準スクリプトを作成して、/ etcにコピーする構成を検索し、代わりに%postおよび%triggerinのものを実行することができます。
しかし、実際には、それを無視して、puppet、Chef、またはcfengineを使用してください...この種の「RPMを介して構成をプッシュする」スキームには、RPMが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は古いバージョンをコピーして戻します。違いがある場合は、変更時に差分が表示されるため、どのような変更が加えられたかを確認できるため、違いに気づき、必要に応じて中央バージョンを更新できます。
変更をプッシュする方法に関係なく、ntp.conf(または実際には任意の構成ファイル)を変更する必要があり、ファイルを大規模に置き換えたくない場合は、Augeas( http:/ /augeas.net )。少し学習曲線がありますが、ファイルの解析/編集の複雑さを大幅に軽減します。
私はrpmのみを使用して処理しようとしました。設定ファイルが非常に単純な場合にのみ可能です。
最善のアプローチですが、実装するのは簡単ではありませんが、誰もが示唆しているように、puppetやcfengineなどのツールを使用することです。
長期的には、PuppetまたはCFEngineが最適な方法だと思います。しかし、最初のステップとして、Subversionやgitなどのバージョン管理システムを実装するのが簡単なはずです。 PuppetおよびCFEngineの下でも、構成ファイルの変更履歴を保持する必要があります。