Linuxでdnfによる更新を自動化する方法(dnf-automatic)

Linuxでdnfによる更新を自動化する方法(dnf-automatic)

RedHat系のLinuxでdnfによる更新を自動化する場合、シェルスクリプトを駆使した方法が思い浮かびますが、シェルスクリプトを作成しなくても更新を自動化できるツール「dnf-automatic」が便利です。

そこでここではRedHat系のAlmaLinuxを例に、dnf-automaticを使ってdnfによる更新を自動化する方法を紹介します。

dnf-automaticを使った更新の自動化

dnf-automaticを使った更新の自動化手順は、次のとおりです。

インストール

まず、以下のコマンドでdnf-automaticをインストールします。

# dnf install dnf-automatic

設定

dnf-automaticをインストールしたら、設定ファイル「/etc/dnf/automatic.conf」で、dnf-automaticの設定をカスタマイズします。

必要最低限の設定項目は、次のとおりです。

# vim /etc/dnf/automatic.conf

[commands]
upgrade_type = default
download_updates = yes
apply_updates = yes

[emitters]
emit_via = stdio,email
  • upgrade_type:「default」ではすべての更新が対象となり、「security」ではセキュリティ関連の更新のみが対象となります。
  • download_updates:yes/noで更新パッケージを自動的にダウンロードするかを指定します。
  • apply_updates:yes/noで更新パッケージを自動的にインストールするかを指定します。
  • emit_via:結果の通知先を指定でき、stdioならログに記録し、emailならデフォルトでroot宛にメール通知でき、commandを指定すると外部コマンドを実行することもできます。

「download_updates」と「apply_updates」の両方に「no」を指定した場合は、実際の更新は行わずに、更新パッケージがあるかどうかだけを確認できます。

なお、設定項目は上に紹介した以外にもいろいろと用意されており、たとえば更新後に自動的にシステムを再起動させるかを指定できたりするので、詳しい設定項目を知りたい方は、以下のコマンドでdnf-automaticのヘルプをご参照ください。

# man dnf-automatic

スケジュール実行の設定

設定が済んだら、以下のコマンドで自動更新をスケジュール実行を有効化します。

# systemctl enable --now dnf-automatic.timer

実行間隔はデフォルトでは毎日午前6時頃に実行されるよう設定されていますが、Timerファイルを修正すれば実行日時を自分で設定することもできます。

# vi /etc/systemd/system/timers.target.wants/dnf-automatic.timer

[Timer]
OnCalendar=*-*-* 6:00

実行日時は「OnCalendar」で指定し、日時の指定方法は「=DayOfWeek Year-Month-Day Hour:Minute:Second」の順で記述し、指定例は以下のとおりです。

  • 毎日4時に実行したい場合:OnCalendar=*-*-* 04:00:00
  • 毎月第1月曜日の18時に実行したい場合:OnCalendar=Mon *-*-01..07 18:00:00
  • 毎月1日から4日までで月曜日か火曜日のときのみ12時に実行したい場合:OnCalendar=Mon,Tue *-*-01..04 12:00:00
  • 6月と12月の1日の3時に実行したい場合:OnCalendar=*-6,12-01 03:00:00

Timerファイルを修正したら、以下のコマンドで設定を適用します。

# systemctl daemon-reload

正しくTimer設定されているか確認したいときは、以下のコマンドで確認できます。

# systemctl list-timers

NEXT                        LEFT     LAST                        PASSED       UNIT                ACTIVATES
Wed 2024-06-19 06:07:45 JST 19h left Tue 2024-06-18 06:56:00 JST 3h 33min ago dnf-automatic.timer dnf-automatic.service

以上の設定で、スケジュールに従い自動更新が実施されます。

通知メールサンプル

dnf-automaticの設定でメール通知するよう設定しており、実際に更新はさせずに更新があることだけを通知させた場合、以下のような内容のメールが通知されます。

件名:

'ホスト名' で更新が利用可能です。

本文:

'ホスト名' で以下の更新を利用できます:
================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
================================================================================
アップグレード:
highway x86_64 1.2.0-2.el9 epel 35 k

トランザクションの概要
================================================================================
アップグレード 1 パッケージ

あとがき

dnf-automaticで更新までをすべて自動化してしまうのもありですが、個人的には更新があることはdnf-automaticで通知させて、面倒でも実際の更新は手動で行うのが確実でしょう。