2021年5月8日土曜日

Kickstartを使ってRHEL 8を自動インストールする

自宅で検証をする際に、Red Hat Enterprise Linux (RHEL) やCentOS、最近ではRocky LinuxやAlmaLinuxなど、RHEL系のディストリビューションを利用することが多く、頻繁にインストール作業を手作業で行っていた。

慣れてしまえばそこまで時間を要するものではないので、GUIを使ってせっせとインストール作業をしていたが、もっと効率よくインストールできるよう、Kickstart (キックスタート) を使ってインストールの自動化をすることにした。

環境

Kickstartの検証はESXi上に構築したRHEL 8で実施した。検証完了後に同じKickstartファイルを使って、他ディストリビューションでの動作確認もしており、Rocky Linux、AlmaLinuxでもKickstartによる自動インストールが動作することを確認している。

  • RHEL 8.3
  • Rocky Linux 8.3
  • AlmaLinux 8.3
  • ESXi 6.7

手順

1. Kickstartファイル (ks.cfg) を作成

Kickstartは、インストール情報を定義したKickstartファイルと呼ばれるファイルを読み込ませることで自動インストールを実現する。このファイルは通常ks.cfgというファイル名で作成をするのが一般的となるが、ファイル名は任意で設定して問題ない。

Kickstartファイルは、インストール時に各種設定を定義するためのコマンドやオプションが用意されている。詳細は公式マニュアルを参照いただきたいが、最低限必要となるコマンドについては、以下表にて説明する。

設定項目 設定コマンド 説明
インストールモード text インストールをGUIベース (graphical) にするか、CLIベース (text) にするかの設定。
利用規約 (EULA) への同意 eula --agreed 利用規約への同意を自動で行う設定。
リポジトリ repo インストールに使用するリポジトリのパスを指定。インストールイメージに応じて変更が必要。
パッケージ %packages%end 必要なパッケージを指定。最小インストールの場合は、@^minimal-environmentを指定。
インストール後のスクリプト実行 %post%end インストール後の処理として実行するコマンドを記載する。インストール中の文字化けを防止するため、このタイミングで言語設定をja_JP.UTF-8へ変更をしている。
キーボードレイアウト keyboard キーボードレイアウトを指定。
言語設定 lang システムの言語設定。ここでja_JP.UTF-8を選ぶと、インストールは進むものの画面表示が文字化けした状態となるため、あえてen_US.UTF-8を選択している。
ネットワーク network ホスト名やIPアドレスなどの設定。本設定を省略すると、DHCPによる設定が反映される。
インストールタイプ cdrom ISOイメージからのインストールを設定。
初期セットアップ firstboot 初期セットアップの処理を実行するかどうか。初期インストールであれば、有効にしておけば問題ない。
無視するディスク ignoredisk --drivesオプションにてインストールに関係ないディスクを無視するよう設定する。逆に特定のディスクのみを指定する場合は、--only-useを使用する。仮想環境の場合は、sdaのみ指定しておけば問題ない。
自動パーティション autopart 自動的にパーティションを設定する際に指定。
パーティション初期化 clearpart パーティションの初期化動作を指定。--initlabelオプションにて、対象ディスク (ignorediskで指定したディスク) をすべてフォーマットする。--noneはもしパーティションが存在する場合は削除しないためのオプション。
タイムゾーン timezone タイムゾーンを設定する。日本にする場合はAsia/Tokyoを選択する。NTPサーバを指定する場合は、--ntpserversにて指定する。
rootパスワード rootpw 平文 (--plaintext) またはハッシュ化 (--iscrypted) した文字列でパスワードを指定できる。ハッシュ化したパスワードは、インストール済みの環境の/etc/shadowから抽出すると楽。
SELinux selinux SELinuxの有効化、無効化を設定。
ファイアウォール firewall firewalldの有効化、無効化を設定。
インストール後の動作 reboot インストール後に自動で再起動かける場合に指定。同時にDVDを取り出したい場合は、--ejectを付与する。
kdump %addon com_redhat_kdump%end kdumpの設定。
パスワードポリシー %anaconda%end パスワードの最小文字列などのパスワードポリシーの設定。

