小規模な部門ネットワーク内の複数のサーバーに構成のカスタマイズを提供する必要があります。現在 RHEL5 を使用しており、作業を繰り返さないように、その構成で RPM を作成し、RHN にアップロードしたいと考えています。
ここで問題になります。 経由で NTP 設定を配布したいとします/etc/ntp.conf
。残念ながら、 にファイルを置く場所がないので/etc/ntp.d/
、 を RPM で上書きする必要がありますntp.conf
。 を更新しても設定が失われず、設定ファイルの競合も起こらないように、これを適切に行うにはどうすればよいでしょうかntp
。
答え1
代わりに、David の puppet を使用するソリューションを採用してください。本当に。
ただし、決心しているなら、"/etc/ntp.conf.rassie" を含むパッケージ rassie-ntp-conf を作成することができます。仕様ファイルには、%post
設定をデフォルト設定にコピーする と、同じことを行う " " が必要です。こうすることで、後のアップグレードで設定が上書きされても、トリガーによってその設定がコピーされます。確実にするために、同じことを行うために /etc/cron.daily に何かを追加することもできます... おそらく、 cp の後に%triggerin -- ntp-server
すべてのスクリプトで を実行する必要があります。service ntpd condrestart
これが基本です。より多くのパッケージに対してこれを実行したい場合は、代わりに /etc/rassie/ を実行して /etc にコピーする設定を見つける標準スクリプトを作成し、代わりに %post と %triggerin でそれを実行することもできます。
しかし、実際には、それを無視して、puppet または Chef または cfengine を使用してください... この種の「RPM 経由で構成をプッシュする」スキームは、RPM が 2 つの異なるパッケージが 1 つのファイルをめぐって競合するように設計されていないという根本的な問題から生じる微妙な問題に満ちています。テストが難しく、デバッグが難しく、最初から 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 デーモンが再起動されます (subscribe 行のおかげです)。
これで問題は解決するのでしょうか? 新しいバージョンの ntp がインストールされ、パッケージが構成ファイルを上書きすると、puppet は古いファイルをコピーし直します。違いがある場合は、変更時に diff が表示されるので、どのような変更が行われたかを確認できます。そのため、違いに気付き、変更が必要な場合は中央バージョンを更新できます。
答え3
変更をどのようにプッシュするかに関わらず、ntp.conf(または実際のところ任意の設定ファイル)を変更する必要があり、ファイルを丸ごと置き換えたくない場合は、Augeas(オーガス)。学習曲線は少しありますが、ファイルの解析/編集の複雑さが大幅に軽減されます。
答え4
私は rpm のみを使用して処理しようとしました。設定ファイルが非常に単純な場合にのみ可能です。
最善のアプローチは、誰もが提案しているように、puppet や cfengine などのツールを使用することですが、実装するのはそれほど簡単ではありません。