2017年11月21日火曜日

Linuxの設定ファイルを効率よくバックアップする関数

設定ファイルなどを変更する際にファイル名に日付などを入れてバックアップを取ることがよくある。例えば、hostsファイルを変更する場合は、以下のようにコピーコマンドを入力していた。

# cp -p /etc/hosts /etc/hosts_YYYYMMDD ※YYYYMMDDは日付

毎回このようにcpコマンドを打ち込むのが面倒に感じ始めたので、以下のような関数を作ってみた。

function cbk () { command cp -p ${1} ${1}_`date +"%Y%m%d_%H%M%S"`; ls -l ${1} ${1}_*; }

以下は/etc/hostsファイルをバックアップした例となる。

# function cbk () { command cp -p ${1} ${1}_`date +"%Y%m%d_%H%M%S"`; ls -l ${1} ${1}_*; }
# cbk /etc/hosts
------------------------------
-rw-r--r-- 1 root root 187 11月 10 22:22 /etc/hosts
-rw-r--r-- 1 root root 187 11月 10 22:22 /etc/hosts_20171119_064722
------------------------------

~/.bashrcに登録しておけば便利。

# cat ~/.bashrc
------------------------------
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias ccat="grep -v -e '^ *#' -e '^$'"
function cbk () { command cp -p ${1} ${1}_`date +"%Y%m%d_%H%M%S"`; ls -l ${1} ${1}_*; }

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
------------------------------

再ログインすれば反映されてコマンドが使えるようになる。即座に使えるようにしたい場合は、以下コマンドで反映させればよい。

# source ~/.bashrc

2017年11月13日月曜日

Zabbix 3.0でGmailを使って障害通知を行う方法

別記事でZabbix 2.2環境のGmailを使ったメールによる障害通知方法を記載したが、今回はZabbix 3.0環境における設定方法について記載する。

Gmailでは、SMTPではなくSSL/TLSで暗号化を行うSMTPSを利用している。Zabbix 2.2では、SMTPSを用いたメール送信ができないため、別途SMTPSでメール送信するスクリプトを導入する必要があった。
※このあたりの手順については、以下別記事を参照。

・ZabbixでGmailを使って障害メールを送信する設定
https://tech-mmmm.blogspot.jp/2016/05/zabbixgmail.html

Zabbix 3.0ではSSL/TLSを使ったメール送信が実装されたため、前回のように外部スクリプトを利用する必要がなくなった。

設定概要

Zabbixの障害通知の設定は、設定箇所が複数あり、かつ、多くの独自用語が使われている。以下に障害検知からメール送信までの概要図を記載する。


設定箇所は以下の3つとなる。

 ①メディアタイプ  :通知手段(メール、スクリプト、SMSなど)を設定
 ②ユーザーのメディア:通知先メールアドレスと使用するメディアタイプを設定
 ③アクション    :障害検知時の通知条件と通知するユーザーを設定

設定は、「メディアタイプ」→「ユーザーのメディア」→「アクション」の順に実施する。

設定方法

1. メディアタイプを作成

メディアタイプとは通知手段の設定となるが、Gmail送信用のメディアタイプは設定されていないので、新規に作成する。「管理」→「メディアタイプ」を選択し、「メディアタイプの作成」ボタンを押下し、以下の通り作成する。

------------------------------
・名前:Gmail
・タイプ:メール
・SMTPサーバー:smtp.gmail.com
・SMTPサーバーポート番号:465
・SMTP helo:smtp.gmail.com
・送信元メールアドレス:<送信に用いるGmailアカウント>@gmail.com
・接続セキュリティ:SSL/TLS
・認証:Username and password
・ユーザー名:<送信に用いるGmailアカウント> ※「@gmail.com」は不要
・パスワード:<送信に用いるGmailアカウントのパスワード>
・有効:チェック
------------------------------


2. ユーザーのメディアを作成

作成したメディアタイプを使って、メディアを作成する。今回はAdminユーザーに対してメディアを作成することとした。

「管理→「ユーザー」を選択し、Adminを選択する。


「メディア」タブを選択し、「追加」を選択する。


以下の通りメディアの設定を行う。これは送信先メールアドレスに対して、24時間365日(月曜日-日曜日、00:00-24:00)で、すべての深刻度のメール送信を許可する設定となる。

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


3. アクションを作成

最後にアクションを設定する。「設定」→「アクション」を選択し、「イベントソース」が「トリガー」であることを確認し、「アクションの作成」ボタンを押下し作成する。


「アクション」タブでは以下の通り設定する。メール件名にホスト名があると障害部位がすぐに判別できるので、件名に{HOST.NAME1}を追加している。また、障害検知時間がわかるように、メッセージの文頭に{EVENT.DATE} {EVENT.TIME}を追加した。

------------------------------
・名前:Send Gmail
・デフォルトの件名:{HOST.NAME1}:{TRIGGER.STATUS}: {TRIGGER.NAME}
・デフォルトのメッセージ:
{EVENT.DATE} {EVENT.TIME}

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}
------------------------------


「アクションの実行条件」タブでは以下の通り設定した。トリガーの深刻度の条件は、監視設計に応じて適切に設定すること。

------------------------------
・メンテナンスの状態 期間外 メンテナンス
・トリガーの値 = 障害
・トリガーの深刻度 >= 軽度の障害
------------------------------


「アクションの実行内容」タブでは、以下の通り設定する。実行条件が満たされた際に、AdminユーザーのGmail送信のメディアを使ってメール送信を行う設定となる。