以下に私が実際に使用しているKickstartファイルを例として記載する。OSインストールイメージがDVD版の場合とMinimal版の場合で変更を加える箇所があり、具体的には以下2点となる。

  • レポジトリのパス
  • open-vm-toolsのインストール方式 (Minimalのイメージにはopen-vm-toolsが含まれないため、dnfを使ってインストールする必要がある)

▼OSインストールイメージがDVDの場合

#version=RHEL8
# Use text install
text

# Agree EULA
eula --agreed

# Package
repo --name="AppStream" --baseurl=file:///run/install/sources/mount-0000-cdrom/AppStream

%packages
@^minimal-environment
@guest-agents
kexec-tools

%end

# Run post script
%post --logfile=/root/ks-post.log
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf ; cat /etc/locale.conf

%end

# Keyboard layouts
keyboard --xlayouts='jp'

# System language
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8

# Network information
network  --bootproto=static --device=ens192 --gateway=192.168.11.31 --ip=192.168.11.192 --nameserver=192.168.11.61,192.168.11.62 --netmask=255.255.255.0 --noipv6 --activate
network  --hostname=localhost.localdomain

# Use CDROM installation media
cdrom

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=192.168.33.23

# Root password
rootpw --plaintext XXXXXXXX
#rootpw --iscrypted XXXX~(省略)~XXXX

# Disable SELinux
selinux --disabled

# Disable firewalld
firewall --disabled

# Reboot after installation
reboot

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

▼OSインストールイメージがMinimalの場合

#version=RHEL8
# Use text install
text

# Agree EULA
eula --agreed

# Package
repo --name="Minimal" --baseurl=file:///run/install/sources/mount-0000-cdrom/Minimal

%packages
@^minimal-environment
kexec-tools

%end

# Run post script
%post --logfile=/root/ks-post.log
echo 'LANG="ja_JP.UTF-8"' > /etc/locale.conf ; cat /etc/locale.conf

export http_proxy=http://192.168.33.23:8080
export https_proxy=http://192.168.33.23:8080
dnf install open-vm-tools -y

%end

# Keyboard layouts
keyboard --xlayouts='jp'

# System language
lang en_US.UTF-8 --addsupport=ja_JP.UTF-8

# Network information
network  --bootproto=static --device=ens192 --gateway=192.168.11.31 --ip=192.168.11.192 --nameserver=192.168.11.61,192.168.11.62 --netmask=255.255.255.0 --noipv6 --activate
network  --hostname=localhost.localdomain

# Use CDROM installation media
cdrom

# Run the Setup Agent on first boot
firstboot --enable

ignoredisk --only-use=sda
autopart
# Partition clearing information
clearpart --none --initlabel

# System timezone
timezone Asia/Tokyo --isUtc --ntpservers=192.168.33.23

# Root password
rootpw --plaintext XXXXXXXX
#rootpw --iscrypted XXXX~(省略)~XXXX

# Disable SELinux
selinux --disabled

# Disable firewalld
firewall --disabled

# Reboot after installation
reboot

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

2. NFSサーバにKickstartファイルを配置

作成したKickstartファイルは、OSインストール時に読み込ませる必要がある。いくつか方式はあるが、今回はNFSサーバにKickstartファイルを配置して、ネットワーク経由で読み込みさせることにする。

NFSサーバの構築は本題とは関係がないため割愛するが、今回はQNAP NASをNFSサーバとして使用することにした。配置パスは以下となる。

nfs:192.168.11.13:/Public2/ks/ks.cfg

3. OSインストールメディアで起動

通常通りOSインストールメディアにて起動し、最初の画面にて「Install Red Hat Enterprise Linux 8.3」を選択したのち、「e」を押し、インストールパラメータを指定する画面に遷移する。

4. インストールパラメータでkickstartファイルを指定

インストールパラメータでは、以下の通り、init.ksのパラメータを追記する。追記箇所を間違えないよう注意。

linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=RHEL-8-3-0-BaseOS-x86_64 quiet inst.ks=nfs:192.168.11.13:/Public2/ks/ks_rhel8.cfg

