dnf-automaticを使ったパッケージの自動アップデート

dnf-automaticを使ったパッケージの自動アップデート

こんにちは、SRE課の栩野です。

先日、パッケージ管理にdnfを使うサーバで、パッケージアップデートの自動化設定を行う機会があったのでブログにしてみました。
今回自動化するために、dnf-automaticなる自動化用のパッケージを利用しました。

dnf-automaticとは

RHEL7系のOSまでは、yumでパッケージが管理されていたので、yum-cronという自動化用のパッケージが用意されていました。
RHEL8からはパッケージ管理がdnfに変更されたので、dnfの自動化用パッケージとしてdnf-automaticが用意されるようになったようです。

dnf-automaticでは、各種パッケージの更新確認や自動アップデート、更新結果をメールで通知することも可能です。
また定期的にスケジュールして実行する場合は、cronではなくsystemdのTimerユニットを使って設定します。

設定手順

実際にdnf-automaticを使って、パッケージの定期的な自動アップデートの設定を行っていきます。
OSはRHEL8系サーバにて確認します。

# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.6 (Ootpa)
  1. インストール

epelリポジトリに含まれるパッケージなので、epelをインストールしてからdnf-automaticをインストールします。

# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf -y install dnf-automatic
  1. 設定ファイルの修正

dnf-automaticの設定ファイルを修正します。
パッケージ更新の方法や自動更新の有無、またメール通知の設定が行えます。

各設定項目の説明は、dnfの下記ドキュメントに記載があるので、そちらを参照してください。
dnf-automaticドキュメント

全パッケージの自動アップデートを有効にし、実行後に結果をメール通知する場合、下記のような設定になります。

vi /etc/dnf/automatic.conf

upgrade_type = default

download_updates = yes

apply_updates = yes

emit_via = command_email 

[command_email]
command_format = "mail -Ssendwait -s {subject} -r {email_from} {email_to}"

stdin_format = "{body}"
email_from = denet_test@hogehoge.com
email_to = denet_test@fugafuga.com

各設定項目の説明は以下

upgrade_type = default

対象となるパッケージの種類
defaultとsecurityがあり、defaultは利用可能なすべての更新プログラムが対象、securityはセキュリティ関連のみが対象

download_updates = yes
apply_updates = yes

利用可能な更新パッケージのダウンロードと更新適用の設定
自動アップデートを行う場合は、どちらもyesに設定する必要がある

emit_via = command_email

更新結果の報告方法の設定項目
command_emailを指定することで、サーバのメールコマンドにて結果送信が可能

[command_email]
command_format = "mail -Ssendwait -s {subject} -r {email_from} {email_to}"
stdin_format = "{body}"
email_from = denet_test@hogehoge.com
email_to = denet_test@fugafuga.com

メール送信に実行するシェルコマンドやフォーマット、また送信元と送信先アドレスの指定項目
email_fromにサーバ側で送信に使うアドレスを指定し、email_toで結果を受信したいアドレスを指定する

  1. 定期実行の設定

systemdのTimer機能を有効にすることで、自動アップデートをスケジュールすることが可能です。
下記のコマンドでTimerを有効化し開始することが出来ます。

# systemctl enable --now dnf-automatic.timer

実行スケジュールの設定方法は、下記のファイルを編集することで調整が可能です。
例として、3ヵ月間隔で月初のAM03:00にアップデートをスケジュールしたい場合、下記のような設定になります。
またRandomizedDelaySecで実行の遅延を許容する時間を指定出来るので、デフォルトのmを外して60秒にしておきます。

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

[Timer]
OnCalendar=*-3,6,9,12-01 03:00:00
RandomizedDelaySec=60

上記OnCalendarの書式は下記

OnCalendar=$DAY_OF_WEEK $YEAR-$MONTH-$DAY $Hour:$Minute:$Second

OnCalendarの記述方法については、下記の参考サイトが分かりやすかったので置いておきます。
systemd タイマーの書き方

ちなみに、書式をチェックするための便利コマンドも存在するようで、systemd-analyzeコマンドで確認することが出来ます。