------------------------------
・実行内容のタイプ:メッセージの送信
・ユーザーに送信:Admin
・次のメディアのみ使用:Gmail
------------------------------


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

メール送信テスト

試しにESXiのCPU使用率を上昇させ、トリガーにて障害検知させてみたところ、以下の通りGmailにメールが送信されることが確認できた。



2017年11月7日火曜日

Miracle ZBX 3.0 (PostgreSQL版)のインストール手順

昨年からMiracle ZBX 2.2を使って、自宅検証環境の監視を各種設定してきたが、そろそろ新しいバージョンのZabbixを使ってみたいと考えていた。

実際の商用環境などでは、監視項目の移行などをしっかり検討する必要があると思うが、今回は自分の検証環境であり影響など皆無であるため、心機一転Miracle ZBX 3.0で新規構築を行うことにした。

いろいろな都合があって、ZabbixではなくMiracle ZBXで構築しているが、インストール方法や設定方法に差は無いはずである。したがって記事内では、Miracle ZBXもZabbixもどちらも同じ意味として扱うことにする。

なお、Miracle ZBXの詳細については、以下メーカーURLを参照してほしい。

・コミュニティ版 統合監視ソフトウェア「MIRACLE ZBX」
https://www.miraclelinux.com/product-service/zabbix/lineup/oss

また、ZabbixはMySQLとPostgreSQLの2種類のDBを選択することができるが、今回はPostgreSQLを利用する前提の構築手順となる。また、インターネット接続環境が無いことによるyumによるインストールが不可であることを想定して、RPMによる個別インストールの方法を記載する。

環境

・OS:CentOS 7.4.1708
・Zabbix:Miracle ZBX 3.0

事前準備

SELinuxが有効の場合、Miracle ZBXの起動に失敗するため停止しておく。

<変更前>
# cat /etc/selinux/config | grep -v -e "^#" -e "^$"
------------------------------
SELINUX=enforcing
SELINUXTYPE=targeted
------------------------------

<変更後>
# cat /etc/selinux/config | grep -v -e "^#" -e "^$"
------------------------------
SELINUX=disabled
SELINUXTYPE=targeted
------------------------------

有効化のためOSを再起動する。

# renboot

再起動後、設定が反映されていることを確認する。

# getenforce
------------------------------
Disabled
------------------------------

firewalldが有効となっている場合、Zabbixの管理画面へのWebアクセスができないため無効化しておく。

# systemctl stop firewalld
# systemctl disable firewalld

CentOSのインストールメディア内のRPMパッケージを使ってインストールを行うため、事前にメディアをマウントしておく。読み取り専用である旨のメッセージが表示されるが、特に問題はない。

# mount /dev/cdrom /media/
------------------------------
mount: /dev/sr0 is write-protected, mounting read-only
------------------------------

PostgreSQLのインストール

Miracle ZBXのDBとしてPostgreSQLを使うので、まずはPostgreSQLをインストールする。

# cd /media/Packages
# rpm -ivh postgresql-libs-9.2.18-1.el7.x86_64.rpm
------------------------------
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:postgresql-libs-9.2.18-1.el7     ################################# [100%]
------------------------------

以降、rpmコマンド実行時の表示については省略して、インストールコマンドのみ記載していく。PostgreSQLは他に以下2つのRPMもインストールしておく。

# rpm -ivh postgresql-9.2.18-1.el7.x86_64.rpm
# rpm -ivh postgresql-server-9.2.18-1.el7.x86_64.rpm

確認して、3つのRPMがインストールされていればOK。

# rpm -qa | grep postgre
------------------------------
postgresql-libs-9.2.18-1.el7.x86_64
postgresql-server-9.2.18-1.el7.x86_64
postgresql-9.2.18-1.el7.x86_64
------------------------------

Miracle ZBX 3.0のダウンロード

Miracle ZBXのコミュニティ版(無償版)を公式サイトからダウンロードする。

・Index of /zbx/3.0/7.x/x86_64/RPMS
http://ftp.miraclelinux.com/zbx/3.0/7.x/x86_64/RPMS/

Miracle ZBX3.0のPostgreSQL版であれば、以下ファイルをダウンロードしておけばよい。

------------------------------
fping-2.4b2-17.el7.centos.x86_64.rpm
iksemel-1.4-2.1.el7.centos.x86_64.rpm
miracle-zbx-agent-3.0.11-1.ML7.x86_64.rpm
miracle-zbx-get-3.0.11-1.ML7.x86_64.rpm
miracle-zbx-sender-3.0.11-1.ML7.x86_64.rpm
miracle-zbx-server-pgsql-3.0.11-1.ML7.x86_64.rpm
miracle-zbx-web-3.0.11-1.ML7.x86_64.rpm
miracle-zbx-web-japanese-3.0.11-1.ML7.x86_64.rpm
miracle-zbx-web-pgsql-3.0.11-1.ML7.x86_64.rpm
------------------------------

また、後ほど追加で必要となるRPMもあるので、こちらはインターネット検索をしてダウンロードしておく。

------------------------------
php-bcmath-5.4.16-42.el7.x86_64.rpm
php-mbstring-5.4.16-42.el7.x86_64.rpm
------------------------------

私は以下URLより検索してダウンロードした。

・Welcome to the RPM repository on fr2.rpmfind.net
https://www.rpmfind.net/linux/RPM/index.html

ダウンロードリンクは変更となる可能性があるが、以下2つがダウンロードURLとなる。

・php-mbstring-5.4.16-42.el7.x86_64.rpm
ftp://195.220.108.108/linux/centos/7.4.1708/os/x86_64/Packages/php-mbstring-5.4.16-42.el7.x86_64.rpm