パラメータ追記後、「Ctrl + x」を押してインストールを開始する。

5. 自動インストール開始

Kickstartによる自動インストールが成功した場合は、以下画面のように「Starting automated install」といった表示がされ、自動的にインストールが進む。

なお、Kickstartファイルにてlang ja_JP.UTF-8を設定した場合、インストールは実行されるが、文字化けするので注意。文字化けを回避するため、前述したKickstartファイルでは、%postの処理で言語設定を変更するようにしている。

インストール完了後、自動で再起動がされ、ログインプロンプトが表示されればインストール完了となる。

6. インストール後の確認

インストール完了後、SSHでログインし以下であることを確認した。Kickstartにより問題なく初期設定がされていることが確認できた。

  • 言語設定がja_JP.UTF-8であること
  • タイムゾーンがAsia/Tokyoであること
  • Chronyにて指定したNTPサーバと同期していること
  • open-vm-toolsがインストールされ起動していること
  • SELinuxが無効化されていること
  • firewalldのサービスが停止していること
# localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp

# timedatectl
               Local time: 土 2021-05-08 17:46:57 JST
           Universal time: 土 2021-05-08 08:46:57 UTC
                 RTC time: 土 2021-05-08 08:46:57
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

# chronyc -n sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.33.23                 2   6   377    54   +208us[ +253us] +/- 2101us