# systemd-analyze calendar '*-3,6,9,12-01 03:00:00'
  Original form: *-3,6,9,12-01 03:00:00
Normalized form: *-03,06,09,12-01 03:00:00
    Next elapse: Thu 2022-12-01 03:00:00 JST
       (in UTC): Wed 2022-11-30 18:00:00 UTC
       From now: 1 months 7 days left

Timerファイルを修正した場合は、デーモンのリロードが必要となるので実施します。

# systemctl daemon-reload

list-timersコマンドを実行することで、スケジュールされているタイマーの一覧が表示出来ます。
下記では次回2022/12/01 AM03:00 にスケジュールされていることが確認出来ます。

# systemctl list-timers
NEXT                         LEFT                 LAST                         PASSED    UNIT                         ACTIVATES
Thu 2022-12-01 03:00:43 JST  1 months 7 days left n/a                          n/a       dnf-automatic.timer          dnf-automatic.service

パッケージの自動アップデート設定は以上で完了となります。
後は実施日になれば、自動でパッケージアップデートが実行され、メールにて結果が通知されてきます。

おまけ① 実際に通知されるメール内容

実際に、自動アップデートが実行された場合、下記のようなメールが届きます。

## 件名
Subject: Updates applied on 'サーバのホスト名'.

## 本文
The following updates have been applied on 'サーバのホスト名':
================================================================================
 Package             Arch   Version               Repository               Size
================================================================================
Installing:
 kernel              x86_64 4.18.0-372.19.1.el8_6 rhel-8-baseos-rhui-rpms 8.0 M
 kernel-core         x86_64 4.18.0-372.19.1.el8_6 rhel-8-baseos-rhui-rpms  39 M
 kernel-modules      x86_64 4.18.0-372.19.1.el8_6 rhel-8-baseos-rhui-rpms  32 M