・php-bcmath-5.4.16-42.el7.x86_64.rpm
ftp://195.220.108.108/linux/centos/7.4.1708/os/x86_64/Packages/php-bcmath-5.4.16-42.el7.x86_64.rpm

これらのファイルは「/root/ZBX」ディレクトリに配置しておく。

Perlのインストール

PerlはRPMで入れようと思うと依存関係が複雑すぎていつまでもインストールができない。そこで、インストールメディアのPackagesディレクトリをリポジトリ登録して、yumを使ってインストールすることにする。

この方法は以下の過去記事にも記載している。

・Red Hat Enterprise LinuxやCentOSでローカルディレクトリをyumのリポジトリとして設定する方法
https://tech-mmmm.blogspot.jp/search?q=yum

まずは、createrepoをインストールする。

# cd /media/Packages
# rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm
# rpm -ivh libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm
# rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm
# rpm -ivh createrepo-0.9.9-26.el7.noarch.rpm

OSメディアのPackagesディレクトリは読み取り専用となっているので、一度ローカルにコピーしておく。

# mkdir /root/perl_rpms
# cp /media/Packages/perl* /root/perl_rpms/

createrepoコマンドでリポジトリを作成する。

# createrepo /root/perl_rpms/
------------------------------
Spawning worker 0 with 218 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
------------------------------

次にyumのリポジトリ設定を行う。/etc/yum.repos.dディレクトリをバックアップしたのち、ディレクトリの中身を空にし、local.repoというファイルを新規作成する。

# cp -r /etc/yum.repos.d /etc/yum.repos.d_bak
# rm -f /etc/yum.repos.d/*
# vi /etc/yum.repos.d/local.repo
------------------------------
[local-repository]
name=local repository
baseurl=file:///root/perl_rpms/
gpgcheck=0
enabled=1
------------------------------

yumを実行して、リポジトリリストにlocal-repositoryが表示され、「有効」となっていればOK。

# yum check-update
------------------------------
読み込んだプラグイン:fastestmirror
local-repository                                         | 2.9 kB     00:00
local-repository/primary_db                                | 166 kB   00:00
Loading mirror speeds from cached hostfile
------------------------------

# yum repolist all
------------------------------
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
リポジトリー ID                       リポジトリー名                 状態
local-repository                    local repository            有効: 218
repolist: 218
------------------------------

yumを使ってperl-libsをインストールする。

# yum -y install perl-libs
------------------------------
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ perl-libs.x86_64 4:5.16.3-291.el7 を インストール
--> 依存性の処理をしています: perl(:MODULE_COMPAT_5.16.3) のパッケージ: 4:perl-libs-5.16.3-291.el7.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ perl.x86_64 4:5.16.3-291.el7 を インストール

~(中略)~


  perl-parent.noarch 1:0.225-244.el7                             perl-podlators.noarch 0:2.5.1-3.el7

  perl-threads.x86_64 0:1.87-4.el7                               perl-threads-shared.x86_64 0:1.43-6.el7

完了しました!

------------------------------

zabbix-serverのインストール

前提パッケージが多数必要となるので、以下順にRPMファイルをインストールしていく。

# cd /media/Packages/
# rpm -ivh OpenIPMI-modalias-2.0.19-15.el7.x86_64.rpm
# rpm -ivh OpenIPMI-libs-2.0.19-15.el7.x86_64.rpm
# rpm -ivh unixODBC-2.3.1-11.el7.x86_64.rpm
# rpm -ivh net-snmp-libs-5.7.2-24.el7_2.1.x86_64.rpm
# rpm -ivh lm_sensors-libs-3.4.0-4.20160601gitf9185e5.el7.x86_64.rpm
# rpm -ivh net-snmp-agent-libs-5.7.2-24.el7_2.1.x86_64.rpm
# rpm -ivh perl-Data-Dumper-2.145-3.el7.x86_64.rpm
# rpm -ivh net-snmp-5.7.2-24.el7_2.1.x86_64.rpm

# cd /root/ZBX
# rpm -ivh fping-2.4b2-17.el7.centos.x86_64.rpm
# rpm -ivh iksemel-1.4-2.1.el7.centos.x86_64.rpm
# rpm -ivh miracle-zbx-server-pgsql-3.0.11-1.ML7.x86_64.rpm

zabbix-webのインストール

こちらも前提パッケージをインストールしたのち、zabbix-webをインストールする。なお、zabbix-webは、3つのRPMファイルを同時にインストールしなければ失敗するため注意する。

# cd /media/Packages/
# rpm -ivh apr-1.4.8-3.el7.x86_64.rpm
# rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm
# rpm -ivh mailcap-2.1.41-2.el7.noarch.rpm
# rpm -ivh httpd-tools-2.4.6-45.el7.centos.x86_64.rpm
# rpm -ivh httpd-2.4.6-45.el7.centos.x86_64.rpm
# rpm -ivh libzip-0.10.1-8.el7.x86_64.rpm
# rpm -ivh php-common-5.4.16-42.el7.x86_64.rpm
# rpm -ivh php-cli-5.4.16-42.el7.x86_64.rpm
# rpm -ivh php-5.4.16-42.el7.x86_64.rpm
# rpm -ivh traceroute-2.0.22-2.el7.x86_64.rpm
# rpm -ivh libXpm-3.5.11-3.el7.x86_64.rpm
# rpm -ivh t1lib-5.1.2-14.el7.x86_64.rpm
# rpm -ivh php-gd-5.4.16-42.el7.x86_64.rpm
# rpm -ivh php-pdo-5.4.16-42.el7.x86_64.rpm
# rpm -ivh php-pgsql-5.4.16-42.el7.x86_64.rpm
# rpm -ivh vlgothic-p-fonts-20130607-2.el7.noarch.rpm
# rpm -ivh php-xml-5.4.16-42.el7.x86_64.rpm
# rpm -ivh php-ldap-5.4.16-42.el7.x86_64.rpm

