2016年5月21日土曜日

Linuxのプロンプトに時間を表示させる

プロンプトに時間表示があると、作業ログを確認する際に各コマンドの実行時間が把握できてよいという小ネタ。

環境変数で設定すれば良い。私はプロンプトが長すぎると嫌なので、時間のみを表示させるようにした。

・時間のみ
# PS1='[\u@\h `date +"%H%M%S"`]\$ '
[root@t3022ce67 223648]#

・日+時間①
# PS1='[\u@\h `date +"%y%m%d %H%M%S"`]\$ '
[root@t3022ce67 160520 223612]#

・日+時間②
# PS1='[\u@\h `date +"%Y%m%d %H%M%S"`]\$ '
[root@t3022ce67 20160520_223219]#

ログイン時に常に変える場合は、.bash_profileに上記コマンドをそのまま記載して、exportに足せば良い。

# vi .bash_profile
--------------------
PATH=$PATH:$HOME/bin
PS1='[\u@\h `date +"%H%M%S"`]\$ '

export PATH PS1
--------------------

2016年5月15日日曜日

yumでローカルに保存したrpmを一括適用する方法

ローカルのディレクトリにあるrpmについて、yumの機能を用いて依存関係を考慮して適用したいことがある。ということで、過去の記事でローカルのディレクトリをレポジトリ登録する方法を記載したが、そんなことはしなくても、もっと簡単な方法があった。

yum localinstallを使う

yumに機能がそもそもあったという話。rpmを配置したディレクトリに移動し、以下コマンドを実行するだけでよい。サブスクリプションの設定も不要。

# yum localinstall *
-------------------------
読み込んだプラグイン:product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
ローカルパッケージ処理の設定をしています
ConsoleKit-0.4.1-6.el6.x86_64.rpm を調べています: ConsoleKit-0.4.1-6.el6.x86_64
次のリポジトリーへの更新として ConsoleKit-0.4.1-6.el6.x86_64.rpm を設定します: ConsoleKit-0.4.1-3.el6.x86_64
ConsoleKit-libs-0.4.1-6.el6.x86_64.rpm を調べています: ConsoleKit-libs-0.4.1-6.el6.x86_64
次のリポジトリーへの更新として ConsoleKit-libs-0.4.1-6.el6.x86_64.rpm を設定します: ConsoleKit-libs-0.4.1-3.el6.x86_64
Red_Hat_Enterprise_Linux-Release_Notes-6-en-US-8-2.el6.noarch.rpm を調べています: Red_Hat_Enterprise_Linux-Release_Notes-6-en-US-8-2.el6.noarch

~(中略)~


トランザクションの要約
================================================================================
インストール         3 パッケージ
アップグレード     250 パッケージ

合計容量: 899 M
これでいいですか? [y/N] y   ←★ここでyを押せばインストール&更新が開始
-------------------------

ちなみに、似たようなものにyum localupdateというものもあるのだが、なぜかうまくいかなかった。yum localinstallでもきちんとインストールとアップグレードを実施できるので、特に問題ないので詳しくは調べていない。

# yum localupdate *
-------------------------
読み込んだプラグイン:product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
ローカルパッケージ処理の設定をしています
ConsoleKit-0.4.1-6.el6.x86_64.rpm を調べています: ConsoleKit-0.4.1-6.el6.x86_64
次のリポジトリーへの更新として ConsoleKit-0.4.1-6.el6.x86_64.rpm を設定します: ConsoleKit-0.4.1-3.el6.x86_64
ConsoleKit-libs-0.4.1-6.el6.x86_64.rpm を調べています: ConsoleKit-libs-0.4.1-6.el6.x86_64
次のリポジトリーへの更新として ConsoleKit-libs-0.4.1-6.el6.x86_64.rpm を設定します: ConsoleKit-libs-0.4.1-3.el6.x86_64
Red_Hat_Enterprise_Linux-Release_Notes-6-en-US-8-2.el6.noarch.rpm を調べています: Red_Hat_Enterprise_Linux-Release_Notes-6-en-US-8-2.el6.noarch

~(中略)~

--> 依存性解決を終了しました。
エラー: パッケージ: 1:java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64 (/java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64)
             要求: libsctp.so.1(VERS_1)(64bit)
エラー: パッケージ: 1:java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64 (/java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64)
             要求: libsctp.so.1()(64bit)
エラー: パッケージ: 1:java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64 (/java-1.7.0-openjdk-1.7.0.101-2.6.6.4.el6_8.x86_64)
             要求: libpcsclite.so.1()(64bit)
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest
-------------------------


2016年5月14日土曜日

Linuxのネットワークチーミング(Bonding)の設定

物理サーバを構築する際は、NICをチーミングし冗長構成を取ることが鉄板となっている。今までWindowsであればチーミングの設定を実施したことはあったが、Linuxでは実施したことがなかった。