# systemctl status vmtoolsd
● vmtoolsd.service - Service for virtual machines hosted on VMware
   Loaded: loaded (/usr/lib/systemd/system/vmtoolsd.service; enabled; vendor pr>
   Active: active (running) since Sat 2021-05-08 16:17:38 JST; 1h 29min ago
     Docs: http://github.com/vmware/open-vm-tools
 Main PID: 988 (vmtoolsd)
    Tasks: 3 (limit: 10900)
   Memory: 6.5M
   CGroup: /system.slice/vmtoolsd.service
           mq988 /usr/bin/vmtoolsd

 5月 08 16:17:38 localhost.localdomain systemd[1]: Started Service for virtual >

# getenforce
Disabled

# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor >
   Active: inactive (dead)
     Docs: man:firewalld(1)

参考

2021年5月6日木曜日

Rocky LinuxをESXiにインストールしてみた

Red Hat Enterprise Linux (RHEL) のダウンストリーム版のディストリビューションであるCentOS 8は2021年末でサポートが終了し、以降はRHELのアップストリーム版であるCentOS Streamのみがサポートされることが発表された。

当初、CentOS 8は2029年までサポートされる予定であったが、突然サポート期間が短縮されてしまったことにより、CentOS 8を利用しているユーザは、早急にCentOS StreamやRHELへの移行を検討する必要が生じている

そんな中、今までのCentOSと同様の位置付けのRHELダウンストリーム版のディストリビューションの開発がいくつかのプロジェクトで進められており、「Rocky Linux」もそのディストリビューションの1つである。

Rocky Linuxは2021/4/30にバージョン8.3のRC版がリリースされたので、実際にRocky LinuxをESXi上の仮想マシンとしてインストールしてみた

※本記事はRocky LinuxのRC版にてインストールを実施した際の手順を記載している。正式リリース版では手順が変更となる可能性があるため注意すること。

環境

  • ESXi : 6.7 Update 3
  • OS : Rocky Linux 8.3 RC版

Rocky Linuxインストール手順

1. Rocky LinuxのISOイメージをダウンロード

Rocky LinuxのISOイメージは、以下URLからダウンロードできる。

RHEL 8やCentOS 8と同様に、DVDのISOイメージ (Rocky-8.3-x86_64-dvd1.iso) は8.6GBもあるため、容量が大きすぎて困る場合は、minimal (Rocky-8.3-x86_64-minimal.iso) をダウンロードし、必要なパッケージは別途インストールしても問題ない。

今回は、minimalをダウンロードしてインストールを行う。

2. ESXiにて仮想マシンを作成

ESXiの仮想マシンは以下設定にて作成する。

  • ゲストOSのファミリ : Linux
  • ゲストOSのバージョン : その他の Linux 4.x 以降 (64 ビット)
  • [仮想マシンのオプション] → [UEFIセキュアブートの有効化] : チェックを外す

CentOS 8と異なり「UEFIセキュアブートの有効化」のチェックが有効のままではインストールが開始できないので、必ずチェックを外すこと。

もし、チェックをしたままだと「ERROR Verification failed: (0x1A) Security Violation」のメッセージが表示され、ISOイメージからの起動ができない。なお、OSインストール後に有効に戻してもRocky Linuxは起動できないことを確認している。

3. RHELやCentOSと同様にインストール

ISOイメージからブートしてしまえば、RHELやCentOSでおなじみのインストールウィザードが開始される。最低限、言語設定、時刻と日付 (タイムゾーン)、rootパスワード、インストール先を設定し、インストールを開始する。なお、Rocky Linuxでは「ソフトウェアの選択」がデフォルトでは「サーバー」になっている。少しでも不要なパッケージをインストールしたくない場合は、「最小限のインストール」に変更すること。

4. インストール後、ログイン

インストール後、仮想コンソールを使ってrootでログインし、nmtuiなどを使ってネットワークの設定を行う。

なお、redhat-releaseを確認したところ、以下の通り「Rocky Linux 8.3」となっていることが確認できた。

# cat /etc/redhat-release
Rocky Linux release 8.3

5. open-vm-toolsをインストール

ネットワークの設定を行いインターネットに接続できるようになったら、dnfにてopen-vm-toolsをインストールする。

# dnf install open-vm-tools -y
Rocky Linux 8 - AppStream                       3.7 MB/s | 6.7 MB     00:01
Rocky Linux 8 - BaseOS                          5.5 MB/s | 2.5 MB     00:00
Rocky Linux 8 - Extras                          2.8 kB/s | 1.6 kB     00:00
依存関係が解決しました。
================================================================================
 パッケージ           Arch        バージョン               リポジトリー   サイズ
================================================================================
インストール:
 open-vm-tools        x86_64      11.1.0-2.el8             appstream      716 k
依存関係のインストール:
 fuse                 x86_64      2.9.7-12.el8             baseos          81 k
 fuse-common          x86_64      3.2.1-12.el8             baseos          20 k
 libdrm               x86_64      2.4.101-1.el8            appstream      164 k
 libmspack            x86_64      0.7-0.3.alpha.el8.4      appstream       69 k
 libpciaccess         x86_64      0.14-1.el8               baseos          31 k
 libtool-ltdl         x86_64      2.4.6-25.el8             baseos          57 k
 libxslt              x86_64      1.1.32-5.el8             baseos         248 k
 pciutils             x86_64      3.6.4-2.el8              baseos         101 k
 tar                  x86_64      2:1.30-5.el8             baseos         837 k
 xmlsec1              x86_64      1.2.25-4.el8             appstream      191 k
 xmlsec1-openssl      x86_64      1.2.25-4.el8             appstream       94 k

トランザクションの概要
================================================================================
インストール  12 パッケージ

ダウンロードサイズの合計: 2.5 M
インストール済みのサイズ: 7.6 M
パッケージのダウンロード:
(1/12): libmspack-0.7-0.3.alpha.el8.4.x86_64.rp  22 MB/s |  69 kB     00:00
(2/12): xmlsec1-1.2.25-4.el8.x86_64.rpm          66 MB/s | 191 kB     00:00
(3/12): xmlsec1-openssl-1.2.25-4.el8.x86_64.rpm  46 MB/s |  94 kB     00:00
(4/12): fuse-2.9.7-12.el8.x86_64.rpm             79 MB/s |  81 kB     00:00
(5/12): open-vm-tools-11.1.0-2.el8.x86_64.rpm    65 MB/s | 716 kB     00:00
(6/12): fuse-common-3.2.1-12.el8.x86_64.rpm      19 MB/s |  20 kB     00:00
(7/12): libpciaccess-0.14-1.el8.x86_64.rpm       31 MB/s |  31 kB     00:00
(8/12): libtool-ltdl-2.4.6-25.el8.x86_64.rpm     55 MB/s |  57 kB     00:00
(9/12): libxslt-1.1.32-5.el8.x86_64.rpm         144 MB/s | 248 kB     00:00
(10/12): libdrm-2.4.101-1.el8.x86_64.rpm         11 MB/s | 164 kB     00:00
(11/12): pciutils-3.6.4-2.el8.x86_64.rpm        9.9 MB/s | 101 kB     00:00
(12/12): tar-1.30-5.el8.x86_64.rpm               21 MB/s | 837 kB     00:00
--------------------------------------------------------------------------------
合計                                            7.2 MB/s | 2.5 MB     00:00

~(中略)~

インストール済み:
  fuse-2.9.7-12.el8.x86_64            fuse-common-3.2.1-12.el8.x86_64
  libdrm-2.4.101-1.el8.x86_64         libmspack-0.7-0.3.alpha.el8.4.x86_64
  libpciaccess-0.14-1.el8.x86_64      libtool-ltdl-2.4.6-25.el8.x86_64
  libxslt-1.1.32-5.el8.x86_64         open-vm-tools-11.1.0-2.el8.x86_64
  pciutils-3.6.4-2.el8.x86_64         tar-2:1.30-5.el8.x86_64
  xmlsec1-1.2.25-4.el8.x86_64         xmlsec1-openssl-1.2.25-4.el8.x86_64

完了しました!

open-vm-toolsがインストールされると、ESXiでもホスト名やIPアドレスを認識するようになる。

以上でRocky Linuxのインストールが完了となる。

2021年5月4日火曜日

ESXi上のLinux仮想マシンでCD/DVDドライブ接続解除時の「質問の回答」を回避する方法

ESXi上で稼働しているLinux仮想マシンでは、仮想CD/DVDドライブの「接続」チェックを解除しようとすると、以下のような「質問の回答」が表示されて、回答するまで仮想マシンの応答が停止してしまう。

ゲスト OS が CD-ROM ドアをロックしてその CD-ROM を使用している可能性があります。これにより、ゲストがメディアの変更を認識できなくなる可能性があります。可能な場合は、接続を切断する前に、ゲスト内から CD-ROMを取り出してください。切断を続行しますか (そしてロックをオーバーライドしますか)?

※上記質問に「はい」を答えれば接続が解除され「いいえ」を答えれば接続したままになる。

これは昔からある事象であり、みんな回避方法を常識として知っていたのかもしれないが、私自身が長年vSphere製品に携わっていたのに知らずに過ごしていた(いつも「質問の回答」が表示されたら「はい」を選択していた)。

今回、長年知らなかった回避方法を実際に試してみたので以下に記載する。

eject cdromを実行する

もっとも簡単な方法は、OSにてejectコマンドを実行することだ。

[root@localhost ~]# eject cdrom

ejectコマンドを実行すると、仮想CD/DVDドライブの「接続」を解除してくれる。以下は、ejectコマンド実行後の仮想マシンの「設定の編集」が面となる。

ただし、単純にejectコマンドを実行すると何のプロンプトも返らないので、成功か失敗かよくわからなくなる。そこで、-vオプションを使って詳細表示をさせるとわかりやすいだろう。

[root@localhost ~]# eject -v cdrom
eject: device name is `/dev/sr0'
eject: /dev/sr0: not mounted
eject: /dev/sr0: is whole-disk device
eject: /dev/sr0: is removable device
eject: /dev/sr0: trying to eject using CD-ROM eject command
eject: CD-ROM eject command succeeded

なお、ejectコマンドはCD/DVDドライブのアンマウント処理も同時に実施してくれるため、マウント後のumountコマンドによるアンマウント手順は不要となる。以下にマウント状態でのejectコマンドを実行した場合の動作を記載する。

[root@localhost ~]# mount cdrom /mnt/
mount: special device cdrom does not exist
[root@localhost ~]# eject -v cdrom
eject: device name is `/dev/sr0'
eject: /dev/sr0: mounted on /mnt
eject: /dev/sr0: is whole-disk device
eject: /dev/sr0: is removable device
eject: /mnt: unmounting
eject: /dev/sr0: trying to eject using CD-ROM eject command
eject: CD-ROM eject command succeeded

仮想マシンの詳細設定にcdrom.showIsoLockWarningmsg.autoanswerを設定する

個人的には毎回仮想マシン構築時に設定する手間も発生することから、おすすめはできない設定となる。

仮想マシンの「設定の編集」→「仮想マシンオプション」→「構成パラメータ」の「構成の編集」ボタンを選択し、以下2行のパラメータを追加する。この設定はOS起動状態で反映可能である。

パラメータ 値 (接続解除させないパターン) 値 (強制切断パターン)
cdrom.showIsoLockWarning TRUE FALSE
msg.autoanswer TRUE TRUE

参考

2021年4月27日火曜日

DockerコンテナのベースイメージをCentOSからAlmaLinuxに移行する

先日正式リリースされたAlmaLinuxについて、ESXi上の仮想マシンとしてインストールする手順を以下に記載した。

インストール手順や使い勝手は、当然RHEL 8やCentOS 8と遜色なく使えることは確認できていたので、今回はDockerコンテナとして使用するベースイメージをCentOSからAlmaLinuxに移行することにした。

具体的には、CentOSをベースイメージとしたSquid、Postfix、Unboundのコンテナ用のDockerfileを流用し、ベースイメージのみCentOSからAlmaLinuxに変更を行うだけで、AlmaLinuxのコンテナが動作することの確認を行った。

環境

  • Docker : 19.03.14
  • コンテナ : Squid用コンテナ
なお、CentOSをベースイメージとしたコンテナ作成時の記事は以下を参照すること。

ベースイメージ変更手順

1. AlmaLinuxのイメージを取得

AlmaLinuxのイメージ名をまずは入手するため、docker searchで検索してみる。いくつかイメージが表示されるが、「AlmaLinux OS official images」と記載されているAlmaLinux/AlmaLinuxとなる。

# docker search almalinux
NAME                                 DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
almalinux/almalinux                  AlmaLinux OS official images                    5
iloreto/almalinux                    AlmaLinux with Epel                             1
dokken/almalinux-8                   Alma Linux 8 image for use with the kitchen-…   0
wstein/almalinux                      AlmaLinux based image with my preferred min…   0
mhaluska/almalinux-php               Container based on AlmaLinux with Apache2 an…   0
roccqqck/almalinux-ssh               almalinux openssh-server                        0
ols3/almalinux                       My AlmaLinux                                    0
markagarcia/almalinux.v01.20210416                                                   0
glillico/docker-almalinux8-ansible   A docker container using AlmaLinux OS 8 with…   0

Docker HubのURLは以下となる。

本イメージをdocker pullで入手する。

# docker pull almalinux/almalinux
Using default tag: latest
latest: Pulling from almalinux/almalinux
e021aab3e135: Pull complete
Digest: sha256:9f581292c4e3af29008a0abb1e219b04825953aac33c1168fc0dc7b7bb8f3bbb
Status: Downloaded newer image for almalinux/almalinux:latest
docker.io/almalinux/almalinux:latest

# docker images almalinux/almalinux
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
almalinux/almalinux   latest              c2fc9360164e        6 days ago          233MB

2. Dockerfileを編集

CentOS用で作成済みのDockerfileはそのまま流用できると想定し、以下★箇所に記載のFROMのベースイメージ指定をcentosからalmalinux/almalinuxに修正する。

# cat Dockerfile
FROM almalinux/almalinux ★

ENV TZ=Asia/Tokyo \
    http_proxy=http://192.168.33.23:8080 \
    https_proxy=http://192.168.33.23:8080
RUN dnf install squid -y

COPY squid.conf /etc/squid/
RUN /usr/sbin/squid -N -z

EXPOSE 8080
CMD ["/usr/sbin/squid", "-N", "-f", "/etc/squid/squid.conf"]

3. イメージをビルド

先ほど修正したDockerfileを使用して、docker buildでイメージをビルドする。特にエラーなく一発でイメージ作成が成功するはずだ。

# docker build -t almalinux-squid:1 .
Sending build context to Docker daemon   5.12kB
Step 1/7 : FROM almalinux/almalinux
 ---> c2fc9360164e
Step 2/7 : ENV TZ=Asia/Tokyo     http_proxy=http://192.168.33.23:8080     https_proxy=http://192.168.33.23:8080
 ---> Running in 2f389328fe79
Removing intermediate container 2f389328fe79
 ---> aeeb11d5bf8a
Step 3/7 : RUN dnf install squid -y
 ---> Running in 0a9131d735d2
determining the fastest mirror (91 hosts).. done.
AlmaLinux 8 - BaseOS                            1.0 MB/s | 4.4 MB     00:04
AlmaLinux 8 - AppStream                         1.7 MB/s | 6.9 MB     00:04
AlmaLinux 8 - PowerTools                        798 kB/s | 2.1 MB     00:02
AlmaLinux 8 - Extras                            6.2 kB/s | 3.6 kB     00:00

~(中略)~

Step 7/7 : CMD ["/usr/sbin/squid", "-N", "-f", "/etc/squid/squid.conf"]
 ---> Running in 8dd10f52851d
Removing intermediate container 8dd10f52851d
 ---> 45a92ef9bfe7
Successfully built 45a92ef9bfe7
Successfully tagged almalinux-squid:1

4. AlmaLinuxのコンテナを起動

docker runで起動させると問題なく起動にも成功した。

# docker run -d -p 8080:8080 --name "almalinux-squid" -v /var/log/docker/almalinux-squid:/var/log/squid almalinux-squid:1
50204f614b2357739e090c2947769369942ae85d4a3d7b8faab9b01db17d9972

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
50204f614b23        almalinux-squid:1   "/usr/sbin/squid -N …"   3 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   almalinux-squid

まとめ

AlmaLinuxはCentOS 8の代替ディストリビューションとしてリリースされたというだけあって、Dockerfileに記載のベースイメージの変更を行うだけで、問題なくコンテナが起動することが確認できた。

本記事ではSquidのコンテナのみ実行結果を記載したが、PostfixやUnboundにおいても、ベースイメージ変更は問題なく実施できており、AlmaLinuxへの移行は簡単できることを確認できた。

2021年4月25日日曜日

ZabbixでSNMPを使ってネットワーク機器のトラフィック量を取得する

ZabbixではSNMPを使って機器を監視する機能があり、特にネットワーク機器ではトラフィック量などを取得する場合に便利な機能となる。

今回は仮想ネットワークOSであるVyOSに対して、ZabbixからSNMPによる監視設定を行い、各インタフェースに発生しているトラフィック量をグラフで表示させる手順を記載する。

環境

  • Zabbix 5.0.10
  • VyOS 1.3

手順

1. 取得対象機器でSNMPを有効化

ZabbixでSNMPによる監視を実施するために、事前に監視対象機器にてSNMPの有効化を行う。

今回はVyOSの監視設定となるので、対象のVyOSにて以下の通り設定を行う。community名「public」をread-onlyで設定している。

# show service snmp
 community public {
     authorization ro
 }
 trap-source 192.168.11.33
 trap-target 192.168.11.24 {
     community public
 }

2. snmpwalkによるSNMP情報取得確認

取得対象スイッチ側で、SNMPを使って情報取得ができることを事前に確認しておく。ZabbixのOSにログインし、snmpwalkコマンドで確認すればよい。snmpwalkの使い方は以下の通り。

snmpwalk -v 2c -c <SNMP community名> <対象機器のIPアドレス>

snmpwalkを実行すると大量の情報が表示される。もし表示されないようであれば、情報取得対象の設定やコミュニティ名が誤っているなどが考えられるため、設定を確認しよう。

試しに私の環境でsnmpwalkすると以下のような表示結果となる。

# snmpwalk  -v 2c -c public 192.168.33.33
SNMPv2-MIB::sysDescr.0 = STRING: VyOS 1.3-rolling-202012311144
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.44641
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (10170228) 1 day, 4:15:02.28

~(中略)~

IF-MIB::ifNumber.0 = INTEGER: 3
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: VMware VMXNET3 Ethernet Controller
IF-MIB::ifDescr.3 = STRING: VMware VMXNET3 Ethernet Controller

~(中略)~

SNMPv2-SMI::mib-2.207.1.2.5.1.12.2.10.1 = Timeticks: (0) 0:00:00.00
SNMPv2-SMI::mib-2.207.1.2.5.1.12.3.10.1 = Timeticks: (0) 0:00:00.00
SNMPv2-SMI::mib-2.207.1.2.5.1.13.2.10.1 = Gauge32: 1000
SNMPv2-SMI::mib-2.207.1.2.5.1.13.3.10.1 = Gauge32: 1000

4. SNMP監視用のテンプレート「Template Module Interfaces Simple SNMPv2」を複製

SNMP機器の監視には、あらかじめZabbixに用意されている「Template Net Network Generic Device SNMPv2」を利用する。ただし、一部修正が必要となるため、本テンプレートを複製したのち修正を行うことにする。

「テンプレート」から「Template Module Interfaces Simple SNMPv2」を選択し、「すべて複製」を選択し、テンプレートを複製する。

今回は「Template Module Interfaces Simple SNMPv2 SNMPINDEX」という名称で複製を作成した。

5. ディスカバリルールのアイテムとグラフの名前を修正

「Template Module Interfaces Simple SNMPv2」をVyOSのような仮想ネットワークOSに対して適用すると、ディスカバリルールにて、以下エラーメッセージが表示される。

Cannot create graph: graph with the same name "Interface VMware VMXNET3 Ethernet Controller: Network traffic" already exists.

これは、SNMPのifDescrの値が重複しており、アイテムやグラフの名前が重複し作成に失敗したことを示すエラーとなる。エラーとなった場合は、情報が正しく取得・表示ができないので、修正対応を行う。

複製したテンプレートの「ディスカバリルール」にて、「Network interfaces discovery」を選択する。

ここで表示される「アイテムのプロトタイプ」と「グラフのプロトタイプ」にて、以下の通りアイテムとグラフの名前にifIndexの番号となる{#SNMPINDEX}を付与する。ifIndexはインタフェース毎に連番となり重複しないため、ifDescrが重複したとしても、異なるアイテム、グラフが作成される

Interface {#IFDESCR}: XXXX
   ↓
Interface {#IFDESCR} {#SNMPINDEX}: XXXX

▼アイテムのプロトタイプ


▼グラフのプロトタイプ


なお、普通のスイッチであればifDescrが重複することはないと思われる。例えばCiscoスイッチであれば、”GigabitEthernet 0/0”といった値で表示される。

6. 「Template Net Network Generic Device SNMPv2」のテンプレートを修正

「Template Net Network Generic Device SNMPv2」のテンプレートから「Template Module Interfaces Simple SNMPv2」を削除し代わりに複製した「Template Module Interfaces Simple SNMPv2 SNMPINDEX」を追加する。

7. ホストにSNMPインタフェースを設定

「設定」→「ホスト」にて監視対象ホストを選択し、「SNMPインターフェース」の箇所に、IPアドレスとポート番号(通常は161)を設定する。

8. ホストにテンプレートをリンク

ホストの設定のテンプレートに「Template Net Network Generic Device SNMPv2」を追加する。

1時間ほど待つと、特にエラーもなくSNMP情報の取得に成功するはずだ。取得されたインターフェースのトラフィック量は、グラフにて確認できる。MRTGなどと同じように、Incoming traffic (ポートから見て入力方向)とOutgoing traffic (ポートから見て出力方向)が一つのグラフで表示されるという一般的なものであり、他の監視ソフトを使っている人であっても違和感はないだろう。

以上で設定は完了となる。

VyOSの仕様によりテンプレートの修正対応が必要だったが、普通のスイッチであれば、ホストを登録し「Template Net Network Generic Device SNMPv2」のテンプレートをリンクするだけで設定が完了する。このようにZabbixでは、非常に簡単にネットワーク機器の監視が実現できる。

更新履歴

  • 2017/9/14 新規作成
  • 2021/4/25 Zabbix 5.0の環境に合わせて全面刷新

人気の投稿