# cd /root/ZBX
# rpm -ivh php-bcmath-5.4.16-42.el7.x86_64.rpm
# rpm -ivh php-mbstring-5.4.16-42.el7.x86_64.rpm
# rpm -ivh miracle-zbx-web-3.0.11-1.ML7.x86_64.rpm miracle-zbx-web-pgsql-3.0.11-1.ML7.x86_64.rpm miracle-zbx-web-japanese-3.0.11-1.ML7.x86_64.rpm
------------------------------
警告: miracle-zbx-web-3.0.11-1.ML7.x86_64.rpm: ヘッダー V4 DSA/SHA1 Signature、鍵 ID ca5c2834: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:miracle-zbx-web-pgsql-3.0.11-1.ML################################# [ 33%]
   2:miracle-zbx-web-3.0.11-1.ML7     ################################# [ 67%]
   3:miracle-zbx-web-japanese-3.0.11-1################################# [100%]
------------------------------

その他zabbix関連のRPMインストール

後はzabbixのエージェントとツールをインストールすれば、RPMインストール作業は終了となる。

# rpm -ivh miracle-zbx-agent-3.0.11-1.ML7.x86_64.rpm
# rpm -ivh miracle-zbx-sender-3.0.11-1.ML7.x86_64.rpm
# rpm -ivh miracle-zbx-get-3.0.11-1.ML7.x86_64.rpm

最終的にzabbixのインストール状態は以下の通りとなる。

# rpm -qa | grep zbx
------------------------------
miracle-zbx-web-3.0.11-1.ML7.x86_64
miracle-zbx-get-3.0.11-1.ML7.x86_64
miracle-zbx-server-pgsql-3.0.11-1.ML7.x86_64
miracle-zbx-web-pgsql-3.0.11-1.ML7.x86_64
miracle-zbx-web-japanese-3.0.11-1.ML7.x86_64
miracle-zbx-sender-3.0.11-1.ML7.x86_64
miracle-zbx-agent-3.0.11-1.ML7.x86_64
------------------------------

PostgreSQL初期設定

PostgreSQLを初期化コマンドにて初期化する。

# postgresql-setup initdb
------------------------------
Initializing database ... OK
------------------------------

PostgreSQLを起動させる。

# systemctl start postgresql
# systemctl status postgresql
------------------------------
postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2017-11-08 22:56:00 JST; 3s ago

~(以下略)~
------------------------------

PostgreSQLにZabbix用のユーザーの作成を行う。

# su - postgres

とりあえず、postgresユーザーのパスワードを変更しておく。

-bash-4.2$ psql -c "alter user postgres with password '<任意のパスワード>'"
------------------------------
ALTER ROLE
------------------------------

-bash-4.2$ createuser zabbix -P -S -R -D
------------------------------
新しいロールのためのパスワード:
もう一度入力してください:
------------------------------

※createuserのオプションの意味
 -P:ユーザーのパスワードを設定
 -S:スーパーユーザーにならない
 -R:新しいロールの作成を禁止
 -D:データベースの作成を禁止

次にデータベースの作成を行う。

-bash-4.2$ createdb -O zabbix -E UTF8 zabbix

※createdbのオプションの意味
 -O:データベースの所有者ユーザーを指定
 -E:文字コードを設定 (今回はUTF-8で設定)

-bash-4.2$ exit

PostgreSQLのアクセス設定を行う。

# vi /var/lib/pgsql/data/pg_hba.conf

<設定前>
# cat pg_hba.conf | grep -v -e "^#" -e "^$"
------------------------------
local   all          all                                  peer
host    all          all             127.0.0.1/32         ident
host    all          all             ::1/128              ident
------------------------------

<設定後>
# cat pg_hba.conf | grep -v -e "^#" -e "^$"
------------------------------
local   all          all                                  trust
host    all          all             127.0.0.1/32         trust
host    all          all             ::1/128              trust
------------------------------

設定反映のため、一度PostgreSQLを再起動させる。

# systemctl restart postgresql

Zabbixにはデータベースの初期設定用のSQLが用意されているので、以下コマンドにて流し込みを行う。

# zcat /usr/share/doc/miracle-zbx-server-pgsql-3.0.11/create.sql.gz | psql -U zabbix zabbix -W
------------------------------
ユーザ zabbix のパスワード:
NOTICE:  CREATE TABLE / PRIMARY KEYはテーブル"maintenances"に暗黙的なインデックス"maintenances_pkey"を作成します
CREATE TABLE
CREATE INDEX
CREATE INDEX
NOTICE:  CREATE TABLE / PRIMARY KEYはテーブル"hosts"に暗黙的なインデックス"hosts_pkey"を作成します
CREATE TABLE
CREATE INDEX
CREATE INDEX

~(中略)~

INSERT 0 1
INSERT 0 1
COMMIT
------------------------------

※psqlのオプションの意味
 -U:データベースへの接続ユーザーを指定
 -W:パスワード入力を求める

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

Miracle ZBX初期設定

最後にMiracle ZBXの設定となる。PostgreSQLの接続情報を追記する。