LinuxにおいてはOS標準でBondingと呼ばれるチーミング機能が備わっているので、勉強のために設定してみた。

事前確認

まずは、何もしていない状態でNICのステータスを確認する。eth0とeth1が存在し、eth0だけにIPアドレスが設定されている状況となっている。この状態から、eth0とeth1のBonding設定を行う。

# ifconfig -a
---------------------------
eth0      Link encap:Ethernet  HWaddr 00:0C:29:A9:38:65
          inet addr:192.168.11.111  Bcast:192.168.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:496551 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12338 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:33709638 (32.1 MiB)  TX bytes:3731810 (3.5 MiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:A9:38:6F
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
---------------------------

Bonding設定

以下の手順で設定する。

①カーネルパラメータの設定

Bondingを有効化するためのカーネルパラメータの設定ファイルを新規作成する。

/etc/modprobe.d/bonding.conf
---------------------------
alias bond0 bonding
---------------------------

②bond0のインターフェースの設定

チーミングした場合、実際のNICにはIPアドレスは設定せず、bond0のデバイスに設定することになる。チーミングに関する各種設定についても、このファイルの「BONDING_OPTS」という項目にてスペース区切りで記載する。

チーミングのオプションは以下を参照すること。

・25.7.2. チャンネルボンディングの使用
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sec-Using_Channel_Bonding.html

今回は以下の設定を行った。

---------------------------
 mode=1                    ←切り替わりモードの設定(1はactive-backup)
 miimon=100               ←NICの監視感覚(単位:ms)
 primary=eth0             ←Bondingデバイス起動時の優先NIC
 primary_reselect=0      ←優先NIC復旧時に自動で戻るようにするか(0は自動で優先NICに戻る)
---------------------------

/etc/sysconfig/network-scripts/ifcfg-bond0
---------------------------
DEVICE=bond0
IPADDR=192.168.11.111
NETMASK=255.255.255.0
GATEWAY=192.168.11.31
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="mode=1 miimon=100 primary=eth0 primary_reselect=0"
---------------------------

③bond0に複数IPアドレスを設定

Bondingであっても、1つのデバイスに複数IPの設定が可能なので、2つめのIPアドレス設定のデバイスファイルを作成する。こちらには、チーミングのオプション設定は不要。

/etc/sysconfig/network-scripts/ifcfg-bond0:1
---------------------------
DEVICE=bond0:1
IPADDR=192.168.11.112
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=none
---------------------------

④eth0の設定

eth0は現状使用中のNICなので、バックアップを取得してから作り直すと良い。なお、Linuxのnetworkサービスは、本ディレクトリ内のファイルでifcfg-*で始まるものを読み込む仕様の模様。バックアップファイルを同じディレクトリに作る場合は、不要な設定ファイルの読み込みが発生しないよう、ファイル名には注意する。具体的には、バックアップの保存ディレクトリを別にするか、.bakを付ければ読み込まない仕様なのでそのように対処しても良い。

<良いバックアップファイル名>
 20160514_ifcfg-eth0
 ifcfg-eth0_20160514.bak

<悪いバックアップファイル名>
 ifcfg-eth0_20160514

設定は以下のとおり。IPアドレスやゲートウェイの設定を削除し、MASTER、SLAVEといった値を設定する。

/etc/sysconfig/network-scripts/ifcfg-eth0
---------------------------
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
MASTER=bond0
SLAVE=yes
NM_CONTROLLED=no
BOOTPROTO=none
HWADDR=00:0C:29:A9:38:65
---------------------------

⑤eth1の設定

eth1もeth0と同様に設定する。eth0のifcfg-eth0の設定をコピーしてDEVICEとHWADDRを変更するだけで作れる。

/etc/sysconfig/network-scripts/ifcfg-eth1
---------------------------
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
MASTER=bond0
SLAVE=yes
NM_CONTROLLED=no
BOOTPROTO=none
HWADDR=00:0C:29:A9:38:6F
---------------------------

Bonding有効化

networkサービスをリスタートし、設定ファイルの読み込みを行う。なお、ifcfg-eth0を変更してしまっているので、初回だけエラーが出力される。
※「Determining if ip address ~」のメッセージについては後述

# service network restart
---------------------------
インターフェース eth0 を終了中:  /etc/sysconfig/network-scripts/ifdown-eth: line 121: /sys/class/net/bond0/bonding/slaves: そのようなファイルやディレクトリはあ りません
                                                           [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース bond0 を活性化中:  Determining if ip address 192.168.11.111 is already in use for device bond0...
Determining if ip address 192.168.11.112 is already in use for device bond0...
                                                           [  OK  ]
---------------------------

2回目のリスタートは問題なし。

# service network restart
---------------------------
インターフェース bond0 を終了中:  [  OK  ]
ループバックインターフェースを終了中  [  OK  ]
ループバックインターフェイスを呼び込み中 [  OK  ]
インターフェース bond0 を活性化中:  Determining if ip address 192.168.11.111 is already in use for device bond0...
Determining if ip address 192.168.11.112 is already in use for device bond0...
[  OK  ]
---------------------------

最終的に以下の通りインターフェースが設定された。bond0、bond0:1にIPアドレスが設定されており、eth0とeth1はSLAVEとして起動していることがわかる。

# ifconfig -a
---------------------------
bond0     Link encap:Ethernet  HWaddr 00:0C:29:A9:38:65
          inet addr:192.168.11.111  Bcast:192.168.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:2574 errors:0 dropped:0 overruns:0 frame:0
          TX packets:648 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:401668 (392.2 KiB)  TX bytes:182251 (177.9 KiB)

bond0:1   Link encap:Ethernet  HWaddr 00:0C:29:A9:38:65
          inet addr:192.168.11.112  Bcast:192.168.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1

eth0      Link encap:Ethernet  HWaddr 00:0C:29:A9:38:65
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:44 errors:0 dropped:0 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3720 (3.6 KiB)  TX bytes:3832 (3.7 KiB)

eth1      Link encap:Ethernet  HWaddr 00:0C:29:A9:38:65
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:54 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:4320 (4.2 KiB)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
---------------------------

Bondingの詳細なステータスは以下ファイルを確認すればわかる。

/proc/net/bonding/bond0
---------------------------
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0   ←★eth0がActive
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:a9:38:65
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:a9:38:6f
Slave queue ID: 0
---------------------------

切り替えテスト

eth0を切断してみると以下のとおりになる。1秒毎にpingを打っていたが欠けは無し。

/proc/net/bonding/bond0
---------------------------
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth1   ←★eth1に切り替わる
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: down   ←★downになる
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1   ←★+1される
Permanent HW addr: 00:0c:29:a9:38:65
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:a9:38:6f
Slave queue ID: 0
---------------------------

eth0を接続し直すと、「primary_reselect always」の設定が入っているので自動で切り戻る。こちらもping欠けは無し。

/proc/net/bonding/bond0
---------------------------
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: eth0 (primary_reselect always)
Currently Active Slave: eth0   ←★eth0に切り替わる
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:0c:29:a9:38:65
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:a9:38:6f
Slave queue ID: 0
---------------------------

「Determining if ip address ~」のメッセージについて

Bondingの話とは直接関係ない話となるが、networkサービスリスタート時に出力される「Determining if ip address ~」のメッセージについて説明しておく。これはエラーメッセージではなく、割り当てようとしているIPアドレスが他機器で利用されていないかチェックする機能による出力メッセージとなる。

例えばあえて重複するIPアドレスを設定してみると、以下のとおり「Error, some other host already uses address ~」と表示され、対象のインターフェースは活性化されない。

# service network restart
---------------------------
インターフェース bond0 を終了中:                           [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース bond0 を活性化中:  Determining if ip address 192.168.11.111 is already in use for device bond0...
Determining if ip address 192.168.11.110 is already in use for device bond0...
Error, some other host already uses address 192.168.11.110.
                                                           [  OK  ]
---------------------------

この機能を止めたい場合は前段で設定したifcfg-*のファイルに「ARPCHECK=no」のオプションを追加すればよいらしい。ただし、有効にしておくことの影響はないと思うので、万が一IPアドレスが重複してしまうような場合を想定して有効のままにすることをお勧めする。


2016年5月7日土曜日

Red Hat Enterprise LinuxやCentOSでローカルディレクトリをyumのリポジトリとして設定する方法

Redhat Enterprise Linux(RHEL)やCentOSでyumを使う場合、インターネットへ接続する必要がある。しかし、インターネットに接続することはネットワークポリシーやセキュリティ上難しい環境だったりする場合が多々あって、利用するのに難儀することが多い。

とはいえ最新のパッケージを適用することもセキュリティ上重要なので、以下の様な手順にて実施することを考える。

 ①一台、yum用のインターネットに接続するLinuxを構築
 ②上記のLinuxにてyumを利用して最新のrpmパッケージをダウンロード
 ③ダウンロードしたrpmパッケージを実際に適用するサーバーへコピー
 ④ローカルディレクトリをyumリポジトリとして登録し、パッケージを適用

# (2016/5/15追記)
#  上記④についてもっと簡単な方法があった。詳細は別記事参照

ただし、上記方法はyum用のLinuxサーバを別に構築する必要があって、それなりの手間が発生してしまう。さらに、RHELの場合はサブスクリプションが1台分余計に用意する必要があるということで、コスト面でもデメリットがある点に注意。

(RHELのみ)サブスクリプション登録

RHELの場合はyumを利用する場合は最初にサブスクリプションの登録作業が必要となる。今回30日の評価版サブスクリプションにて実施する。

まず、何もしていない状態でyumを実行すると「サブスクリプションが登録されてないよ」というエラーが出力される。

# yum check-update
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
--------------------------

以下コマンドにてサブスクリプションの確認を行うと、状態が不明となっていることがわかる。

# subscription-manager list
--------------------------
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       6.7
アーキテクチャー: x86_64
状態:             不明
状態の詳細:    
開始:          
終了:          
--------------------------

まずは、サブスクリプションが紐づくRed Hatアカウントの登録を行う。

# subscription-manager register
--------------------------
ユーザー名: <Red Hatアカウント名>
パスワード: <上記のパスワード>
このシステムは次の ID で登録されました: 6956a621-f62a-4fcd-97cb-xxxxxxxxxxxx
--------------------------

再度確認。今度は状態が「サブスクライブしていません」になる。

# subscription-manager list
--------------------------
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       6.7
アーキテクチャー: x86_64
状態:             サブスクライブしていません
状態の詳細:       有効なサブスクリプションでサポートされていません
開始:          
終了:          
--------------------------

次に利用可能なサブスクリプション一覧を確認する。評価版の30日サブスクリプションが存在することがわかる。赤字箇所の「プールID」をコピーしておく。

# subscription-manager list --available
--------------------------
+-------------------------------------------+
    利用可能なサブスクリプション
+-------------------------------------------+
サブスクリプション名:     30 Day Red Hat Enterprise Linux Server Self-Supported
                          Evaluation
提供:                     Red Hat Container Images Beta
                          Red Hat Beta
                          Red Hat Enterprise Linux Atomic Host Beta
                          Oracle Java (for RHEL Server)
                          Red Hat Container Images
                          Red Hat Enterprise Linux Server
                          Red Hat Enterprise Linux Atomic Host
SKU:                      RH00065
契約:                     10947308
プール ID:                8a85f981542c878e0154xxxxxxxxxxxx
管理の提供:               いいえ
数量:                     2
推奨:                     1
サービスレベル:           Self-Support
サービスタイプ:           L1-L3
サブスクリプションタイプ: インスタンスベース
終了:                     2016年05月19日
システムタイプ:           物理
--------------------------

先ほど確認したプールIDを指定して、サブスクリプションの割り当てを実施。

# subscription-manager subscribe --pool=8a85f981542c878e0154xxxxxxxxxxxx
--------------------------
サブスクリプションが正しく割り当てられました: 30 Day Red Hat Enterprise Linux Server Self-Supported Evaluation
--------------------------

最後に確認。状態が「サブスクライブ済み」となればOK。

# subscription-manager list
--------------------------
+-------------------------------------------+
    インストール済み製品のステータス
+-------------------------------------------+
製品名:           Red Hat Enterprise Linux Server
製品 ID:          69
バージョン:       6.7
アーキテクチャー: x86_64
状態:             サブスクライブ済み
状態の詳細:    
開始:             2016年04月19日
終了:             2016年05月19日
--------------------------

yumの設定

ダウンロードしたrpmファイルを消さない設定をするため、yum.confを編集する。

/etc/yum.conf
--------------------------
cachedir=/var/cache/yum/$basearch/$releasever   ←★ダウンロードしたrpmの保存先。確認だけしておく
keepcache=1   ←★ダウンロードしたrpmを消さない設定。0→1へ変更
--------------------------

また、環境によってはリポジトリの追加を実施する。今回は「rhel-6-server-optional-rpms」が必要となったので追加する。まずは、現状のリポジトリの一覧を確認する。

# yum repolist all
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
リポジトリー ID                                       リポジトリー  状態
rhel-6-server-beta-debug-rpms                         Red Hat Enter 無効
rhel-6-server-beta-rpms                               Red Hat Enter 無効

~(中略)~

rhel-6-server-optional-rpms                           Red Hat Enter 無効   ←★ここを有効化する

~(中略)~

rhel-6-server-rpms                                    Red Hat Enter 有効: 16,856

~(中略)~

rhel-source                                           Red Hat Enter 無効
rhel-source-beta                                      Red Hat Enter 無効
repolist: 16,856
--------------------------

有効化するコマンドは以下のとおりとなる。

# yum-config-manager --enable rhel-6-server-optional-rpms

再度確認。

# yum repolist all
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
リポジトリー ID                                       リポジトリー  状態
rhel-6-server-beta-debug-rpms                         Red Hat Enter 無効
rhel-6-server-beta-rpms                               Red Hat Enter 無効

~(中略)~

rhel-6-server-optional-rpms                           Red Hat Enter 有効:  9,520   ←★有効化された

~(中略)~

rhel-6-server-rpms                                    Red Hat Enter 有効: 16,856

~(中略)~

rhel-source                                           Red Hat Enter 無効
rhel-source-beta                                      Red Hat Enter 無効
repolist: 26,376
--------------------------

yumの実行

yumにてパッケージをインストールせずダウンロードだけするには「downloadonly」のオプションを付与する。

# yum update --downloadonly
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
更新処理の設定をしています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package SDL.x86_64 0:1.2.14-6.el6 will be 更新
---> Package SDL.x86_64 0:1.2.14-7.el6_7.1 will be an update
---> Package bash.x86_64 0:4.1.2-33.el6 will be 更新
---> Package bash.x86_64 0:4.1.2-33.el6_7.1 will be an update

~(中略)~

udev                     x86_64 147-2.63.el6_7.1      rhel-6-server-rpms 355 k
 zip                      x86_64 3.0-1.el6_7.1         rhel-6-server-rpms 259 k
依存性関連でのインストールをします。:
 pcsc-lite-libs           x86_64 1.5.2-15.el6          rhel-6-server-rpms  28 k

トランザクションの要約
================================================================================
インストール         2 パッケージ
アップグレード     123 パッケージ

総ダウンロード容量: 214 M
これでいいですか? [y/N]y
パッケージをダウンロードしています:
(1/125): SDL-1.2.14-7.el6_7.1.x86_64.rpm                 | 193 kB     00:00  
(2/125): bash-4.1.2-33.el6_7.1.x86_64.rpm                | 908 kB     00:00  
(3/125): bind-libs-9.8.2-0.37.rc1.el6_7.7.x86_64.rpm     | 887 kB     00:00  

~(中略)~

(123/125): tzdata-java-2016d-1.el6.noarch.rpm            | 180 kB     00:00  
(124/125): udev-147-2.63.el6_7.1.x86_64.rpm              | 355 kB     00:00  
(125/125): zip-3.0-1.el6_7.1.x86_64.rpm                  | 259 kB     00:00  
--------------------------------------------------------------------------------
合計                                            801 kB/s | 214 MB     04:33  
exiting because --downloadonly specified   ←★このメッセージが表示される
--------------------------

ダウンロードされたrpmパッケージは以下ディレクトリに保存されているので、別のディレクトリに退避するなどして保存しておくこと。

/var/cache/yum/x86_64/6Server/rhel-6-server-rpms/packages/
/var/cache/yum/x86_64/6Server/rhel-6-server-optiional-rpms/packages/

ちなみに、ダウンロードしたパッケージを削除する場合は以下コマンド。

# yum clean packages
--------------------------
読み込んだプラグイン:product-id, security, subscription-manager
リポジトリーを清掃しています: rhel-6-server-optional-rpms rhel-6-server-rpms
5 packageファイルを削除しました
--------------------------


ローカルディレクトリをyumのリポジトリにする

例として/root/update_rpmsをリポジトリとして設定する。先ほどダウンロードしたrpmパッケージを事前にこのディレクトリにコピーしておくこと。試しに、このディレクトリに移動して、単純にrpmですべてを適用しようとしても、エラーで弾かれてしまった。

# rpm -ivh *
--------------------------
ファイル /usr/bin/zip (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
ファイル /usr/bin/zipcloak (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
ファイル /usr/bin/zipnote (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
ファイル /usr/bin/zipsplit (パッケージ zip-3.0-1.el6_7.1.x86_64 から) は、パッケージ zip-3.0-1.el6.x86_64 からのファイルと競合しています。
--------------------------

しかし、yumであれば依存関係を考慮して一括で適用してくれるのでメリットがある。

まずは、createrepoのパッケージをインストールする。事前にyumでインストールするか、rpmパッケージで個別にインストールしておくこと。私の環境では、依存関係があるパッケージが追加で2つインストールされた。

# yum install createrepo
--------------------------
~(中略)~

インストール:
  createrepo.noarch 0:0.9.9-22.el6                                            

依存性関連をインストールしました:
  deltarpm.x86_64 0:3.5-0.5.20090913git.el6                                  
  python-deltarpm.x86_64 0:3.5-0.5.20090913git.el6                            

完了しました!
--------------------------

createrepoコマンドにて、リポジトリとして必要な処理を行う。

# createrepo /root/update_rpms
--------------------------
Spawning worker 0 with 125 pkgs
Workers Finished
Gathering worker results

Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
--------------------------

以下ファイルを新規作成し、local-repositoryという名前でリポジトリを設定する。

/etc/yum.repos.d/local.repo
--------------------------
[local-repository]
name=local repository
baseurl=file:///root/update_rpms/
gpgcheck=0
enabled=0
--------------------------

上記完了後、yumを実行してみる

# yum clean all   ←★一旦yumを綺麗にしておく

# yum repolist all   ←★リポジトリの一覧を確認
--------------------------
リポジトリー ID                                       リポジトリー  状態
local-repository                                      local reposit 有効:    125   ←★有効になっている
--------------------------

# yum check-update   ←★check-updateの実行でlocal-repositoryが参照されていればOK
--------------------------
~(中略)~

tzdata.noarch                        2016d-1.el6                local-repository
tzdata-java.noarch                   2016d-1.el6                local-repository
udev.x86_64                          147-2.63.el6_7.1           local-repository
zip.x86_64                           3.0-1.el6_7.1              local-repository
--------------------------

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

2016年5月4日水曜日

ZabbixでGmailを使って障害メールを送信する設定

Zabbixで検知した障害をメール送信させる際に、GmailのSMTPサーバを使って送信する設定メモ。

スクリプトのダウンロード・配置

Zabbixの標準機能では実装できないようなので、以下からメール送信用のスクリプトをダウンロードする。

zabbix-jp/plugins
※「Download ZIP」ボタンから「plugins-master.zip」をダウンロード
https://github.com/zabbix-jp/plugins

ダウンロードしたスクリプトを解凍し、zabbix-server.confの「AlertScriptsPath」で指定されたディレクトリへ、フォルダごと配置する。私の環境の場合の配置先は以下ディレクトリとなる。

/etc/zabbix/alertscripts/

スクリプトの設定パラメーター編集

配置したスクリプト/etc/zabbix/alertscripts/sendmessage-smtp-php/sendmessage_smtp_php.shに対して、vi等にてパラメーター編集を行う。Gmailを使う場合は以下のように設定すれば良い。

--------------------
$MAIL_FROM      = "zabbix@localhost";
$MAIL_FROMNAME  = "Zabbix 障害通知";
$MAIL_SMTP_HOST = 'ssl://smtp.gmail.com:465';
$MAIL_SMTP_USER = '<gmailユーザー名>';
$MAIL_SMTP_PASS = '<gmailユーザーのパスワード>';
--------------------

Zabbixの設定

◆「管理」→「メディアタイプ」にてスクリプトを登録。

・名前:sendmessage_smtp_php.sh
・タイプ:スクリプト
・スクリプト名:sendmessage-smtp-php/sendmessage_smtp_php.sh
 ※絶対パスではなく「AlertScriptsPath」からの相対パスで記載



◆「管理」→「ユーザー」にてメール送信先の設定を実施。

・タイプ:sendmessage_smtp_php.sh
・送信先:<送信先メールアドレス>
・有効な時間帯: 1-7,00:00-24:00
・指定した深刻度のときに使用:すべてにチェック



◆「設定」→「アクション」にてメール送信時の条件を設定。
・名前:send mail
・デフォルトの件名:{TRIGGER.STATUS}: {TRIGGER.NAME}
・デフォルトのメッセージ:
--------------------
Trigger: {TRIGGER.NAME}
Trigger status: {TRIGGER.STATUS}
Trigger severity: {TRIGGER.SEVERITY}
Trigger URL: {TRIGGER.URL}

Item values:

1. {ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1}
2. {ITEM.NAME2} ({HOST.NAME2}:{ITEM.KEY2}): {ITEM.VALUE2}
3. {ITEM.NAME3} ({HOST.NAME3}:{ITEM.KEY3}): {ITEM.VALUE3}

Original event ID: {EVENT.ID}
--------------------
・リカバリメッセージ:チェックなし



・計算のタイプ:(A) and (B) and (C)
・アクションの実行条件:
--------------------
(A) メンテナンスの状態 期間外 メンテナンス
(B) トリガーの値 = 障害
(C) トリガーの深刻度 >= 軽度の障害
--------------------



メール送信テスト

設定完了したら実際にメールが飛ぶが試してみる。例として、ESXiからSNMPのwarm startを受信した際のメールは以下の内容となる。

--------------------
【件名】
Zabbix 障害通知 <hogehoge@gmail.com>

【本文】
Trigger: SNMP Trap
Trigger status: PROBLEM
Trigger severity: Average
Trigger URL:

Item values:

1. SNMP Trap log (esx01:snmptrap[]): 06:02:10 2016/05/04 PDU INFO:
  notificationtype               TRAP
  version                        0
  receivedfrom                   UDP: [192.168.33.11]:20623->[192.168.33.22]
  errorstatus                    0
  messageid                      0
  community                      public
  transactionid                  69
  errorindex                     0
  requestid                      0
VARBINDS:
  DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (0) 0:00:00.00
  SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: SNMPv2-MIB::warmStart
  SNMP-COMMUNITY-MIB::snmpTrapAddress.0 type=64 value=IpAddress: 192.168.33.11
  SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4  value=STRING: "public"
  SNMPv2-MIB::snmpTrapEnterprise.0 type=6  value=OID: SNMPv2-MIB::snmpTraps
2. *UNKNOWN* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*
3. *UNKNOWN* (*UNKNOWN*:*UNKNOWN*): *UNKNOWN*

Original event ID: 200697
--------------------

参考資料

日本語アラートメールの送信方法
http://www.zabbix.jp/node/1441

2016年5月3日火曜日

ZabbixでESXiのSNMP Trapを監視する設定

自宅環境にZabbixを構築しており、ESXiからのSNMP Trapを監視できるように設定してみた。思いの外、手順が多かったので、忘れないようにまとめておく。

<環境>
・Zabbixバージョン:2.2.11
・Zabbixサーバ IPアドレス:192.168.33.22
・ESXiバージョン:VMware ESXi 6.0.0 Update 2
・ESXi IPアドレス:192.168.33.11
・SNMPコミュニティ名:public

1. snmptrapdの設定

まず、net-snmpをインストールする。net-snmpはZabbixインストール時の前提パッケージとなっているので、通常はインストールされており問題はないが、net-snmp-perlが入っていない場合は必要となるため追加でインストールする。

# yum install net-snmp
# yum install net-snmp-perl

次にsnmptrapdの設定として、/etc/snmp/snmptrapd.confに以下を追加する。
--------------------
authCommunity   log,execute,net public
perl do "/etc/zabbix/alertscripts/zabbix_trap_receiver.pl";
--------------------

次に、/etc/sysconfig/snmptrapdに以下を追加する。
--------------------
OPTIONS="-Lsd -p /var/run/snmptrapd.pid -M /usr/share/snmp/mibs:/usr/share/snmp/venders -m all"
--------------------

上記は、MIBの保存ディレクトリとして/usr/share/snmp/vendersも追加する設定を加える設定となる。指定したディレクトリへ、ESXiのMIBを配置することをお忘れなく。

※MIBは以下からダウンロードできる
SNMP MIB module file download (1013445)
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1013445

最後にサービス起動&起動時に自動起動するようにする。

# service snmptrapd start
# chkconfig snmptrapd on

2. Zabbixの設定① (CLIでの設定)

ZabbixでSNMPTrapを受信する方法として、SNMPTTを使うか、Zabbix付属のPerlスクリプトを使うかの2パターンがある。今回は後者のPerlスクリプトでの実装を行う。

まず、該当のPerlスクリプトを規定のディレクトリに配置する(デフォルトで置かれている可能性もあり)。

# cp /var/lib/zabbix/zabbix_trap_receiver.pl /etc/zabbixx/alertscripts/
# chmod 755 /etc/zabbixx/alertscripts/zabbix_trap_receiver.pl

次にZabbixの設定ファイルを編集する。

/etc/zabbix/zabbix_server.confの以下箇所を編集する。
--------------------
SNMPTrapperFile=/var/log/zabbix/zabbix_traps.tmp
StartSNMPTrapper=1
--------------------

最後にzabbix-serverをリスタートする。

# service zabbix-server restart

この状態でSNMP Trapを正常に受信し、スクリプトが実行されることを確認してみる。以下コマンドでテストTrapを送信する。

# snmptrap -v 1 -c public 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s "teststring000"

/var/log/messagesにTrapの内容が表示されていればsnmptrapdの動作はOK。

# tail /var/log/messages
--------------------
May  3 21:49:04 t3022ce67 snmptrapd[15789]: 2016-05-03 21:49:04 0.0.0.0(via UDP: [127.0.0.1]:58671->[127.0.0.1]) TRAP, SNMP v1, community public#012#011IF-MIB::linkDown Enterprise Specific Trap (33) Uptime: 0:00:00.55#012#011IF-MIB::linkDown = Hex-STRING: E2 80 9C 74 65 73 74 73 74 72 69 6E 67 30 30 30 #012E2 80 9D
--------------------

さらに、/var/log/zabbix/zabbix_traps.tmpにTrapの内容が表示されていれば、Perlスクリプトもきちんと動作していることが確認できる。

# tail -20 /var/log/zabbix/zabbix_traps.tmp
--------------------
23:42:00 2016/05/03 ZBXTRAP 127.0.0.1
PDU INFO:
  notificationtype               TRAP
  version                        0
  receivedfrom                   UDP: [127.0.0.1]:38270->[127.0.0.1]
  errorstatus                    0
  messageid                      0
  community                      public
  transactionid                  48
  errorindex                     0
  requestid                      0
VARBINDS:
  DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (55) 0:00:00.55
  SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: IF-MIB::linkDown.0.33
  IF-MIB::linkDown               type=4  value=STRING: "teststring000"
  SNMP-COMMUNITY-MIB::snmpTrapCommunity.0 type=4  value=STRING: "public"
  SNMPv2-MIB::snmpTrapEnterprise.0 type=6  value=OID: IF-MIB::linkDown
--------------------

3. ESXiの設定

Zabbixに監視設定を実施する前に、ESXiからSNMP Trapを飛ばす設定を実施しておく。ESXi6.0ではSNMPを有効にするためには、ESXi Shellから実施する必要があるため、SSHでESXiにログインした後、以下ファイルを編集&サービスリスタートにて有効化する。

/etc/vmware/snmp.xmlの下線の箇所を編集。
 ※<enable>:デフォルトfalseなのでtrueに変更
 ※<communities>:デフォルト空白なのでpublicに変更
 ※<targets>:デフォルト空白なので、Trap送信先を以下形式で指定
       <IPアドレス>@162 <コミュニティ名>
--------------------
<config><snmpSettings><enable>true</enable><port>161</port><syscontact></syscontact><syslocation></syslocation><EnvEventSource>indications</EnvEventSource><communities>public</communities><targets>192.168.33.22@162 public</targets><EventFilter>1.3.6.1.4.1.6876.4.90.0.401</EventFilter><engineid>00000063000000a100000000</engineid><loglevel>info</loglevel><authProtocol></authProtocol><privProtocol></privProtocol><largestorage>true</largestorage></snmpSettings></config>
--------------------

設定後、サービスをリスタートする。

[root@esx01:~] /usr/bin/services.sh restart

SNMPの設定確認を実施。

[root@esx01:~] esxcli system snmp get
--------------------
   Authentication:
   Communities: public
   Enable: true
   Engineid: 00000063000000a100000000
   Hwsrc: indications
   Largestorage: true
   Loglevel: info
   Notraps:
   Port: 161
   Privacy:
   Remoteusers:
   Syscontact:
   Syslocation:
   Targets: 192.168.33.22@162 public
   Users:
   V3targets:
--------------------

さらに、5分起きに出力されるTrapの抑制を実施する。

[root@esx01:~] esxcli system snmp set --notraps 1.3.6.1.4.1.6876.4.90.0.401

再度設定を確認。Notrapsに設定が反映されていることを確認する。

[root@esx01:~] esxcli system snmp get
--------------------
   Authentication:
   Communities: public
   Enable: true
   Engineid: 00000063000000a100000000
   Hwsrc: indications
   Largestorage: true
   Loglevel: info
   Notraps: 1.3.6.1.4.1.6876.4.90.0.401
   Port: 161
   Privacy:
   Remoteusers:
   Syscontact:
   Syslocation:
   Targets: 192.168.33.22@162 public
   Users:
   V3targets:
--------------------

4. Zabbixの設定② (Web GUIでの設定)

SNMP Trapを監視できるようにするため、ZabbixのWeb GUIにて、以下の順に設定していく。

4.1 テンプレートの作成

・テンプレート名:Template SNMP Trap
・所属グループ:Templates



4.2 アイテムの作成

・名前:SNMP Trap log
・タイプ:SNMP トラップ
・キー:snmptrap[]
・データ型:ログ
・ヒストリの保存期間(日):90
・ログの時間の形式:hh:mm:ss yyyy/MM/dd
・アプリケーションの作成:SNMP Trap
・アプリケーション:-なし-



4.3 トリガーの作成

・名前:SNMP Trap
・条件式:{Template SNMP Trap:snmptrap[].regexp(.*VMWARE-VMINFO-MIB.*)}=0
 ※VMWARE-VMINFO-MIBは情報レベルのTrapのため、トリガーの動作対象外とした
・障害イベントを継続して生成:チェック
・深刻度:重度の障害


4.4 ホストへテンプレート適用

作成したテンプレートをESXiのホストへリンクする。同時にSNMPインタフェースの設定も実施しておくこと。詳細な手順は割愛。

4.5 動作確認

「監視データ」→「概要」画面にてアプリケーションを「SNMP Trap」でフィルタするとSNMP Trapの受信状況がわかる。


テストTrapを飛ばして動作試験をする場合は、ESXiにてサービスをリスタートする(もっと簡単にTrapを飛ばす方法はあると思うが)。

[root@esx01:~] /usr/bin/services.sh restart

正常であれば、情報が更新される。SNMPv2-MIB::warmStartやVMWARE-VMINFO-MIB::vmwVmHBDetectedが出力されればOK。


参考

Zabbix Documentation 2.2 3 SNMPトラップ
https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/snmptrap

ESXi 5.1 ホスト上で、SNMP の有効化及びテストができない (2070242)
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2070242

SNMP Trap is repeated every 5 minutes (2020271)
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2020271