自動Linuxアップデートのベストプラクティス


11

RHEL / RHELベースのサーバーの自動更新を実行する方法に取り組んでいます。

最初のアイデア: Puppetを使用して、デフォルトのリポジトリを無効にし、独自のリポジトリを指定します。次に、ensure => latest自動的に更新するパッケージに使用します。

問題:更新後に一部のサービスが再起動することがわかりました(当たり前)。

質問: Linuxの更新を自動化する方法や、サービスの自動再起動を緩和するための戦略に関するアドバイスはありますか?Puppetを含むソリューションをお勧めしますが、別のサービスを使用する必要がある場合、それは契約違反ではありません。

編集

考えられる解決策: @ voretaq7と@ewwhiteが提案したものの多くを実装する解決策を提出しました。これが私が当分の間行っているルートであるようです。他に提案がある場合は、コメントするか回答を送信してください。

回答:


14

一般的な更新戦略は健全です。ローカルリポジトリ(dev環境でテストすることを想定しています)があり、それに基づいてすべてを更新します(既知の適切であると想定)。

サービスの再起動は避けられません。基盤となるコードが変更された場合、その変更を有効にするにはサービスを再起動する必要があります。そうしないと、結果が悪化する可能性があります(共有ライブラリと同期していないコードを実行すると、アプリケーションがクラッシュします)。
私の環境では、四半期ごとのパッチウィンドウは四半期ごとに「すべてを再起動してください」と考えています。窓も。このようなポリシーの利点は、再起動後にサーバーが復旧することを知っており、サーバーが正常に動作することを知っていることです(定期的にテストするため)。


あなたへの私の最善のアドバイスは、ソフトウェアリリースをスケジュールすることです(おそらく、これはパペットで「手動で」トリガーする必要があることを意味します)。
代わりに(またはその一部として)、いくつかのマシンまたはサービスを再起動し、エンドユーザーにサービスを提供できるように、環境に冗長性を構成できます。これにより、中断が完全になくなるわけではありませんが、最小限に抑えることができます。

追加された冗長性は、ハードウェア障害が発生した場合にも保護されます。ハードウェア障害は、長い時間スケールでは避けられません。


4
Reboot All The Thingsの+1。
トム・オコナー

2
@ TomO'Connor私は難しい方法を学びました。再起動の間に最大約3か月間は非常に快適に感じますが、その後、自分が何をしたのかが疑問に思い始めます。最後の再起動で、VPNトンネルが実際に失われました(トンネルはハードコーディングされて起動しましたが、そのルートは追加されなかったので...ええ。)
voretaq7

あなたに触発された可能な解決策を投稿@ voretaq7
ベルミンフェルナンデス

@ BeamingMel-Binそれを答えとして投稿すべきです-それは合理的なアプローチのように聞こえます。
voretaq7

ありがとうございました。私が家に帰るときに行ったいくつかの考えごとに、ワークフローにいくつかの修正を加えて投稿しました。
ベルミンフェルナンデス

5

パッケージの更新後にサービスを再起動すると、必ずしも問題がありますか?展開する前に小規模でテストして、問題があるかどうかを確認します。最近、DenyHostsの rpmforgeパッケージにい問題がありました。実際に、yum更新からのリビジョン間で、構成と作業ディレクトリの場所を変更しました。それはまったく望ましくない動作です。通常、RHELの同じリビジョン内では、あまり多くの問題はありませんが、効果を綿密にテストおよび監視しなければ確認できません。

別のオプションは、サービスを選択的に更新することです。たとえば、常に最新のパッケージが必要ですか?これは、更新を実行する理由を理解することに戻ります。本当の目標は何ですか?

独自のリポジトリを実行する利点は、リリースまたはロールアウトをステージングし、スケジュールを管理できることです。RHEL 5.6を必要とするハードウェアペリフェラルまたはソフトウェアベンダーがあり、5.7未満の場合はどうなるでしょうか。これは、独自のパッケージを管理することの利点の1つです。


更新セットがサービスの再起動をトリガーする場合、間違いなくその再起動を行いたいと思います。もちろん、その更新を行う必要がない場合(機能、セキュリティ強化、またはあなたが必要とする何かを購入するわけではありません)、私はそれをしません、または、私は停止をスケジュールできるまで待ちます自分とユーザーにとって便利です。
voretaq7

2

@ビーミングメルビン

単純化により、ssh for loopツールを使用してパペットを開始/停止する必要がなくなります。

まず、ENCから値が取得される「noop」という変数を含めるようにマニフェストを変更する必要があります。

したがって、クラスには次のようなものがあります。

noop => $noop_status

noop_statusENCで設定されている場所。値をnoop_statusに設定するtrueと、マニフェストはnoopモードでのみ実行されます。

ホストが数百または数千ある場合、ダッシュボードやフォアマンなどのENCを使用して、「ホストグループ」または「ドメイン」レベルでパラメータを継承することで、多くのホストのパラメータを一括変更できます。その後、少数のテストホストの値を「false」に設定して、Hostgroup値を上書きできます。

これにより、選択したホストのみに変更が適用されます。

中央の場所で1つのパラメーターを変更すると、ループツールのsshでパペットをオン/オフする必要なく、任意の数のホストに影響を与える可能性があります。安全/管理のために、ホストを複数のグループに分けることができます。

また、マニフェストにパッケージのバージョン番号をハードコーディングする代わりに、ENCにそれらを配置できることに注意してください。上記と同様に、選択的に変更を適用し、ロールアウトを管理できます。

より細かく(および複雑に)したい場合は、クラスごとのパラメータなどnoop_status_apacheClassを設定することもできます。

include他のクラスでクラスを作成する場合、これは管理が難しくなる場合があります。


1

可能なソリューションベースの@ voretaq7の答え:

  1. puppetマニフェスト内のパッケージのバージョン番号をハードコードし、独自のリポジトリでパッケージを維持します。

  2. パッケージの新しいバージョンが提供するものに対して行う必要がある場合(セキュリティの強化、お客様が必要とする機能など)、パッケージをリポジトリにダウンロードします。

  3. テストサーバーで更新されたパッケージをテストします。

  4. 更新がテストされたら、funcまたはのようなものを使用して、影響を受けるノード上のエージェントpsshを停止しpuppetます。

  5. puppetマニフェストを更新して、影響を受けるノードにパッケージの新しいバージョンがインストールされるようにします。

  6. 最後に、またはpuppet agent --onetime && rebootを使用してサーバーで実行しますfuncpssh

このソリューションの欠陥や、単純化できるものを見つけたらコメントしてください。


1
ENCとパラメーターを使用してこれを簡素化することができます。これには、マニフェストの再配置が必要になりますが、これはすべての可能性があるとは限りません。
今は

@NotNowを詳しく説明して、回答を投稿してください。知って興味をそそられます。
ベルミンフェルナンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.