<設定前>
# cat /etc/zabbix/zabbix_server.conf | grep -v -e "^#" -e "^$"
------------------------------
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
DBName=zabbix
DBUser=zabbix
SNMPTrapperFile=/var/log/zabbix/zabbix_traps.tmp
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
------------------------------

<設定後>
# cat /etc/zabbix/zabbix_server.conf | grep -v -e "^#" -e "^$"
------------------------------
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
DBName=zabbix
DBUser=zabbix
DBPassword=<PostgreSQLのzabbixユーザーのパスワード>
DBPort=5432
SNMPTrapperFile=/var/log/zabbix/zabbix_traps.tmp
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
------------------------------

ZabbixのApacheの設定ファイルがすべてコメントアウトされているため、行頭の#を削除しコメントインする。ただし、「Apache 2.2」と表示されている箇所は不要なので削除する。最終的には以下の通りの設定となる。

# cat /etc/httpd/conf.d/zabbix.conf  | grep -v -e "^#" -e "^$"
------------------------------
Alias /zabbix /usr/share/zabbix
<Directory "/usr/share/zabbix">
    Options -FollowSymLinks
    AllowOverride Limit
    <LimitExcept POST GET>
        Order deny,allow
        Deny from all
    </LimitExcept>
    <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all granted
    </IfModule>
    php_value max_execution_time 600
    php_value date.timezone Asia/Tokyo
    php_value memory_limit 256M
    php_value post_max_size 32M
    php_value upload_max_filesize 16M
    php_value max_input_time 600
    php_value always_populate_raw_post_data -1
</Directory>
<Directory ~ "^/usr/share/zabbix/(conf|api|include|local)/">
    <IfModule mod_authz_core.c>
      # Apache 2.4
      Require all denied
    </IfModule>
    <files *.php>
      <IfModule mod_authz_core.c>
        # Apache 2.4
        Require all denied
      </IfModule>
      <IfModule !mod_authz_core.c>
        Order deny,allow
        Deny from all
      </IfModule>
    </files>
</Directory>
------------------------------

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

Miracle ZBX起動

それではMiracle ZBXを起動させていく。

# systemctl start zabbix-server
# systemctl start zabbix-agent
# systemctl start httpd

合わせて、OS起動時の自動起動設定も有効にしておく。

# systemctl enable postgresql
# systemctl enable zabbix-server
# systemctl enable zabbix-agent
# systemctl enable httpd


管理画面にアクセス確認

管理画面にアクセスして、初期設定とログイン確認を行う。

http://<インストールしたサーバーのIPアドレス>/zabbix

初回アクセス時はセットアップ画面が表示されるので、「Next step」ボタンを押下する。


前提条件の確認が行われるので、すべて「OK」であることを確認したのち、「Next step」ボタンを押下する。


以下値を入力し、「Next step」ボタンを押下する。

 ・Database port:5432
 ・Password:<PostgreSQLのzabbixユーザーのパスワード>


そのまま「Next step」ボタンを押下する。


そのまま「Next step」ボタンを押下する。


「Finish」ボタンを押下する。


ログイン画面が表示されるので、以下でログインする。

 ・ユーザー名:Admin (大文字小文字に注意)
 ・パスワード:zabbix


Zabbixのダッシュボードが正常に表示されればOK。


「設定」→「ホスト」を選択すると、Zabbix serverが監視登録されている。デフォルトでは「ステータス」が「無効」となっているので、「無効」の文字をクリックして、監視を有効化しておこう。


以上でMiracle ZBXのインストールは終了となる。

ここから使える監視サーバーにするためには、監視対象の追加や通知設定等を実施していく必要があるが、それはまた別の機会に記すことにする。

2017年11月5日日曜日

シェルスクリプトで変数に入れたコマンドを実行する方法の比較(evalコマンドなどの動作比較)

シェルスクリプトを作る際に、変数にコマンド文字列を入れて実行したい場合がある。実現方法は複数あるが、今回は以下の3つのパターンの動作について確認をしてみることにした。

 A. 変数をそのまま書く
 B. evalコマンドを使う
 C. ``で変数を囲む

なお、Cの``で変数を囲む方法は、$()で変数を囲むことと同義となる。

比較その①

単純なコマンド+オプション1個の形での実行パターンとして、以下コマンドを変数に入れて実行してみることにする。

# uname -r
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------
# com="uname -r"

A. 変数をそのまま書く

# $com
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------

結果:実行に成功

B. evalコマンドを使う

# eval $com
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------

結果:実行に成功

C. ``で変数を囲む

# `$com`
------------------------------
bash: 3.10.0-514.26.2.el7.x86_64: コマンドが見つかりませんでした...
------------------------------

結果:実行に失敗

これは「uname -r」の実行結果である「3.10.0-514.26.2.el7.x86_64」が、コマンドとして実行されてしまいエラーとなっている。そのため、``の場合はechoを付ける必要がある。

# echo `$com`
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------

比較その②

コマンド文字列のオプションをさらに変数に入れた場合の比較もしてみた。「uname -r」の「-r」のオプションを別変数にする形で実行する。

# opt="-r"
# com="uname $opt"

先に結果を述べてしまうと、比較その①の結果と同様となった。

A. 変数をそのまま書く

# $com
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------

結果:実行に成功

B. evalコマンドを使う

# eval $com
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------

結果:実行に成功

C. ``で変数を囲む

# `$com`
------------------------------
bash: 3.10.0-514.26.2.el7.x86_64: コマンドが見つかりませんでした...
------------------------------

結果:実行に失敗

比較その①で実施した方法と同様にechoを付けてやれば、コマンド実行の結果が表示される。