Upgrading:
 NetworkManager      x86_64 1:1.36.0-7.el8_6      rhel-8-baseos-rhui-rpms 2.3 M
 NetworkManager-cloud-setup
                     x86_64 1:1.36.0-7.el8_6      rhel-8-appstream-rhui-rpms
                                                                          190 k
 NetworkManager-libnm
                     x86_64 1:1.36.0-7.el8_6      rhel-8-baseos-rhui-rpms 1.8 M
 NetworkManager-team x86_64 1:1.36.0-7.el8_6      rhel-8-baseos-rhui-rpms 153 k
 NetworkManager-tui  x86_64 1:1.36.0-7.el8_6      rhel-8-baseos-rhui-rpms 346 k
 bash                x86_64 4.4.20-4.el8_6        rhel-8-baseos-rhui-rpms 1.5 M
 cloud-init          noarch 21.1-15.el8_6.3       rhel-8-appstream-rhui-rpms
                                                                          1.1 M
 curl                x86_64 7.61.1-22.el8_6.3     rhel-8-baseos-rhui-rpms 352 k
 dbus                x86_64 1:1.12.8-18.el8_6.1   rhel-8-baseos-rhui-rpms  42 k
 dbus-common         noarch 1:1.12.8-18.el8_6.1   rhel-8-baseos-rhui-rpms  46 k
 dbus-daemon         x86_64 1:1.12.8-18.el8_6.1   rhel-8-baseos-rhui-rpms 240 k
 dbus-libs           x86_64 1:1.12.8-18.el8_6.1   rhel-8-baseos-rhui-rpms 184 k
 dbus-tools          x86_64 1:1.12.8-18.el8_6.1   rhel-8-baseos-rhui-rpms  86 k
 device-mapper       x86_64 8:1.02.181-3.el8_6.2  rhel-8-baseos-rhui-rpms 377 k
 device-mapper-libs  x86_64 8:1.02.181-3.el8_6.2  rhel-8-baseos-rhui-rpms 410 k
 dracut              x86_64 049-202.git20220511.el8_6
                                                  rhel-8-baseos-rhui-rpms 376 k
 dracut-config-generic
                     x86_64 049-202.git20220511.el8_6
                                                  rhel-8-baseos-rhui-rpms  60 k
 dracut-config-rescue
                     x86_64 049-202.git20220511.el8_6
                                                  rhel-8-baseos-rhui-rpms  61 k
 dracut-network      x86_64 049-202.git20220511.el8_6
                                                  rhel-8-baseos-rhui-rpms 109 k
 dracut-squash       x86_64 049-202.git20220511.el8_6
                                                  rhel-8-baseos-rhui-rpms  62 k
 expat               x86_64 2.2.5-8.el8_6.2       rhel-8-baseos-rhui-rpms 113 k
 glibc               x86_64 2.28-189.5.el8_6      rhel-8-baseos-rhui-rpms 2.2 M
 glibc-all-langpacks x86_64 2.28-189.5.el8_6      rhel-8-baseos-rhui-rpms  25 M
 glibc-common        x86_64 2.28-189.5.el8_6      rhel-8-baseos-rhui-rpms 1.3 M
 glibc-gconv-extra   x86_64 2.28-189.5.el8_6      rhel-8-baseos-rhui-rpms 1.5 M
 glibc-langpack-en   x86_64 2.28-189.5.el8_6      rhel-8-baseos-rhui-rpms 834 k
 grub2-common        noarch 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms 893 k
 grub2-pc            x86_64 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms  44 k
 grub2-pc-modules    noarch 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms 920 k
 grub2-tools         x86_64 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms 2.0 M
 grub2-tools-extra   x86_64 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms 1.1 M
 grub2-tools-minimal x86_64 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms 211 k
 insights-client     noarch 3.1.7-7.el8_6         rhel-8-appstream-rhui-rpms
                                                                          1.2 M
 kernel-tools        x86_64 4.18.0-372.19.1.el8_6 rhel-8-baseos-rhui-rpms 8.3 M
 kernel-tools-libs   x86_64 4.18.0-372.19.1.el8_6 rhel-8-baseos-rhui-rpms 8.1 M
 kpartx              x86_64 0.8.4-22.el8_6.1      rhel-8-baseos-rhui-rpms 115 k
 libcurl             x86_64 7.61.1-22.el8_6.3     rhel-8-baseos-rhui-rpms 302 k
 libdnf              x86_64 0.63.0-8.1.el8_6      rhel-8-baseos-rhui-rpms 706 k
 libgcc              x86_64 8.5.0-10.1.el8_6      rhel-8-baseos-rhui-rpms  80 k
 libgcrypt           x86_64 1.8.5-7.el8_6         rhel-8-baseos-rhui-rpms 463 k
 libgomp             x86_64 8.5.0-10.1.el8_6      rhel-8-baseos-rhui-rpms 207 k
 libsss_autofs       x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 121 k
 libsss_certmap      x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 165 k
 libsss_idmap        x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 124 k
 libsss_nss_idmap    x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 131 k
 libsss_sudo         x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 120 k
 libstdc++           x86_64 8.5.0-10.1.el8_6      rhel-8-baseos-rhui-rpms 454 k
 libxml2             x86_64 2.9.7-13.el8_6.1      rhel-8-baseos-rhui-rpms 696 k
 microcode_ctl       x86_64 4:20220207-1.20220510.1.el8_6
                                                  rhel-8-baseos-rhui-rpms 5.8 M
 openssl             x86_64 1:1.1.1k-7.el8_6      rhel-8-baseos-rhui-rpms 709 k
 openssl-libs        x86_64 1:1.1.1k-7.el8_6      rhel-8-baseos-rhui-rpms 1.5 M
 pcre2               x86_64 10.32-3.el8_6         rhel-8-baseos-rhui-rpms 247 k
 python3-hawkey      x86_64 0.63.0-8.1.el8_6      rhel-8-baseos-rhui-rpms 117 k
 python3-libdnf      x86_64 0.63.0-8.1.el8_6      rhel-8-baseos-rhui-rpms 778 k
 python3-libxml2     x86_64 2.9.7-13.el8_6.1      rhel-8-baseos-rhui-rpms 237 k
 python3-perf        x86_64 4.18.0-372.19.1.el8_6 rhel-8-baseos-rhui-rpms 8.2 M
 qemu-guest-agent    x86_64 15:6.2.0-11.module+el8.6.0+15668+464a1f31.2
                                                  rhel-8-appstream-rhui-rpms
                                                                          341 k
 rh-amazon-rhui-client
                     noarch 4.0.4-1.el8           rhui-client-config-server-8
                                                                           39 k
 rhc                 x86_64 1:0.2.1-9.el8_6       rhel-8-appstream-rhui-rpms
                                                                          8.7 M
 rsync               x86_64 3.1.3-14.el8_6.2      rhel-8-baseos-rhui-rpms 405 k
 rsyslog             x86_64 8.2102.0-7.el8_6.1    rhel-8-appstream-rhui-rpms
                                                                          753 k
 selinux-policy      noarch 3.14.3-95.el8_6.1     rhel-8-baseos-rhui-rpms 645 k
 selinux-policy-targeted
                     noarch 3.14.3-95.el8_6.1     rhel-8-baseos-rhui-rpms  15 M
 sssd-client         x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 227 k
 sssd-common         x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 1.6 M
 sssd-kcm            x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 253 k
 sssd-nfs-idmap      x86_64 2.6.2-4.el8_6.1       rhel-8-baseos-rhui-rpms 121 k
 systemd             x86_64 239-58.el8_6.3        rhel-8-baseos-rhui-rpms 3.6 M
 systemd-libs        x86_64 239-58.el8_6.3        rhel-8-baseos-rhui-rpms 1.1 M
 systemd-pam         x86_64 239-58.el8_6.3        rhel-8-baseos-rhui-rpms 484 k
 systemd-udev        x86_64 239-58.el8_6.3        rhel-8-baseos-rhui-rpms 1.6 M
 tuned               noarch 2.18.0-2.el8_6.1      rhel-8-baseos-rhui-rpms 316 k
 vim-minimal         x86_64 2:8.0.1763-19.el8_6.4 rhel-8-baseos-rhui-rpms 575 k
 xz                  x86_64 5.2.4-4.el8_6         rhel-8-baseos-rhui-rpms 153 k
 xz-libs             x86_64 5.2.4-4.el8_6         rhel-8-baseos-rhui-rpms  94 k
