目次
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)
- インストール
epelリポジトリに含まれるパッケージなので、epelをインストールしてからdnf-automaticをインストールします。
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# dnf -y install dnf-automatic
- 設定ファイルの修正
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で結果を受信したいアドレスを指定する
- 定期実行の設定
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に仕込もうと考えていましたが、調べてみるもんだなと思いました。
以上、最後までみていただいてありがとうございました。
運用サービス課 課長
運用・監視の設計から導入まで、運用サービスを担当してます。
運用監視やセキュリティ関連の話題に興味があるので、そのあたりのブログを多めで投稿していきたいと思ってます。
LINK
クラウドベリージャム:プロフィールページ