# echo `$com`
------------------------------
3.10.0-514.26.2.el7.x86_64
------------------------------

比較その③

最後に、パイプを使ったコマンドを実行するパターンとして、以下コマンドを変数に入れた場合の実行結果を比較する。

# ifconfig | grep ens160
------------------------------
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
------------------------------
# com="ifconfig | grep ens160"

A. 変数をそのまま書く

# $com
------------------------------
grep: 不明なホストです
ifconfig: `--help' gives usage information.
------------------------------

結果:実行に失敗

これは実行コマンドが以下の通り解釈されており、"|"などもifconfigコマンドの引数として扱ってしまっていることが原因となる。

# ifconfig "|" "grep" "ens160"
------------------------------
grep: 不明なホストです
ifconfig: `--help' gives usage information.
------------------------------

したがって、パイプやリダイレクトを含むようなコマンドは、この方法では実行不可となる。

B. evalコマンドを使う

# eval $com
------------------------------
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
------------------------------

結果:実行に成功

evalではパイプを含むようなコマンドでも問題なく実行できた。

C. ``で変数を囲む

[root@t1101ce73 ~]# `$com`
grep: 不明なホストです
ifconfig: `--help' gives usage information.

結果:実行に失敗

Aの方法と同じ理由で失敗。

まとめ

簡単なコマンドであれば、どの方法でも期待通りのコマンド実行結果を得ることができるが、パイプやリダイレクトを含むコマンドではevalコマンドを使う必要がある。

2017年10月29日日曜日

VXLAN入門!CentOS 7を使ってVXLANを設定する方法

vSphere NSXなどのSDN (Software Defined Network)の技術として利用されているVXLANであるが、いまいちどういうものか理解できていない。そこで、VXLANについて調べてみた内容をまとめるとともに、CentOS 7を使って実際にVXLANによる通信をしてみることにした。

VXLANとは?

VXLANとはVirtual eXtensible LANの略称となる。

もともとネットワーク仮想化といえば、昔からVLAN (Virtual LAN)が利用されていた。VLANはL2のイーサネットフレームで機能実装されており、物理的なネットワークケーブルが1本であったとしても、VLAN IDを付与することで、複数のネットワークセグメントの通信をできるようにする技術となる。VLANを使うことで、物理的なネットワーク機器やケーブル本数を削減し、用途別にネットワークの論理分割が実現できる。

VXLANはUDPパケットのデータ部以降で実装されており、実際の通信に用いるイーサネットフレームはカプセル化されている。VXLANを用いた際のイーサネットフレームの構造を以下に図示する。


カプセル化されているため、既存ネットワークへのVXLAN導入時の影響が非常に少ないという利点がある。また、本来は別のL2ネットワークセグメントであるサーバーであっても同一VXLANで通信させることで、あたかも同じセグメントでの通信をしているように振る舞うことができる。

他にもVLAN IDは12bit長であるため、0と4095の予約分を除く1~4094の範囲の4094個しか作ることができず、大規模なネットワークなどでは数が不足するという課題があった。VXLANではVNI (VXLAN Network Identifier)が24bit長となっており、1600万個ものネットワーク分割ができるようになっている。

今回は、異なるL2ネットワークセグメントに所属するCentOS 2台でVXLANを設定し、同一セグメントのサーバーとして通信できるよう設定を実施する。

構成と注意点

今回の構成は以下の通りとなる。途中に仮想ネットワーク機器のVyOSを挟み、L3ルーティングを行うネットワーク構成としている。ここにVXLANを導入し、同一セグメントとして通信できるように構成する。


VXLANでは通信先サーバーを探す仕組みとして、ユニキャストモードとマルチキャストモードの2通りの設定がある。これはVXLANの通信の終端であるVTEP (VXLAN Tunnel End Point)が通信先のVTEPを探す際に、ユニキャストを使うかマルチキャストを使うかの違いとなる。今回の構成の場合、VTEPはCentOSのサーバーのNIC (ens160)となる。

ルーターはVyOSを利用したが、VyOSでは以下URLに記載の通り、現時点ではMulticast Routingに対応しておらず、L2セグメントを越えたマルチキャスト通信を実装することができない。

・VyOS - Multicast Routing
https://forum.vyos.net/showthread.php?tid=26935

したがって、今回の環境では、ユニキャストモードでVXLANを実装する必要がある。

設定手順

サーバーAとサーバーBの設定はほぼ同一となる。まずは、サーバーAから設定を行うこととする。

サーバーA側の設定

設定はすべてipコマンドで行う。設定するVXLANの情報は以下の通り。

------------------------------
◆サーバA VXLAN設定
・インターフェース名:vxlan0
・VNI:77
・ユニキャスト先VTEP:192.168.55.101
・VXLANで使用するUDPポート:4789
・VTEP:自身のNIC (ens160)
------------------------------

コマンドは以下の通りとなる。

# ip link add vxlan0 type vxlan id 77 remote 192.168.55.101 dstport 4789 dev ens160

dstportでポート番号4789で指定しているが、省略した場合、8472のポートが利用されてしまうので注意。これは、当初VXLANはUDP/8472を使用するように標準化が進められていたが、RFC 7348で規格化された際に、UDP/4789と変更となったことが原因のようだ。

なお、今回は実施しないが、マルチキャストモードの設定コマンドは以下となる。下線部が異なる点となる。

# ip link add vxlan0 type vxlan id 77 group 239.0.0.1 dev ens160 dstport 4789

設定後、確認をしてみると、コマンドを実行した通りの設定が投入されていることがわかる。

# ip -d link show vxlan0
------------------------------
11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether 6a:2c:c1:bd:5a:2d brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 77 remote 192.168.55.101 dev ens160 srcport 0 0 dstport 4789 ageing 300 addrgenmode eui64
------------------------------

次にvxlan0のインターフェースをupさせ、IPアドレスを付与する。

# ip link set up vxlan0
# ip address add 172.24.77.101/24 dev vxlan0

再度、設定を確認してみる。

# ip addr show vxlan0
------------------------------
11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 6a:2c:c1:bd:5a:2d brd ff:ff:ff:ff:ff:ff
    inet 172.24.77.101/24 scope global vxlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::682c:c1ff:febd:5a2d/64 scope link
       valid_lft forever preferred_lft forever
------------------------------

これでサーバーA側の設定は完了となる。

なお、ipコマンドではOSを再起動するとネットワーク設定が削除されてしまう。再起動しても設定が消えないようにする方法は残念ながら見つけることができなかったので、起動時に設定コマンドを実行するスクリプトなどを作って対応するしかなさそうだ。

サーバーB側の設定

設定するVXLANの情報は以下の通り。

------------------------------
◆サーバA VXLAN設定
・インターフェース名:vxlan0
・VNI:77
・ユニキャスト先VTEP:192.168.11.101
・VXLANで使用するUDPポート:4789
・VTEP:自身のNIC (ens160)
------------------------------

手順はサーバーA側と同じなので、ひたすら設定を行う。

# ip link add vxlan0 type vxlan id 77 remote 192.168.11.101 dstport 4789 dev ens160
# ip -d link show vxlan0
------------------------------
7: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether 9e:4a:3c:f4:55:2e brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 77 remote 192.168.11.101 dev ens160 srcport 0 0 dstport 4789 ageing 300 addrgenmode eui64# ip link set up vxlan0
------------------------------

# ip link set up vxlan0
# ip address add 172.24.77.102/24 dev vxlan0
# ip addr show vxlan0
------------------------------
7: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 9e:4a:3c:f4:55:2e brd ff:ff:ff:ff:ff:ff
    inet 172.24.77.102/24 scope global vxlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::9c4a:3cff:fef4:552e/64 scope link
       valid_lft forever preferred_lft forever
------------------------------

通信確認

設定が完了したので、サーバーBからpingを打ち、サーバAにてパケットを確認してみる。firewalldが動作しているとping疎通に失敗するようなので、事前に両方のサーバーでfirewalldを停止しておこう。

# systemctl stop firewalld

pingを実行すると、VXLANにて付与したIPアドレスで問題なく疎通ができた。

# ping 172.24.77.101
------------------------------
PING 172.24.77.101 (172.24.77.101) 56(84) bytes of data.
64 bytes from 172.24.77.101: icmp_seq=1 ttl=64 time=0.783 ms
64 bytes from 172.24.77.101: icmp_seq=2 ttl=64 time=0.387 ms
------------------------------

tcpdumpでパケットを確認してみる。tcpdumpではVXLANの中の通信内容も見ることができるが、そのまま貼り付けると見づらいので若干表示を整形しコメントを付与した。

# tcpdump -i ens160 src host 192.168.55.101 -n -v
------------------------------
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 65535 bytes

18:00:49.350813 IP (tos 0x0, ttl 63, id 16265, offset 0, flags [none], proto UDP (17), length 134)
192.168.55.101.40463 > 192.168.11.101.4789: VXLAN, flags [I] (0x08), vni 77
↑UDP/4789で通信

IP (tos 0x0, ttl 64, id 64215, offset 0, flags [DF], proto ICMP (1), length 84) 172.24.77.102 > 172.24.77.101: ICMP echo request, id 12775, seq 1, length 64
↑実際のVXLANの中の通信内容。pingのICMP通信(echo request)

18:00:50.351166 IP (tos 0x0, ttl 63, id 16621, offset 0, flags [none], proto UDP (17), length 134) 192.168.55.101.40463 > 192.168.11.101.4789: VXLAN, flags [I] (0x08), vni 77
IP (tos 0x0, ttl 64, id 64483, offset 0, flags [DF], proto ICMP (1), length 84) 172.24.77.102 > 172.24.77.101: ICMP echo request, id 12775, seq 2, length 64
------------------------------

(参考) VXLANインターフェース削除

VXLANインターフェースが不要となった場合の削除コマンドは以下の通りとなる。

# ip link delete vxlan0

2017年10月25日水曜日

VyOSのコンソールで"INIT Id "TO" respawning too fast: disabled 5 minutes"の表示を消す

とある検証のためVyOSを新規インストールした際に、コンソール画面に以下のようなメッセージが定期的に出力されることがわかった。

------------------------------
INIT Id "TO" respawning too fast: disabled 5 minutes
------------------------------


VyOSの初期状態ではシリアルポートの設定が入っているが、仮想マシンにシリアルポートが付いていないことが原因のようだ。

こちらの解決策は2つある。これからそれぞれの方法について記載するが、特に理由がなければVyOSの設定だけで簡単にできる①の実施を推奨する。

解決策①:シリアルポートの設定を削除

VyOSの該当のシリアルポートの設定は以下となる。

vyos@t5100vyos:~$ conf
vyos@t5100vyos# show system console
------------------------------
 device ttyS0 {
     speed 9600
 }
------------------------------

シリアルポートが無いのでコンソールに関する設定を全部削除してしまえばよい。削除コマンドは以下の通りとなる。

vyos@t5100vyos:~$ conf
vyos@t5100vyos# delete system console
vyos@t5100vyos# compare
------------------------------
[edit system]
-console {
-    device ttyS0 {
-        speed 9600
-    }
-}
------------------------------

commitで設定を確定させるとコンソールの設定がされていない旨の警告が表示されるが、実害が無いので無視する。なお、ESXiの仮想コンソールを使えば引き続きVyOSの操作はできる。

vyos@t5100vyos# commit
------------------------------
[ system console device ttyS0 ]
Warning: Access to system console is unconfigured
------------------------------

vyos@t5100vyos# save
------------------------------
Saving configuration to '/config/config.boot'...
Done
------------------------------

これでしばらく待ってもメッセージが表示されなくなるはず。

解決策②:仮想マシンにシリアルポートを付ける

ESXiの仮想マシンには仮想シリアルポートを付けることが可能である。設定する際には仮想マシンの停止が必要となるので、仮想マシンは停止しておく。

「設定の編集」→「追加」にて「シリアルポート」を選択する。


シリアルポートタイプでは「ファイルに出力」を選択する。


出力ファイルの設定は自由に設定すればよい。今回は仮想マシンと同じフォルダを選択し、「serial1」というファイル名で出力するよう設定する。


以上で仮想マシンの設定は完了となるので、仮想マシンを起動させてしばらく待ってみる。メッセージが表示されなければ問題なく設定できている。

2017年10月23日月曜日

Raspberry Pi Zero Wを購入してGPIO Hammer HeaderでGPIOの取り付けをした話

Raspberry Pi 3 Model Bを1台持っているのだが、温度・湿度監視センサーとして利用していることから、それ以外の検証作業に使いにくい状態となっていた。そこで、もう一台Raspberry Piを購入することにしたのだが、せっかくなのでRaspberry Pi Zero Wを購入することにした。

今回はRaspberry Pi Zero Wに対し、Hammer Headerというツールを使ってGPIOピンヘッダーを取り付ける手順について記載する。

Raspberry Pi Zero WとRaspberry Pi 3 Model Bの違い

2製品の違いは大きさだけではなく、性能にも差があることに注意する。特にRaspberry Pi Zero WはCPUがシングルコアなので、重い処理や複数の処理をこなすことには向いていない。

  Raspberry Pi Zero W Raspberry Pi 3 Model B
大きさ すごく小さい 小さい
CPU シングルコア 1GHz クアッドコア 1.2GHz
メモリ 512MB 1GB
USBポート 1個 (Micro USB) 4個
ネットワーク 無し 10/100Mbpsポート x 1
無線ネットワーク IEEE 802.11 b/g/n 2.4 GHz IEEE 802.11 b/g/n 2.4 GHz
Bluetooth Bluetooth 4.1 Bluetooth 4.1
映像出力 mini HDMI HDMI

購入したもの

Amazonで売っている以下セットを購入した。Raspberry Pi Zero WはUSBポートがMicro USBだったり、HDMI端子がmini HDMIだったりするので、変換キットも同梱されているものを最初は選ぶとよいだろう。



内容物としては以下の通り。

・Raspberry Pi Zero W本体
・公式ケース
・USB電源&ケーブル
・8GB microSDカード (NOOBS書き込み済み)
・mini HDMI → 標準HDMI変換アダプター
・Micro USB → 標準USB変換アダプター
・GPIOピンヘッダー (使用する場合ははんだ付けが必要)

付属するmicroSDカードにはNOOBSがインストール済みなので初期設定が楽になる。ただし、初めてRaspberry Piに触るのであれば、経験のためにNOOBSのインストールから実施するのもあり(手順はこちら)。

GPIOをはんだ無しで取り付けるGPIO Hammer Header

上述した通り、Raspberry Pi Zero Wは、GPIOピンヘッダーを取り付けたい場合は、はんだ付けが必要となる。私ははんだ付けの経験が久しくなく、失敗するリスクが高かったので、GPIO Hammer Headerという、言ってしまえば力ずくでGPIOヘッダーを圧着するツールを購入した。

なお、私が購入した際は1,000円未満の金額だったが、時期によっては倍くらいになっている模様。



実際のRaspberry Pi Zero WとHammer Header

Raspberry Pi Zero Wは本体が小さいこともあって、1個の小さなビニール袋に入る分量で届いた。


袋から取り出してみるとこんな感じ。


こちらはHammer Header。


袋には「海賊ロボ忍者さる」と記載されている。意味は以下を参照。

・スイッチサイエンス マガジン - Pimoroniがやってきた!
http://mag.switch-science.com/2017/08/23/pimoroni/


Hammer Headerは、専用のGPIOピンヘッダー(オス型、メス型の2種類)とアクリル製のパーツで構成されている。アクリル製の板が2枚入っているが、作業にはGPIO部分に穴が開いている板を使用する。


GPIOピンヘッダーは基盤との接続部分が膨らんでおり、ここをハンマーで叩いてはめ込むことで圧着されるという仕組みになっているようだ。


Hammer HeaderによるGPIO取り付け

まず、GPIO部に穴が開いている板にネジを通し、その上にRaspberry Pi Zero Wを乗せる。


次にGPIOピンヘッダーを乗せる。


細長いアクリル製の板をさらに上に乗せて、、、


これをハンマーで叩く!叩くといっても強い力は不要で、均等に刺さるように、ちょっとずつ叩いていく感じ。


最終的に以下のような状態になる。


GPIOピンヘッダー接続部の膨らんでいる箇所がはみ出しており、ちょっと深く差しすぎた感があるが、この状態で温度センサーを付けると正常に値の取得ができたので、問題なく使えそうだ。