Installing dependencies:
 grub2-tools-efi     x86_64 1:2.02-123.el8_6.8    rhel-8-baseos-rhui-rpms 477 k
Enabling module streams:
 virt                       rhel

Transaction Summary
================================================================================
Install   4 Packages
Upgrade  75 Packages

Updates completed at 更新時間

おまけ② 特定のパッケージをアップデート対象から除外したい

主要なミドルウェアが自動でアップデートされると困るような場合、dnf.confにexcludeの設定を追記することで、アップデート対象から記載したパッケージを除外できます。

下記はカーネル周りとApache、MySQL、php、postfixを更新対象から除外する場合の記載になります。

# vi /etc/dnf/dnf.conf 
excludepkgs=kernel* httpd* mysql* php* postfix*

おまけ③ アップデートの実行後に再起動が必要なサービスの確認

自動アップデートを実施した後、実際に稼働中のサービスに反映させるにはサービス再起動が必要になる場合があります。

サービス再起動の必要有無はneeds-restartingコマンドにて確認することが出来ます。
-r のオプションでシステム再起動が必要かどうかを確認出来、-s のオプションでサービス再起動が必要なサービス一覧を表示出来ます。
下記は実行例になります。

# needs-restarting -r
Core libraries or services have been updated since boot-up:
  * dbus
  * dbus-daemon
  * glibc
  * kernel
  * systemd

Reboot is required to fully utilize these updates.
More information: https://access.redhat.com/solutions/27943

# needs-restarting -s
crond.service
NetworkManager.service
serial-getty@ttyS0.service
user@1000.service
rhsmcertd.service
sshd.service
polkit.service
getty@tty1.service
systemd-logind.service
postfix.service
auditd.service
dbus.service
systemd-journald.service
chronyd.service

さいごに

調べる前はdnf-automaticを知らなかったので、シェルスクリプトで自動化処理をcronに仕込もうと考えていましたが、調べてみるもんだなと思いました。

以上、最後までみていただいてありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA