Quantcast
Channel: Linux –俺的備忘録 〜なんかいろいろ〜
Viewing all 743 articles
Browse latest View live

Ubuntu Server 14.04 LTSにスタティックルートを設定する

$
0
0

自宅のUbuntu Server 14.04 LTSにスタティックルートを設定する機会があったので、その備忘。
Ubuntuでは、永続的なスタティックルートを追加する場合、以下の2通りの方法があるようだ。

1.『/etc/network/interfaces』に直接記述する

Ubuntuのネットワーク設定ファイルである、「/etc/network/interfaces」に、以下のように追記することで設定できる。

auto eth1
iface eth1 inet static
        address 192.168.0.100
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.0.255
        gateway 192.168.0.1

        # Add Static Route
        post-up route add -net 10.0.0.0 netmask 255.255.255.0 gw 172.28.100.1

2.『/etc/network/if-up.d/』ディレクトリ配下に設定スクリプトを設置する

もしくは、『/etc/network/if-up.d』ディレクトリ配下に、インターフェイスがアップした際にキックされるスクリプトとして、スタティックルートを設定するスクリプトを設置してあげる方法がある。
以下、作成例。

●/etc/network/if-up.d/static-routes.sh

#!/bin/sh
/sbin/route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.0.1 eth1

 

最新Ubuntu 15.10対応版 Linux超入門ガイド(日経BPパソコンベストムック) 最新Ubuntu 15.10対応版 Linux超入門ガイド(日経BPパソコンベストムック)

コンソール上で使用する計算用コマンド『wcalc』を入れてみた

$
0
0

コンソール上で色々な計算が出来る『wcalc』というコマンドがあるようなので、実際に入れてみる事にした。
試した環境は、Ubuntu 14.04 LTSだ。

1.インストール

まずはインストール。
以下のコマンドで行う。

apt-get install wcalc

 

2.コマンドを使ってみる

さて、それでは実際にコマンドを使ってみよう。
wclacでは、普通に計算式を打つことで、その解答を得る事が出来る。例えば、以下のように数式を実行してみる。

wcalc '(1+2+3+4+5+10)/(1112-41431)'

20160124_000000

blacknon@BS-PUB-UBUNTU-01:~$ wcalc '(1+2+3+4+5+10)/(1112-41431)'
 = -0.000620055

対話形式で計算結果を取得することも可能だ。
その際、変数にその値を導入させることもできる。

20160124_000001

blacknon@BS-PUB-UBUNTU-01:~$ wcalc
Enter an expression to evaluate, q to quit, or ? for help:
-> 1112+453
 = 1565
-> a
 = 1565
-> a*442
 = 691730
-> quit
blacknon@BS-PUB-UBUNTU-01:~$ wcalc
Enter an expression to evaluate, q to quit, or ? for help:
-> abc=12345
abc = 12345
-> def=abc/12
def = 1028.75
-> aaa=(sin(def))/pi
aaa = -0.248245
-> quit

 

その他、2進数(バイナリ値)や10進数、16進数変換を行う事も出来る。

20160124_000002

blacknon@BS-PUB-UBUNTU-01:~$ # 10進数→16進数
blacknon@BS-PUB-UBUNTU-01:~$ echo 1123 | wcalc -h
 = 0x463
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 10進数→2進数
blacknon@BS-PUB-UBUNTU-01:~$ echo 334 | wcalc -b
 = 0b101001110
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 16進数→2進数
blacknon@BS-PUB-UBUNTU-01:~$ echo 0x1f | wcalc -b
 = 0b11111
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 16進数→10進数
blacknon@BS-PUB-UBUNTU-01:~$ echo 0x1c | wcalc -d
 = 28
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 2進数→16進数
blacknon@BS-PUB-UBUNTU-01:~$ echo 0b1101111 | wcalc -h
 = 0x6f
blacknon@BS-PUB-UBUNTU-01:~$
blacknon@BS-PUB-UBUNTU-01:~$ # 2進数→10進数
blacknon@BS-PUB-UBUNTU-01:~$ echo 0b1101111 | wcalc -d
 = 111

 

もしコンソール上で計算することが多いならば、入れてみても良いのではないだろうか。

 

コンピューター&テクノロジー解体新書 ビジュアル版 コンピューター&テクノロジー解体新書 ビジュアル版

systemdで特定のサービスと連動して他のプロセス・サービスを起動・停止させる

$
0
0

※2016/01/26 13:00
そもそも、systemdだったら依存関係についてAfterやBefore、Requestがあることに気づいた。
こんな回りくどいことしなくてもよさそうなので、今週中に書き直す。

 

仕事で、特定のプロセスが落ちたら強制的にそのプロセスを前提として動作しているサービスも落とす必要が出てきたので、どうにか実現できないか調べてみた。
そしたらCentOS7で採用されているsystemdでは、プロセス停止時(障害などでの異常終了時含む)に特定のコマンドを流す事ができるようで、それで実現できたのでその備忘。

systemdでサービスを管理させるファイル「/usr/lib/systemd/system/サービス名.service」に、ExecStopPostとしてコマンドを記述する事で、異常終了を含むサービス停止時にそのコマンドを流す事が出来る。
つまり、この項目にkillコマンドを記述すればよい。

例えば、maxscale.service(上がってないといけないプロセス)に以下のように記述することで、プロセス停止時にhttpd(maxscaleを前提として動作するプロセス)サービスを停止させることが出来る。
(ここではsystemctlから停止させているけど、すぐにでも停止させるなら「kill -KILL $(pgrep プロセス名)」で指定したほうがいいこともある。状況に応じて使い分けるとよいだろう。)

●/usr/lib/systemd/system/maxscale.service

[Unit]
Description=MariaDB MaxScale Database Proxy
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/var/run/maxscale/maxscale.pid
ExecStart=/usr/bin/maxscale --user=maxscale
ExecStopPost=/bin/sh -c 'systemctl stop httpd'

[Install]
WantedBy=multi-user.target

 

さて、それでは実際に動作をみてみよう。

20160124_000003

[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
root     26540     1  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26541 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26542 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26543 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26544 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26545 26540  0 18:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
maxscale 26552     1  0 18:13 ?        00:00:00 /usr/bin/maxscale --user=maxscale
[root@localhost ~]#
[root@localhost ~]# kill $(pgrep maxscale)
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
[root@localhost ~]#

 

確かに、無事停止する事が出来た。
killで落としても動作するので、プロセスが落ちる等の障害時に使えるだろう。

ただ、一つ注意点が。。。

20160124_000004

[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl start maxscale
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
root     26748     1  1 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26749 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26750 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26751 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26752 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   26753 26748  0 18:19 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
maxscale 26760     1  2 18:19 ?        00:00:00 /usr/bin/maxscale --user=maxscale
[root@localhost ~]#
[root@localhost ~]# systemctl restart maxscale
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
maxscale 26795     1  1 18:20 ?        00:00:00 /usr/bin/maxscale --user=maxscale
[root@localhost ~]#

restartすると落ちます!
なので、必要ならば「ExecStartPost」でプロセス起動の記述も書いてあげると良いだろう。この辺は運用時のコマンドによると思うので環境に合わせて。

●/usr/lib/systemd/system/maxscale.service

[Unit]
Description=MariaDB MaxScale Database Proxy
After=network.target

[Service]
Type=forking
Restart=on-failure
PIDFile=/var/run/maxscale/maxscale.pid
ExecStart=/usr/bin/maxscale --user=maxscale
ExecStartPost=/bin/sh -c 'systemctl start httpd'
ExecStopPost=/bin/sh -c 'systemctl stop httpd'

[Install]
WantedBy=multi-user.target

20160124_000005

[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
maxscale 27007     1  0 18:23 ?        00:00:00 /usr/bin/maxscale --user=maxscale
root     27009     1  1 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27013 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27014 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27015 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27016 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27017 27009  0 18:23 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
[root@localhost ~]#
[root@localhost ~]# systemctl stop maxscale
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
[root@localhost ~]#
[root@localhost ~]# systemctl start maxscale
[root@localhost ~]#
[root@localhost ~]# ps -ef | grep -e [h]ttpd -e [m]axscale
maxscale 27067     1  0 18:24 ?        00:00:00 /usr/bin/maxscale --user=maxscale
root     27069     1  1 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27072 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27073 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27075 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27076 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache   27077 27069  0 18:24 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND

 

…まぁ、停止させたいのがアプリケーションサーバ用のプロセスだったりして、LBとかが手前にいるんだったらヘルスチェックで対処させた方が良さそうな気もするけど。

 

ソフトウェア デザイン 2015年 02月号 [雑誌] ソフトウェア デザイン 2015年 02月号 [雑誌]

MariaDBでGalera Clusterを構成する(CentOS 7使用)

$
0
0

仕事でMariaDBによく触れるようになったので、自宅でも環境を構築しておくことにした。
で、当然DBなので中のデータが飛ぶと非常にまずいわけで、冗長性やバックアップを取得して備えておくわけなんだけど、MariaDBではGaleraClusterというクラスタが利用できる。

GaleraClusterは、マルチマスタで動作するクラスタで、組み込まれているノード全てで同じデータを保有、各ノードからデータベースの更新を行わせる事もできる。
だから、(極端な話)ディスク障害で3台中1台しかノードが生き残らなくても、そこからデータを復元させることも出来るのだ。

なお、各ノード間の連携はTCP/IPで行われているので、疎通が取れる環境であることが前提となる。
今回は、GaleraClusterの推奨が3台以上のノードでの構成のため、そのように構築する。
基本的に、以下の手順は3台全てで実施する必要がある。

 

1.インストール

今回はyumを使ってインストールを行う。こ
まずは、以下のコマンドでMariaDBのリポジトリを登録する。

cat << EOS > /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl=http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOS

 

次に、以下のコマンドでMariaDBおよびGaleraClusterをインストールする。

yum --enablerepo=mariadb install -y MariaDB-Galera-server MariaDB-client galera

 

2.設定

まず、余計な動作をされないようにSELinuxとfirewalldを停止しておく。

# SELinuxの無効化
setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config

# firewalldの無効化
systemctl stop firewalld
systemctl disable firewalld

次に、MariaDBの設定ファイルの設置フォルダである「/etc/my.cnf.d/」配下にある、server.cnfという名称で設定ファイルを作成する。
以下、設定例。

[galera]
# required
default_storage_engine = InnoDB       # データベースエンジン(基本デフォルト)
binlog_format = ROW                   # バイナリログのフォーマット(ROW以外不可)
log-bin = /var/lib/mysql/binlog       # バイナリログのPATH
log-slave-updates                     # バイナリログを各マスタノードで共有にする
innodb_autoinc_lock_mode = 2          # 自動ロックのモード。詳細はhttps://dev.mysql.com/doc/refman/5.6/ja/innodb-auto-increment-configurable.html
datadir = /var/lib/mysql              # MariaDBのデータディレクトリ

# connections
max_connections = 256                 # 最大同時コネクション数
max_allowed_packet = 8M               # 最大パケット容量
skip-name-resolve                     # ホスト名解決を行わない
max_connect_errors = 1000000          # 最大接続エラー回数
wait_timeout = 300                    # 最大の接続アイドル時間(秒)
bind-address = 0.0.0.0                # 接続を行わせるサーバのIPアドレス(本設定では制限無し)

# galera
wsrep_cluster_name = DBCLUSTER        # GaleraClusterの名前
wsrep_provider = '/usr/lib64/galera/libgalera_smm.so'
wsrep_sst_method = rsync              # 各クラスタの連携方法の指定
wsrep_cluster_address = gcomm://DBサーバ1のIPアドレス,DBサーバ2のIPアドレス,DBサーバ3のIPアドレス
wsrep_slave_threads = 8               # スレッド数の指定。目安はCPUコア数の2倍か、書き込み接続数の1/4が適正とのこと
wsrep_node_address = 自身のIPアドレス

# log
expire_logs_days = 1                  # バイナリログの自動削除日数
slow_query_log = ON                   # スローログクエリの有効・無効
long_query_time = 1                   # スローログクエリとする処理秒数の指定
log_warnings = 1                      # エラーログにWARNINGも出力
log_error="/var/lib/mysql/error.log"  # エラーログのPATH

# other
character-set-server = utf8           # 文字コードの指定
collation-server = utf8_general_ci    # 文字コードの指定
skip-character-set-client-handshake   # クライアントの設定に関係なしに指定した文字コードで返す
wsrep_auto_increment_control=OFF      # GaleraClusterのauto incrementで、ノード数の増減を自動調整させるかどうか

 

3.プロセスの起動

さて、設定ファイルの記述が終わったら、プロセスを起動してみよう。
最初の1台めについては、以下のコマンドで起動出来る。

service mysql bootstrap

 

2台め以降は、以下のコマンドで起動させる。

service mysql start

 

これで、GaleraClusterが動作する。
各ノードでmysqlにログインし、以下のコマンドを実行し、GaleraClusterが動作している事を確認する。

mysql -u root -e "show status like 'wsrep_local_index';"
[root@BS-PUB-GALERA-01 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 2     |
+-------------------+-------+

[root@BS-PUB-GALERA-02 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+

[root@BS-PUB-GALERA-03 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 1     |
+-------------------+-------+

 

各ノードで重複していないようであれば、GaleraClusterは正常に動作していると考えて良いだろう。
なお、GaleraClusterの仕様上、ユーザやパスワードは全てのノードで共通となるので、ユーザを作ったりパスワード変更する場合は1ノードからのみ実行する必要がある点に注意。

理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus) 理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)

MariaDB+GaleraCluster用のLBソフト『Maxscale』を使ってみる

$
0
0

MariaDB+GaleraClusterの場合、各ノードで書き込み・読込みがされるのだけど、そうなると同じ行に同時タイミングで複数ノードから書き込みをしようとしてデッドロックになる事がある。
これを防ぐため、MariaDBでは専用のロードバランサー用に『Maxscale』というものが用意されている。

実際、会社でも使っているソフトなので、今回はこれをインストールし、GaleraClusterに接続してみよう。

1.Maxscaleの概要

Maxscaleの概要についてだが、細かく説明するとすごく大変そうなので、とりあえず以下のようなイメージだけ覚えておくと良いだろう。

maxscale1

 

要は、DBへ接続する各サーバにインストールするタイプのロードバランサーで、いろんな使い方はあるのだけど、基本的にはGaleraClusterの状態を読み取って1台のノードを書き込みノードとして選定して接続するよ、というもの。クライアント間での連携は不要だけど、各GaleraCluster構成ノードについての情報(接続先や状態の監視用ID/PWなど)を設定ファイルに記述する必要がある。

今回は、CentOS7をこのクライアントとみなし、Maxscaleをインストールしてみることにしよう。

 

2.インストール

まずはインストール。以下のコマンドをMaxscaleをインストールするサーバで実行する。

rpm -i http://downloads.mariadb.com/enterprise/3qdq-gj0j/generate/10.0/mariadb-enterprise-repository.rpm
yum install -y maxscale

 

インストール完了後、以下のコマンドで無事終了していることを確認する。

rpm -qi maxscale
[root@BS-PUB-GFRONT-01 ~]# rpm -qi maxscale
Name        : maxscale
Version     : 1.2.1
Release     : 1
Architecture: x86_64
Install Date: 2016年01月31日 21時37分26秒
Group       : unknown
Size        : 80467684
License     : GPLv2
Signature   : RSA/SHA1, 2015年10月01日 23時12分39秒, Key ID 70e4618a8167ee24
Source RPM  : maxscale-1.2.1-1.src.rpm
Build Date  : 2015年10月01日 23時04分37秒
Build Host  : ip-10-84-7-34.eu-west-1.compute.internal
Relocations : (not relocatable)
Vendor      : MariaDB Corporation Ab
Summary     : MaxScale
Description :
The MariaDB Corporation MaxScale is an intelligent proxy that allows forwarding of
database statements to one or more database servers using complex rules,
a semantic understanding of the database statements and the roles of
the various servers within the backend cluster of databases.

MaxScale is designed to provide load balancing and high availability
functionality transparently to the applications. In addition it provides
a highly scalable and flexible architecture, with plugin components to
support different protocols and routing decisions.

 

これで、Maxscaleが無事インストールできた。

3.設定

さて、次に設定を行おう。
「/etc/maxscale.cnf.template」をコピーして、設定ファイルを作成する。

cp /etc/maxscale.cnf.template /etc/maxscale.cnf

●/etc/maxscale.cnf

[maxscale]
threads=4 # 同時処理数
log_messages=1
log_trace=1
logdir=/var/log/maxscale

[Splitter Service]
type=service
router=readwritesplit
servers=サーバ01,サーバ02,サーバ03
max_slave_connections=100%
user=maxscale
passwd=パスワード
localhost_match_wildcard_host=true
enable_root_user=true

[Splitter Listener]
type=listener
service=Splitter Service
protocol=MySQLClient
port=3306

[Galera Monitor]
type=monitor
module=galeramon
servers=サーバ01,サーバ02,サーバ03
user=maxscale
passwd=パスワード
monitor_interval=30000
#disable_master_failback=1

[CLI]
type=service
router=cli

[CLI Listener]
type=listener
service=CLI
protocol=maxscaled
address=localhost
port=6603

[サーバ名01]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend

[サーバ名02]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend

[サーバ名03]
type=server
address=IPアドレス
port=3306
protocol=MySQLBackend

 

次に、DB側で以下のURLを実行し、maxscale用のモニタリング用ユーザを作成する。

CREATE USER 'maxscale'@'127.0.0.1' identified by 'パスワード';
CREATE USER 'maxscale'@'XXX.XXX.XXX.%' identified by 'パスワード';
GRANT SELECT on mysql.user to 'maxscale'@'%';
GRANT SELECT ON mysql.db to 'maxscale'@'%';
GRANT SHOW DATABASES ON *.* to 'maxscale'@'%' ;
GRANT REPLICATION SLAVE on *.* to 'maxscale'@'%' ;
GRANT REPLICATION CLIENT on *.* to 'maxscale'@'%' ;

 

4.接続

後は、実際にMaxscaleを動作させて接続出来ることを確認するだけだ。
まず、以下のコマンドでMaxscaleを起動させる。

systemctl start maxscale

 

次に、ちゃんとDBサーバを認識しているかどうかを確認する。
以下のコマンドを実行することで、DBサーバが認識されているかどうか、どのサーバが書き込みノード(マスター)かを確認する。

maxadmin -p パスワード(初期はmariadb) list servers
[root@BS-PUB-GFRONT-01 ~]# maxadmin -p mariadb list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
BS-PUB-GALERA-01   | 172.28.0.132    |  3306 |           0 | Slave, Synced, Running
BS-PUB-GALERA-02   | 172.28.0.133    |  3306 |           0 | Master, Synced, Running
BS-PUB-GALERA-03   | 172.28.0.134    |  3306 |           0 | Slave, Synced, Running
-------------------+-----------------+-------+-------------+--------------------

無事接続されていること、Masterノード(書き込みノード)が選定されている事が確認できた。
なお、このMasterの選定方法だが、GaleraClusterの『wsrep_local_index』が0のノードが自動的に選定される。

このため、この値が変動すると書き込みノードが切り替わるので注意。

 

次に、接続確認を行う。
Maxscaleを動作させている場合、自分自身に接続することでMaxscale経由での接続となるので、「127.0.0.1」に対し接続を実施する。

20160131_000000

[root@BS-PUB-GFRONT-01 ~]# rpm -qa | grep -i -e sql -e mariadb
MariaDB-client-10.0.22-1.el7.centos.x86_64
mariadb-enterprise-repository-0.1-1.noarch
sqlite-3.7.17-8.el7.x86_64
MariaDB-common-10.0.22-1.el7.centos.x86_64
MariaDB-shared-10.0.22-1.el7.centos.x86_64
[root@BS-PUB-GFRONT-01 ~]# ps -ef | grep mysql
root      3764  3566  0 22:08 pts/2    00:00:00 grep --color=auto mysql
[root@BS-PUB-GFRONT-01 ~]# mysql -u root -h 127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3735
Server version: 5.5.42-MariaDB

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

 

無事接続が出来ることが確認できた。
なお、実際に利用するユーザについては、リモートとローカルホスト(127.0.0.1)に同じ権限が付いている必要があるので注意する。

 

MariaDB&MySQL全機能バイブル MariaDB&MySQL全機能バイブル

Linuxでファイル・標準出力の特定のキーワードだけハイライト表示させる

$
0
0

LinuxやMacを使っていて、tail -Fやcatを使用時に特定のキーワード(例えばerrorとか)だけをハイライト表示させたい時がある。
だからと言っても、そのキーワードのある行だけが表示されるのは困り、全ての行を表示させたい。

 

1.grepコマンドを使う

そんな時でも、grepコマンドで対応することができる。
以下のように、「$(行末)」を指定しコマンドを実行することで、全ての行を表示させつつ対象のキーワードをハイライトさせることができる。

コマンド | grep --color=auto -e '$' -e 'キーワード'

もしくは

コマンド | grep -E --color=auto 'キーワード|$'

 

キーワードを複数指定する場合、「-e」でつなげていくか、egrep方式であればパイプでつなげていけばいい。
以下、CentOS 7でやってみた結果がこちら。

20160131_000010

 

なお、色を変更する場合は、以下のようにgrepコマンド実行前に変数「GREP_COLORS」にコードを代入し、「–color=always」オプションを付与することで対応できる。
かなり煩雑になるので、あまりいい方法とはいえないと思われる。

コマンド | GREP_COLORS='カラーコード' grep --color=always -e 'キーワード' -e '$' | GREP_COLORS='カラーコード' grep --color=always -e 'キーワード' -e '$' ...

もしくは

コマンド | GREP_COLORS='カラーコード' grep -E --color=always 'キーワード|$' | GREP_COLORS='カラーコード' grep -E --color=always 'キーワード|$' ...

20160131_000011

2.その他、有志の開発ツールを使う

有志の開発したツールで、『dev-shell-essentials』というツールがある。
これらを使う事で、grepより簡単にハイライト表示させることができる。

まず、以下のコマンドでインストールを行う。

git clone https://github.com/kepkin/dev-shell-essentials.git
cd dev-shell-essentials
source dev-shell-essentials.sh

 

インストール完了後、実際に使用してみよう。
以下のように使用する。複数指定する場合は、パイプでつなげていけばいい。

コマンド | highlight 色 キーワード

20160131_000012

 

こっちの方が、色分け含め簡単に出来そうだ。

 

はじめてUNIXで仕事をする人が読む本 (アスキー書籍) はじめてUNIXで仕事をする人が読む本 (アスキー書籍)

Linux/UNIXでCUIからファイルの分割(+圧縮)保存を行う

$
0
0

諸事情があって、圧縮したアーカイブファイルを分割して補完しておく必要が出たので、その備忘。
といっても、そんな大した事やるわけではなく、昔からあるsplitコマンドでの手法。

Linux/UNIXの場合は、splitコマンドを使えばいい。
以下のようにコマンドを実行することで、ファイルを圧縮しながら分割保存させることが出来る。

tar czvf - /アーカイブ化するディレクトリ | split -d -b 分割するバイト数 - 分割後のファイル名(連番)
[root@localhost work_1]# ls -l /work_1/
合計 307200
-rw-r--r--. 1 root root 104857600  2月  7 04:26 test1
-rw-r--r--. 1 root root 104857600  2月  7 04:26 test2
-rw-r--r--. 1 root root 104857600  2月  7 04:26 test3
[root@localhost work_1]#
[root@localhost work_1]# tar czvf - /work_1 | split -d -b 100K - /tmp/test_work_1_
tar: メンバ名から先頭の `/' を取り除きます
/work_1/
/work_1/test1
/work_1/test2
/work_1/test3
[root@localhost work_1]#
[root@localhost work_1]# ls -lh /tmp/test_work_1_0*
-rw-r--r--. 1 root root 100K  2月  7 04:44 /tmp/test_work_1_00
-rw-r--r--. 1 root root 100K  2月  7 04:44 /tmp/test_work_1_01
-rw-r--r--. 1 root root  99K  2月  7 04:44 /tmp/test_work_1_02

 

既存のファイルを分割する場合は、以下のようにコマンドを実行すれば良い。

split -d -b 分割するバイト数 分割元ファイル 分割後のファイル名(連番)

で、元に戻す方法だが、これは簡単。
単に、catで分割したファイルを一括で読込し、それを別ファイルにリダイレクトで書き出すだけだ。

cat 分割後のファイル名(連番)* > 元に戻す際のファイルPATH

 

そのまま解凍する場合は、パイプで繋いで以下のようにコマンドを実行すれば良い。

cat 分割後のファイル名(連番)* | tar xzvf -
[root@localhost work_1]# cat /tmp/test_work_1_0* | tar xzvf -
work_1/
work_1/test1
work_1/test2
work_1/test3
[root@localhost work_1]#
[root@localhost work_1]# ls -lah work_1/
合計 300M
drwxr-xr-x. 2 root root   42  2月  7 17:02 .
drwxr-xr-x. 3 root root   55  2月  7 17:03 ..
-rw-r--r--. 1 root root 100M  2月  7 04:26 test1
-rw-r--r--. 1 root root 100M  2月  7 04:26 test2
-rw-r--r--. 1 root root 100M  2月  7 04:26 test3

 

 

 

はじめてUNIXで仕事をする人が読む本 (アスキー書籍) はじめてUNIXで仕事をする人が読む本 (アスキー書籍)

Azure Blob StorageにPythonからファイルをアップロード/ダウンロード/削除する

$
0
0

仕事で、バックアップファイルをAzure Blob Storageにアップロードさせるスクリプトを作成する必要が出てきた。
Azure Blob StorageはRest APIに対応しているので、それで上げれば良さそうだ。

というわけで、こちらの内容を参考にPythonに書き直してスクリプトを作成してみた。
運用時にアップロード・ダウンロード・削除と使い分けするのが面倒だったので、サブコマンドを指定する方式にしている。

●azure_blob_backup.py

#!/bin/python
# -*- coding: utf-8 -*-
# +---------------------------------------------------------------------------------------+
# + [作成日] : 2016/02/02                                                                 +
# + [作成者] : Blacknon                                                                   +
# + [概要] :                                                                              +
# + AzureのBlobに対し、ファイルのアップロード・ダウンロード・削除処理を実施するスクリプト +
# +---------------------------------------------------------------------------------------+
import pycurl
import urllib
import datetime
import base64
import hmac,hashlib
import argparse
import os.path
import cStringIO
import xml.etree.ElementTree as ET

## --------------
# アカウント情報
## --------------
blob_account = 'ストレージアカウント'
blob_accesskey = 'アクセスキー'

def azure_blob_access():
    # 変数の代入
    blob_container = args.blob_container
    if args.subcommand == 'upload':
        file_path = args.file_path
        file_name = os.path.basename(file_path)
        http_request = 'PUT'
        html_body = open(file_path).read()
        html_size = str(len(html_body))
        content_leng = "Content-Length:" + html_size
        blob_path = "/" + blob_account + "/" + blob_container + "/" + file_name
        blob_url = "https://" + blob_account +".blob.core.windows.net/" + blob_container + "/" + file_name
    elif args.subcommand == 'download':
        file_name = args.file_name
        http_request = 'GET'
        if os.path.isdir(args.output_path):
            output_path = args.output_path + "/" + file_name
        else:
            output_path = args.output_path
        print output_path
        html_size = ''
        content_leng = ''
        blob_path = "/" + blob_account + "/" + blob_container + "/" + file_name
        blob_url = "https://" + blob_account +".blob.core.windows.net/" + blob_container + "/" + file_name
    elif args.subcommand == 'delete':
        file_name = args.file_name
        http_request = 'DELETE'
        html_size = ''
        content_leng = ''
        blob_path = "/" + blob_account + "/" + blob_container + "/" + file_name
        blob_url = "https://" + blob_account +".blob.core.windows.net/" + blob_container + "/" + file_name
    elif args.subcommand == 'list':
        http_request = 'GET'
        html_size = ''
        content_leng = ''
        blob_path = "/" + blob_account + "/" + blob_container + '\ncomp:list\nrestype:container'
        blob_url = "https://" + blob_account +".blob.core.windows.net/" + blob_container + '?restype=container&comp=list'

    # HTTPリクエスト情報の作成
    file_type = 'text/plain'
    html_headers = [
                    'x-ms-blob-type:BlockBlob',
                    'x-ms-version:2014-02-14',
                    ]
    html_date = datetime.datetime.now().strftime("%a, %d %b %Y %H:%M:%S GMT")
    stringToSign    = [
                      # VERB
                      http_request,
                      # Content-Encoding
                      '',
                      # Content-Language
                      '',
                      # Content-Length
                      html_size,
                      # Content-MD5
                      '',
                      # Content-Type
                      file_type,
                      # Date
                      html_date,
                      # If-Modified-Since
                      '',
                      # If-Match
                      '',
                      # If-None-Match
                      '',
                      # If-Unmodified-Since
                      '',
                      # Range
                      '',
                      ]
    stringToSign = stringToSign + html_headers + [blob_path]
    stringToSign = "\n".join(stringToSign)

    signature = base64.encodestring(hmac.new(base64.decodestring(blob_accesskey),stringToSign,hashlib.sha256).digest())
    signature = signature.rstrip("\n")
    authorization = "SharedKey " + blob_account +":" + signature

    html_headers = html_headers + [
                   "Authorization:" + authorization,
                   "Date:" + html_date,
                   "Content-Type:" + file_type,
                   content_leng,
                   ]
    c = pycurl.Curl()
    c.setopt(pycurl.URL, blob_url.rstrip("\n"))
    c.setopt(pycurl.HTTPHEADER, html_headers)
    c.setopt(pycurl.CUSTOMREQUEST, http_request)
    if args.subcommand == 'upload':
        c.setopt(pycurl.POSTFIELDS, html_body)
    elif args.subcommand == 'download':
        op = open(output_path,'wb')
        c.setopt(pycurl.WRITEDATA, op)
    elif args.subcommand == 'list':
        response = cStringIO.StringIO()
        c.setopt(c.WRITEFUNCTION, response.write)

    c.perform()
    if args.subcommand == 'list':
        text = response.getvalue()
        root = ET.fromstring(text)
        ufilelist= root.findall(".//Name")
        for ufile in ufilelist:
            print(ufile.text);

## ------------
# Paser設定
## ------------
parser = argparse.ArgumentParser(description='Azure Blob File Upload/Download/Delete. Only 1 File.')
subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')

# upload
parser_up = subparsers.add_parser('upload',help='upload file to Azure Blob.')
parser_up.add_argument('-c','--container',type=str,dest='blob_container',required=True,help='File upload destination of the Blob Container')
parser_up.add_argument('-f','--upload_file',type=str,dest='file_path',required=True,help='File to be uploaded to the Blob Container')

# download
parser_down = subparsers.add_parser('download',help='download file from Azure Blob.')
parser_down.add_argument('-c','--container',type=str,dest='blob_container',required=True,help='File download from This Blob Container')
parser_down.add_argument('-f','--download_file',type=str,dest='file_name',required=True,help='File to be downloaded to the Blob Container')
parser_down.add_argument('-o','--output_path',type=str,dest='output_path',required=True,help='File to out put path')

# delete
parser_del = subparsers.add_parser('delete',help='delete file Azure Blob.')
parser_del.add_argument('-c','--container',type=str,dest='blob_container',required=True,help='File delete from This Blob Container')
parser_del.add_argument('-f','--delete_file',type=str,dest='file_name',required=True,help='Delete to the Blob Container')

# list
parser_list = subparsers.add_parser('list',help='list up Azure Blob file.')
parser_list.add_argument('-c','--container',type=str,dest='blob_container',required=True,help='Get file list from This Blob Container')

# 変数代入
args=parser.parse_args()

azure_blob_access()

 

サブコマンドでlist、upload、download、deleteを使い、Azure Blob Storageに接続、操作できるようにしている。
なお、以下の問題点があるんだけど、とりあえず今は直してない。。。

  • Azure Blob Storage上にないファイルをダウンロードすると、エラーにならないでアウトプットに指定したPATHにそのまま出力する
  • Azure Blob Storageの仕様で64MBの制限があるのだが、その辺を考慮していない(上げたければ事前に分割しておく事)

ま、そのうち直す事にしようかな〜と…
今のところ、特に大きな影響ないし。

ひと目でわかるAzure 基本から学ぶサーバー&ネットワーク構築 ひと目でわかるAzure 基本から学ぶサーバー&ネットワーク構築

CentOS7でLVMのスナップショットを取得する(ディスク追加)

$
0
0

Galera Clusterのバックアップ検証を行う上で、LVMでのスナップショットを取得する必要があったので、まずスナップショットの作成についてのみ抜き出して記述する。
LVMのスナップショットを取得する場合、エクステントにある程度空きがある必要がある。今回は、こちらを参考にHDDを増設してLVMに組み込んで領域を追加、スナップショットの取得を行う。

1.LVMの領域追加

[root@BS-PUB-GALERA-02 ~]# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               39.51 GiB
  PE Size               4.00 MiB
  Total PE              10114
  Alloc PE / Size       10103 / 39.46 GiB
  Free  PE / Size       11 / 44.00 MiB
  VG UUID               P5WTTu-fPES-0Oow-kpx5-rzIn-k7c8-qNLBeS

 

…まぁ、ご覧のとおり空きが無い状態。
というわけで、まずディスクを増設してLVMに組み込んで空き領域を増やしてあげる必要がある。

HDD(/dev/sdb)を追加した後、fdiskでパーティション作成を行う。

parted -s -a optimal /dev/sdb -- mklabel gpt mkpart primary 1 -1 set 1 lvm on
[root@BS-PUB-GALERA-02 ~]# parted -s -a optimal /dev/sdb -- mklabel gpt mkpart primary 1 -1 set 1 lvm on
[root@BS-PUB-GALERA-02 ~]# fdisk -l /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: gpt


#         Start          End    Size  Type            Name
 1         2048    104855551     50G  Linux LVM       primary

 

パーティションの作成が終わったら、物理ボリュームの作成、既存論理ボリュームグループへの組み込みを行う。

pvcreate /dev/sdb1
vgextend 論理ボリュームグループ名 /dec/sdb1
[root@BS-PUB-GALERA-02 ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
[root@BS-PUB-GALERA-02 ~]# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "50.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               50.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               fuPenB-6xb9-co3w-cRBD-fE6R-2QZA-mv2Lcc

[root@BS-PUB-GALERA-02 ~]# vgextend centos /dev/sdb1
  Volume group "centos" successfully extended
[root@BS-PUB-GALERA-02 ~]# vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               89.50 GiB
  PE Size               4.00 MiB
  Total PE              22913
  Alloc PE / Size       10103 / 39.46 GiB
  Free  PE / Size       12810 / 50.04 GiB
  VG UUID               P5WTTu-fPES-0Oow-kpx5-rzIn-k7c8-qNLBeS

 

これで、スナップショットの取得準備が出来た。

2.スナップショットの取得

さて、次は実際にスナップショットを取得してみよう。
現在の利用容量を確認し、大体2GB程度あれば問題無いと思われるので、スナップショットの容量として2GBを指定して取得をする。

lvcreate -s -L 2G -n snap.$(date +%Y%m%d) /dev/centos/root
[root@BS-PUB-GALERA-02 ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    38G  1.5G   37G    4% /
devtmpfs                  909M     0  909M    0% /dev
tmpfs                     919M     0  919M    0% /dev/shm
tmpfs                     919M  8.3M  911M    1% /run
tmpfs                     919M     0  919M    0% /sys/fs/cgroup
/dev/sda1                 497M  125M  373M   25% /boot
tmpfs                     184M     0  184M    0% /run/user/0
[root@BS-PUB-GALERA-02 ~]# lvcreate -s -L 2G -n snap.$(date +%Y%m%d) /dev/centos/root
  Logical volume "snap.20160207" created.
[root@BS-PUB-GALERA-02 ~]# lvscan
  ACTIVE            '/dev/centos/swap' [2.00 GiB] inherit
  ACTIVE   Original '/dev/centos/root' [37.46 GiB] inherit
  ACTIVE   Snapshot '/dev/centos/snap.20160207' [2.00 GiB] inherit

 

無事、スナップショットを取得出来ている事が確認出来た。
次に、このスナップショットを読込み専用でマウントし、中身を取り出してみよう。

mount -o ro /dev/centos/snap.20160207 /mnt/snap

 

なお、この時以下のようなエラーが出力される事がある。

[root@BS-PUB-GALERA-02 ~]# mount -o ro /dev/centos/snap.20160207 /mnt/snap
mount: wrong fs type, bad option, bad superblock on /dev/mapper/centos-snap.20160207,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.
[root@BS-PUB-GALERA-02 ~]# dmesg | tail
[ 2642.189777]  sdb:
[ 2654.100063]  sdb: sdb1
[ 2729.753971]  sdb: sdb1
[ 3628.379730] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount
[ 3661.352877] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount
[ 3733.808690] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount
[ 3783.939046] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount
[ 3792.973191] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount
[ 3835.167948] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount
[ 3936.969841] XFS (dm-4): Filesystem has duplicate UUID d06ae08e-e2de-48d0-b483-8f1a17b47f23 - can't mount

 

これは、どうやらUUIDが重複したデバイスをマウントしようとしたために出るエラーのようだ。
このエラーが出た場合は、以下のように「-o nouuid」を付与してコマンドを実行する。

mount -o nouuid -o ro /dev/centos/snap.20160207 /mnt/snap
[root@BS-PUB-GALERA-02 ~]# mount -o nouuid -o ro /dev/centos/snap.20160207 /mnt/snap
[root@BS-PUB-GALERA-02 ~]# ls -la /mnt/snap/
合計 28
dr-xr-xr-x. 17 root root 4096  1月 31 18:26 .
drwxr-xr-x.  3 root root   17  2月  7 16:09 ..
-rw-r--r--   1 root root    0  1月 31 18:26 .autorelabel
lrwxrwxrwx.  1 root root    7  1月 25 05:14 bin -> usr/bin
drwxr-xr-x.  2 root root    6  1月 25 05:13 boot
drwxr-xr-x.  2 root root    6  1月 25 05:13 dev
drwxr-xr-x. 76 root root 8192  2月  7 15:08 etc
drwxr-xr-x.  2 root root    6  8月 12 23:22 home
lrwxrwxrwx.  1 root root    7  1月 25 05:14 lib -> usr/lib
lrwxrwxrwx.  1 root root    9  1月 25 05:14 lib64 -> usr/lib64
drwxr-xr-x.  2 root root    6  8月 12 23:22 media
drwxr-xr-x.  2 root root    6  8月 12 23:22 mnt
drwxr-xr-x.  2 root root    6  8月 12 23:22 opt
drwxr-xr-x.  2 root root    6  1月 25 05:13 proc
dr-xr-x---.  3 root root 4096  2月  7 14:53 root
drwxr-xr-x.  2 root root    6  1月 25 05:13 run
lrwxrwxrwx.  1 root root    8  1月 25 05:14 sbin -> usr/sbin
drwxr-xr-x.  2 root root    6  8月 12 23:22 srv
drwxr-xr-x.  2 root root    6  1月 25 05:13 sys
drwxrwxrwt.  7 root root   88  2月  7 15:09 tmp
drwxr-xr-x. 13 root root 4096  1月 25 05:14 usr
drwxr-xr-x. 19 root root 4096  2月  7 15:08 var

 

無事、スナップショットの取得と中身の確認を行う事が出来た。
ディスクごとまるまる戻す場合は、lvconvertコマンドを実行することで戻すことができるが、今回の目的はあくまでもファイルの切り戻しを行えるようにすることなので、今回はそこまで確認はしない。

Linux LVM - Logical Volume Manager - la guida definitiva (Italian Edition) Linux LVM - Logical Volume Manager - la guida definitiva (Italian Edition)

CentOS 7とMariaDB 10.1.11でGalera Clusterを構成する

$
0
0

MariaDB 10.1系でGalera Clusterを使いたかったので、その方法について備忘。
地味に10.0系から結構変わっていて、少し手こずってしまった。

今回インストールするのは、2016年02月12日時点で最新版となる10.1.11とする。

1.インストール

まずはインストールから。
MariaDB 10.1系からはMariaDBにGalera Clusterが含まれているので、普通にそのままインストールを行う。

rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
cat << EOF > /etc/yum.repos.d/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1.11/centos7-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1
EOF
yum -y install mariadb-server mariadb

 

これでインストールが完了した。

 

2.設定

次に設定。これがMariaDB10.0系と少し異なるようだ。ここでは細かい設定はせず、最低限動作する設定にしておく。
まず、最初に起動するノード(MasterNode)で、以下のように設定ファイルを記述する。

●/etc/my.cnf.d/server.cnf(MasterNode)

[mysqld]
bind-address=0.0.0.0

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
binlog_format=ROW
<span style="color: #ff0000;">wsrep_cluster_address='gcomm://'</span>
wsrep_cluster_name='DBCLUSTER'
wsrep_node_name='DBCLUSTER-NODE1'
wsrep_node_address = IPアドレス

 

次に、2台目以降のノード(OtherNode)の設定ファイルを、以下のように記述する。

●/etc/my.cnf.d/server.cnf(OtherNode)

[mysqld]
bind-address=0.0.0.0

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
binlog_format=ROW
<span style="color: #ff0000;">wsrep_cluster_address='gcomm://MasterNodeIPアドレス,OtherNodeIPアドレス,...'</span>
wsrep_cluster_name='DBCLUSTER'
wsrep_node_name='DBCLUSTER-NODEn'
wsrep_node_address = IPアドレス

3.起動

最後に、MariaDBを起動させてGaleraClusterを構成させる。
まず、1台目のノード(MasterNode)で、以下のようにコマンドを実行する。

service mysql start start --wsrep-new-cluster
[root@BS-PUB-GALERA-01 ~]# service mysql start start --wsrep-new-cluster
Starting mysql (via systemctl):                            [  OK  ]
[root@BS-PUB-GALERA-01 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+

 

1台目が無事起動したら、2台目以降を以下のコマンドで起動する。

service mysql start start
[root@BS-PUB-GALERA-02 ~]# service mysql start
Starting mysql (via systemctl):                            [  OK  ]
[root@BS-PUB-GALERA-02 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 1     |
+-------------------+-------+

 

これで、無事GaleraClusterが構成された。
なお、この設定で動作させた場合、MasterNode(wsrep_local_indexが0のノード)をある程度固定にすることができるようだ。

例えば、3台構成でGaleraClusterを構成し、MasterNodeに障害が発生したとする。

[root@BS-PUB-GALERA-01 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2 "No such file or directory")

----

[root@BS-PUB-GALERA-02 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+

----

[root@BS-PUB-GALERA-03 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 1     |
+-------------------+-------+

 

で、再度MasterNodeを起動させた場合、以下のようになった。

[root@BS-PUB-GALERA-01 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+

----

[root@BS-PUB-GALERA-02 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 1     |
+-------------------+-------+

----

[root@BS-PUB-GALERA-03 ~]# mysql -u root -e "show status like 'wsrep_local_index';"
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 2     |
+-------------------+-------+

 

つまり、Maxscaleと組み合わせて書き込み・読込みノードを切り分けた際、書き込みノードがある程度推測出来るということになる。
もちろん、ちゃんと運用してみないとわからないものではあるが、3~4回ためした限りは同じ動作をしている。

う~ん…会社の検証機、アップデートしようかな…
設定ファイル書き換えが必要そうだけど

 

実践ハイパフォーマンスMySQL 第3版 実践ハイパフォーマンスMySQL 第3版

第21回シェル芸勉強会に参加してきました(復習)

$
0
0

前回に引き続き、今回もシェル芸勉強会へ参加してきました。
…風邪ぶり返したので、懇親会は出ず即効で帰ってきましたが。

今回の問題はこちら
上田先生の本をちゃんと読んでいればできる“問題をチョイスしたらしい。
(…買ったし読んではいたけど、その時の自分に役たちそうなトコしか読まずに、”あんま使わないっぽいな”と思ったトコは飛ばしてたような気がする。)

今回はいつも持っていってるノート(Ubuntu)ではなくMacからCentOS7につなげて解いていたので、同様に復習もCentOS 7で行う事にする。
なお、問題に使用するデータはgithubに上がっているので、以下のコマンドでローカルに持ってくること。

git clone https://github.com/ryuichiueda/ShellGeiData.git

 

Q1.

pdfの中身を閲覧し標準出力で出す問題。
pdfの内容を標準出力で出すコマンドとして、pdftotextというコマンドがあるので、それを使うと良いだろう。
(これらを使わずに、stringsなどで取得する方法が無いか調べてみたのだけど、どうもたいていのPDFはzlibのbase64で差分圧縮しているらしい。
今回使われているPDFファイルも、stringsで中身を見ると~/FlateDecode/~とあるので、多分一行は無理ってことで今回は断念した。)

pdftotextは、以下のコマンドでインストール出来る。

yum -y install poppler-utils # RHEL系の場合
apt-get -y install poppler-utils # Debian/Ubuntuの場合
pdftotext -q bba.pdf -
[root@test-node Q1]# pdftotext -q bba.pdf -
群馬のシャブばばあ

hoge.txt[2016/02/09 22:30:32]

 

Q2.

ファイルの中身を、日本語変換して固定長にするという問題。あるべき姿を見ると、固定長は35文字のようなので、それに合わせて分割する必要がある。
元のエンコードはShiftJISで、UTF-8に変換するので、nkfやiconvなどを用いる必要がある。nkfは最近のディストリでは使われていないので、ここではiconvを用いる。

折り返しについては、grepかfoldで実行すると良いようだ。

iconv -f sjis -t utf8 anydata.cp932 | grep -oE .{35}
iconv -f sjis -t utf8 anydata.cp932 | fold -35

20160214_000000

[root@test-node Q2]# cat anydata.cp932
00000001ハナ??゙ンコウ*******214413051100000002?ドバ?*********114413018800000003コド?゙ンコウ********210413093100000004ハタ?゙ンコウ*********234413000800000005アンタ?グラウント?゙ンコウ331413090000000006バЭーダメンゼイギンコウ1234130981

[root@test-node Q2]# iconv -f sjis -t utf-8 anydata.cp932
00000001ハナモゲギンコウ*******214413051100000002ハードバンク*********114413018800000003コドモギンコウ********210413093100000004ハタンギンコウ*********234413000800000005アンダーグラウンドギンコウ331413090000000006バミューダメンゼイギンコウ1234130981

[root@test-node Q2]# iconv -f sjis -t utf8 anydata.cp932 | grep -oE .{35}
00000001ハナモゲギンコウ*******2144130511
00000002ハードバンク*********1144130188
00000003コドモギンコウ********2104130931
00000004ハタンギンコウ*********2344130008
00000005アンダーグラウンドギンコウ3314130900
00000006バミューダメンゼイギンコウ1234130981
[root@test-node Q2]# iconv -f sjis -t utf8 anydata.cp932 | fold -35
00000001ハナモゲギンコウ*******2144130511
00000002ハードバンク*********1144130188
00000003コドモギンコウ********2104130931
00000004ハタンギンコウ*********2344130008
00000005アンダーグラウンドギンコウ3314130900
00000006バミューダメンゼイギンコウ1234130981

 

Q3.

Q3は、2016年の全ての日曜日を出力せよ、と言うもの。
これは結構簡単で、まずechoで2016/01/01~2016/12/31までの日付を出力、それをxargsで1個づつdateコマンドに渡してやって、最後にgrepで日曜日だけ取得すれば良い。

echo '2016/01/01\ +'{0..365}'\ days' | LANG=C xargs -n1 date -d | grep Sun

 

さすがに全日付を記述するのは大変なので、2016/1/1~2016/1/7で例した結果がこちら。

20160214_000001

[root@test-node Q2]# echo '2016/01/01\ +'{0..7}'\ days'
2016/01/01\ +0\ days 2016/01/01\ +1\ days 2016/01/01\ +2\ days 2016/01/01\ +3\ days 2016/01/01\ +4\ days 2016/01/01\ +5\ days 2016/01/01\ +6\ days 2016/01/01\ +7\ days
[root@test-node Q2]#
[root@test-node Q2]# date -d "2016/01/01 +1 days"
2016年  1月  2日 土曜日 00:00:00 JST
[root@test-node Q2]#
[root@test-node Q2]# echo '2016/01/01\ +'{0..7}'\ days' | LANG=C xargs -n1 date -d
Fri Jan  1 00:00:00 JST 2016
Sat Jan  2 00:00:00 JST 2016
Sun Jan  3 00:00:00 JST 2016
Mon Jan  4 00:00:00 JST 2016
Tue Jan  5 00:00:00 JST 2016
Wed Jan  6 00:00:00 JST 2016
Thu Jan  7 00:00:00 JST 2016
Fri Jan  8 00:00:00 JST 2016
[root@test-node Q2]#
[root@test-node Q2]# echo '2016/01/01\ +'{0..7}'\ days' | LANG=C xargs -n1 date -d | grep ^Sun
Sun Jan  3 00:00:00 JST 2016

 

Q4.

データベースを模したテキストファイルで、キーに従ってデータをアップデートするイメージの問題。
難しそうだが、sortコマンドだけで解答が可能のようだ。

sort -suk1,1 newdata data

20160214_000002

[root@test-node Q4]# grep "" ./*
./data:001 あみだばばあ
./data:002 砂かけばばあ
./data:003 ******
./data:004 尾崎んちのババア
./newdata:002 *******
./newdata:003 群馬のシャブばばあ
./newdata:005 純愛ババア学園
[root@test-node Q4]# # newdata dataの順でsortに読み込む(newdataの行の方が上にくる)
[root@test-node Q4]# sort newdata data
001 あみだばばあ
002 *******
002 砂かけばばあ
003 ******
003 群馬のシャブばばあ
004 尾崎んちのババア
005 純愛ババア学園
[root@test-node Q4]# # -sオプションで sort結果を固定にする
[root@test-node Q4]# # -u & -k1,1で、1列目の内容でユニークな行のみ出力させる
[root@test-node Q4]# sort -suk1,1 newdata data
001 あみだばばあ
002 *******
003 群馬のシャブばばあ
004 尾崎んちのババア
005 純愛ババア学園

 

Q5.

シェルスクリプトをデバッグせよ、という問題。
一見、何も問題無さそうなんだけど…どうやら、a.bashはBomが、b.bashではチルダが通常使用されるものではないという問題があるようだ。

[root@test-node Q5]# grep "" ./*
./a.bash:#!/bin/bash
./a.bash:
./a.bash:echo Hell
./b.bash:#!/bin/bash
./b.bash:
./b.bash:ls ?/

 

で、デバッグとしては以下のコマンドを実行する。
(b.bashは、teratermだとうまく文字入れられなかったので無理やり置換している)

nkf --overwrite -wLux a.bash # a.bash
sed -i 's/.\//~\//g' b.bash # b.bash

 

Q6.

拡張正規表現を標準正規表現に変換して、bash上で展開しろ、という問題。
たとえば、「a{4}」とあったら、展開して「aaaa」として出力させろ、というもの。

これについては、今のところゴリ押しでいくしかなさそうだ。echoとか、pythonやrubyのprintで展開出来ないか調べてはみたけど無理そう。
以下、解答例。

sed -e 's/[+}]/&amp;amp;\n/g' -e 's/\(.*\)+/\1\1*/' extended | tr '{}()' ' &amp;nbsp; &amp;nbsp;' | awk 'NF==2{for(i=1;i&amp;lt;=$2;i++){printf $1};print ""}NF==1' | tr -d '\n' | xargs
[root@test-node Q6]# sed -e 's/[+}]/&\n/g' -e 's/\(.*\)+/\1\1*/' extended | tr '{}()' '    ' | awk 'NF==2{for(i=1;i<=$2;i++){printf $1};print ""}NF==1' | tr -d '\n' | xargs
a+hhhhhhohohohohohohohohoho[0-9]a+hhhhhhohohohohohohohohoho[0-9]*

 

Q7.

用意されているテキストの、各段落の文字数をカウントするというもの。
模範解答より短く、awkだけで解答することもできるようだ。(どうしてこんなんパッと出てくるんだろう…)

とりあえず、まず模範解答から分解してみる。

cat text | tr -d "\n" | sed 's/ /\n/g' | awk '{print length($1),$1}'
[root@test-node Q7]# # 一旦、ファイルの改行を全て削除する
[root@test-node Q7]# cat text | tr -d "\n"
 恥の多い生涯を送って来ました。 自分には、人間の生活というものが、見当つかないのです。自分は東北の 田舎に生れましたので、汽車をはじめて見たのは、よほど大きくなってからでした。自分は停車場のブリッジを 、上って、降りて、そうしてそれが線路をまたぎ越えるために造られたものだという事には全然気づかず、ただ それは停車場の構内を外国の遊戯場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるも のだとばかり思っていました。しかも、かなり永い間そう思っていたのです。ブリッジの上ったり降りたりは、 自分にはむしろ、ずいぶん垢抜けのした遊戯で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィス の一つだと思っていたのですが、のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過ぎな いのを発見して、にわかに興が覚めました。 また、自分は子供の頃、絵本で地下鉄道というものを見て、これ もやはり、実利的な必要から案出せられたものではなく、地上の車に乗るよりは、地下の車に乗ったほうが風が わりで面白い遊びだから、とばかり思っていました。
[root@test-node Q7]# 
[root@test-node Q7]# # 段落(頭の全角空白)を全て改行に置換する
[root@test-node Q7]# cat text | tr -d "\n" | sed 's/ /\n/g'

恥の多い生涯を送って来ました。
自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生れましたので、汽車をはじめ て見たのは、よほど大きくなってからでした。自分は停車場のブリッジを、上って、降りて、そうしてそれが線 路をまたぎ越えるために造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の遊戯場み たいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだとばかり思っていました。しかも 、かなり永い間そう思っていたのです。ブリッジの上ったり降りたりは、自分にはむしろ、ずいぶん垢抜けのし た遊戯で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだと思っていたのですが、のち にそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過ぎないのを発見して、にわかに興が覚めま した。
また、自分は子供の頃、絵本で地下鉄道というものを見て、これもやはり、実利的な必要から案出せられたもの ではなく、地上の車に乗るよりは、地下の車に乗ったほうが風がわりで面白い遊びだから、とばかり思っていま した。
[root@test-node Q7]# 
[root@test-node Q7]# # awkで各行の文字列を取得する
[root@test-node Q7]# cat text | tr -d "\n" | sed 's/ /\n/g' | awk '{print length($1),$1}'
0
15 恥の多い生涯を送って来ました。
353 自分には、人間の生活というものが、見当つかないのです。自分は東北の田舎に生れましたので、汽車をは じめて見たのは、よほど大きくなってからでした。自分は停車場のブリッジを、上って、降りて、そうしてそれ が線路をまたぎ越えるために造られたものだという事には全然気づかず、ただそれは停車場の構内を外国の遊戯 場みたいに、複雑に楽しく、ハイカラにするためにのみ、設備せられてあるものだとばかり思っていました。し かも、かなり永い間そう思っていたのです。ブリッジの上ったり降りたりは、自分にはむしろ、ずいぶん垢抜け のした遊戯で、それは鉄道のサーヴィスの中でも、最も気のきいたサーヴィスの一つだと思っていたのですが、 のちにそれはただ旅客が線路をまたぎ越えるための頗る実利的な階段に過ぎないのを発見して、にわかに興が覚 めました。
103 また、自分は子供の頃、絵本で地下鉄道というものを見て、これもやはり、実利的な必要から案出せられた ものではなく、地上の車に乗るよりは、地下の車に乗ったほうが風がわりで面白い遊びだから、とばかり思って いました。

 

次に、ebanさんのawkだけで取得するパターン。
(自分の理解のために少し順番変えた)

awk RS=' ' 'gsub(/\n/,"")&&$0=length' text
[root@test-node Q7]# awk RS=' ' 'gsub(/\n/,"")&&$0=length' text
15
353
103

 

考え方は、以下であってるんだろか…

  • まず、RS=’ ’で区切り文字を段落にする
  • gsub(/\n/,"")で既存の改行を置換
  • ↑と同時(&&)に、$0に1区切りの文字数を代入

$0に値が入っているので、特にprintとかしなくても値が返ってくる。

 

Q8.

メールのファイルから、画像を抽出するというもの。
uudeviewというコマンドを用いる事で、一発で抽出することが出来る。

●RHEL系の場合(CentOS 7で確認)

wget http://www.fpx.de/fp/Software/UUDeview/download/uudeview-0.5.20.tar.gz
tar xzvf uudeview-0.5.20.tar.gz
cd uudeview-0.5.20
./configure
make
make install

 

●Debian/Ubuntuの場合

apt-get install uudeview

 

で、解答は以下。

uudeview -i 1350369599.Vfc03I4682c8M940114.remote
[root@test-node Q8]# uudeview -i 1350369599.Vfc03I4682c8M940114.remote
Loaded from 1350369599.Vfc03I4682c8M940114.remote: '2hA|$rE:IU$7$^$9!*' (B2hA): CHINJYU.JPG part 1   Base64
Loaded from 1350369599.Vfc03I4682c8M940114.remote: '2hA|$rE:IU$7$^$9!*' (B2hA): IMG_0965.JPG part 1   Base64

Found 'CHINJYU.JPG' State 16 Base64 Parts 1 OK
Found 'IMG_0965.JPG' State 16 Base64 Parts 1 OK

    File successfully written to /root/ShellGeiData/vol.21/Q8/CHINJYU.JPG
    File successfully written to /root/ShellGeiData/vol.21/Q8/IMG_0965.JPG
2 files decoded from 1 input file, 0 failed

 

これで復習は終わり。
…次回こそはもうちょっと上手く解答出来ると良いんだけど(毎回言ってる)。

とりあえず、この世の大体のことはawkが解決してくれるやうである。

 

シェルプログラミング実用テクニック シェルプログラミング実用テクニック

Lsyncdでローカル⇔リモート間でファイルの双方向自動同期を行う

$
0
0

時折、どこかのノードで設定ファイルとか編集をしたら、自動的に同期して他のノードでも設定を変えて欲しい時がある。
台数が多ければAnsibleなどで設定ファイルを一括更新するが、2~3台でそこまでするのもなぁ…というときは、Lsyncdを使って自動的に同期させると良いだろう。

Lsyncdは、inotify(Linuxに用意されている、ファイルの変更を検知する仕組み)で、変更を検知したと同時にrsyncでファイルを同期するデーモンツールだ。
比較的簡単に設定ができ、ファイルの削除や新規追加、変更でも同期を自動的に行ってくれる。もちろん、中身はrsyncなのでssh経由でのリモート同期も可能だ。

ここでは、各サーバで「/opt/syncd」というディレクトリを、ssh経由での通信で自動同期させてみる。
なお、前にもこっちで書いてたようだが、今回のはssh経由での通信を行わせる(やったことあるの忘れてた)。

 

1.インストール

まずはインストールから。
以下のように、yumやapt-getでインストールできる。

●RHEL系(以下では、CentOS7を使用)

rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install lsyncd rsync

 

●Debian/Ubuntu系

sudo apt-get install lsyncd

 

これで、インストールができた。

2.設定

まず、各サーバでsshの公開鍵認証によるログイン設定を行う。
自動同期を行う各サーバで、以下の処理を実行する。

ssh-keygen
ssh-copy-id ユーザ@ホスト名(IPアドレス)
[root@BS-PUB-GALERA-01 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
2b:51:e5:3b:6a:2f:37:30:29:54:ba:12:0c:f6:34:15 root@BS-PUB-GALERA-01.BLACKNON.LOCAL
The key's randomart image is:
+--[ RSA 2048]----+
|     .E.  .      |
|  o o   .o       |
| . = . o. .      |
|    + o.   .     |
|     o..S.o      |
|    . o.+o .     |
|     ...+o       |
|       o..o      |
|         o..     |
+-----------------+
[root@BS-PUB-GALERA-01 ~]# ssh-copy-id root@XXX.XXX.XXX.XXX
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@XXX.XXX.XXX.XXX's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@XXX.XXX.XXX.XXX'"
and check to make sure that only the key(s) you wanted were added.

 

これで、sshの公開鍵認証でのログイン設定が完了した。
次に、lsyncdの設定ファイルを記述する。

「/usr/share/doc/lsyncd/lrsync.lua」もしくはこちらの情報を参考に、以下のように「/etc/lsyncd.conf」を作成する。

●/etc/lsyncd.conf

-- 基本設定
settings = {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/run/lsyncd.stat",
statusInterval = 1,
}

-- 各ノードごとの同期設定
sync{
default.rsyncssh,
delay = 0,
source="/opt/syncd",
host="ユーザ名@ホスト名(IPアドレス)",
targetdir="/opt/syncd",
delete="running"
}

 

上記のような設定ファイルを各ノードに設置し、lsyncdを起動する。

service lsyncd start

 

これで、「/opt/syncd」配下の中身が各ノードで全て同期されるようになった。
同期も、「delay=0」と指定しているので、3台程度であれば即座に反映される。設定ファイルの同期であれば、問題なく利用できるだろう。

 

【Amazon.co.jp限定】 擬人化でまなぼ! ネットワークのしくみ ★特製トレーディングカード2種付き 【Amazon.co.jp限定】 擬人化でまなぼ! ネットワークのしくみ ★特製トレーディングカード2種付き

pdfの内容を標準出力で出力させる

$
0
0

先日のシェル芸勉強会で、pdfの内容をコンソール上で確認する問題があったので、その備忘。
コンソール上でpdfを標準出力させる場合、通常のプリインストールされているコマンドからだと少々難しいようだ。

というのも、良く使用されているpdfの場合だと中のテキストなどがzlibで圧縮された状態で保持されているため、ここをうまいことzilbで解凍する必要があるらしい。
通りで…単純なテキストしか入ってないpdfなのに、中見たらわけわからんと思ったら…

このへんを参考になんとか作れるかも(stringsで読込み、awkなどでFlateDecodeされた箇所だけを抽出して復号化、それをテキストとして抽出?)しれないが、復号化のトコで躓いた。ワンライナーでは厳しそうだ…。
openssl -zlib -dなどでは出来ない様子。

という訳で、これについてはちゃんとpdfからテキストに戻すコマンドが世の中には存在しているため、それを使うことにする。
pdftotextというコマンドで、結構昔からあるコマンドのようだ。

以下のコマンドでインストール出来る。

yum install poppler-utils # RHEL系の場合
apt-get install poppler-utils # Debian/Ubuntu系の場合
brew install poppler # MacOS Xの場合

細かい箇所についてはmanに任せる事にし、簡単な使い方だけを説明する。
まず普通にオプション無しで実行した場合は、読み込んだpdfファイルと同じディレクトリに同名のtxtファイルを出力するようになっている。

[root@test-node vol.21]# ls Q1/
bba.pdf
[root@test-node vol.21]# pdftotext Q1/bba.pdf
Syntax Warning: Invalid Font Weight
[root@test-node vol.21]# ls Q1/
bba.pdf  bba.txt
[root@test-node vol.21]# cat Q1/bba.txt
群馬のシャブばばあ

hoge.txt[2016/02/09 22:30:32]

 

ファイル出力ではなく標準出力にする場合は、「-」を付与する。
(ただし、警告やエラーは出力される)

[root@test-node vol.21]# pdftotext Q1/bba.pdf -
Syntax Warning: Invalid Font Weight
群馬のシャブばばあ

hoge.txt[2016/02/09 22:30:32]

 

警告やエラーを非表示にする場合は、「-q」オプションを付与する。

[root@test-node vol.21]# pdftotext -q Q1/bba.pdf -
群馬のシャブばばあ

hoge.txt[2016/02/09 22:30:32]

その他、pdfの特定ページだけを出力させたり、pdfのフォーマットを維持したままで出力させたりすることも可能なようだ。

 

PDF構造解説 PDF構造解説

dateコマンドで1年分の日付を取得する

$
0
0

先日出席したシェル芸勉強会で、処理の途中で一年分(というか、指定期間)の日付をdateコマンドで出力させる必要があった。
で、日単位であれば以下のようにコマンドを実行することで、一覧として出力可能だ。

echo '2016/01/01\ +'{0..365}'\ days' | LANG=C xargs -n1 date -d

 

わかりやすいかどうかわからないけど、解説。
dateコマンドの-d(–date)オプションでは、以下のように”日付 + ○ (days|month)”などのように、日付を計算させることが出来るのだ。
例えば、「2016/01/01 + 1 month」とすると…

[root@test-node ~]# date -d '2016/01/01 + 1 month'
2016年  2月  1日 月曜日 00:00:00 JST

と、このように1ヶ月後の日付を取得できるのだ。
つまり、-dでこのように”計算”できるようにechoで渡す事で、指定した日から○○日間(-で前の日付も出来る)の日付だけを出力させることが出来る。

[root@test-node ~]# echo '2016/01/01\ +'{0..13}'\ days' | LANG=C xargs -n1 date -d
Fri Jan  1 00:00:00 JST 2016
Sat Jan  2 00:00:00 JST 2016
Sun Jan  3 00:00:00 JST 2016
Mon Jan  4 00:00:00 JST 2016
Tue Jan  5 00:00:00 JST 2016
Wed Jan  6 00:00:00 JST 2016
Thu Jan  7 00:00:00 JST 2016
Fri Jan  8 00:00:00 JST 2016
Sat Jan  9 00:00:00 JST 2016
Sun Jan 10 00:00:00 JST 2016
Mon Jan 11 00:00:00 JST 2016
Tue Jan 12 00:00:00 JST 2016
Wed Jan 13 00:00:00 JST 2016
Thu Jan 14 00:00:00 JST 2016

 

Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック) Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック)

Linux/UNIXで連続した文字列を特定の長さで改行分割する

$
0
0

先日出席したシェル芸勉強会で、連続した文字列を特定の長さ(バイト数・文字数などなどの固定長)で改行して出力させるような問題があり、それの解法について覚えておきたいのがあったので備忘。
基本的にはfoldコマンドで行うのだが、地味にgrepコマンドでも同様の処理ができる。

1.foldコマンド

foldコマンドは、指定した文字数もしくはバイト数で文字列を折りたたむコマンド。
まさにこの処理のためにあるようなコマンドで、以下のようにコマンドを実行することで、半角文字列を指定した列数(バイト数)で改行させることができる。
(全角文字列の場合は、バイト数で計算される様子。)

fold -列数
fold -bバイト数

20160215_000000

blacknon@X201:~$ cat /tmp/test
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee
blacknon@X201:~$
blacknon@X201:~$ cat /tmp/test | fold -10
aaaaaaaaaa
bbbbbbbbbb
cccccccccc
dddddddddd
eeeeeeeeee

2.grepコマンド

grepコマンドでも同様の処理を行う事が出来る。
(こちらは全角でも文字数通りに動作するが、行によっては後半が出力されない事があるので注意。)

grep -oE .{文字数}
blacknon@X201:~$ cat /tmp/test
aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeee
blacknon@X201:~$ cat /tmp/test | grep -Eo .{10}
aaaaaaaaaa
bbbbbbbbbb
cccccccccc
dddddddddd
eeeeeeeeee

 

はじめてUNIXで仕事をする人が読む本 (アスキー書籍) はじめてUNIXで仕事をする人が読む本 (アスキー書籍)

正規表現ジェネレーターコマンド『rgxg』を使ってみる

$
0
0

諸事情あって正規表現について調べていたところ、どうやら正規表現を作成してくれる『rgxg』というコマンドがあるようだ。
早速、インストールして使ってみよう。

なお、検証したOSはUbuntu 14.04 LTSを用いている。

1.インストール

まずはインストールから。
以下のコマンドでインストール出来る。

sudo apt-get install rgxg

 

これでインストールが出来た。

2.実行

さて、それでは実際にコマンドを実行してみよう。
詳細な使い方については、manで見てもらうとして、ここではいくつかの例を抜粋して紹介する。

このrgxgコマンドでは、基本的には以下のようにサブコマンドを指定して正規表現を生成する。

rgxg [alternation,cidr,escape,range] 正規表現にしたい内容
blacknon@BS-PUB-UBUNTU-01:~$ rgxg
Usage: rgxg COMMAND [ARGS]

The available rgxg commands are:
  alternation     Create regex that matches any of the given patterns
  cidr            Create regex that matches all addresses of the given CIDR block
  escape          Escape the given string for use in a regex
  range           Create regex that matches integers in a given range

Type 'rgxg help COMMAND' for help information on a specific command.

Type 'rgxg version' to see the version of rgxg.

 

細かいオプションはおいといて、それぞれのサブコマンドでの指定方法と出力結果についてを紹介する。

2-1.alternation

alternationは、”指定した条件のどれか”に当てはまる正規表現を生成してくれる。
以下、例。

blacknon@BS-PUB-UBUNTU-01:~$ rgxg alternation aaa bbb
(aaa|bbb)
blacknon@BS-PUB-UBUNTU-01:~$ rgxg alternation aaa baa
(aaa|baa)
blacknon@BS-PUB-UBUNTU-01:~$ rgxg alternation aaa bbb ccc
(aaa|bbb|ccc)

 

2-2.cidr

cidrはもうそのままで、CIDRで指定した条件でIPアドレスを生成してくれる正規表現を作成してくれる。
地味にIPv4だけではなくIPv6にも対応しているようだ。

blacknon@BS-PUB-UBUNTU-01:~$ rgxg cidr 192.168.1.0/24
192\.168\.1\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])
blacknon@BS-PUB-UBUNTU-01:~$ rgxg cidr 10.0.0.0/22
10\.0\.[0-3]\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])
blacknon@BS-PUB-UBUNTU-01:~$ rgxg cidr -l 2001:db8:aaaa::/64
2001:0?db8:aaaa((:(:[0-9a-f]{1,4}){1,4}|::|:0?0?0?0(:(:[0-9a-f]{1,4}){1,3}|::|:[0-9a-f]{1,4}(:(:[0-9a-f]{1,4}){1,2}|::|:[0-9a-f]{1,4}(::[0-9a-f]{1,4}|::|:[0-9a-f]{1,4}(::|:[0-9a-f]{1,4})))))|(:(:[0-9a-f]{1,4}){0,2}|:0?0?0?0(:(:[0-9a-f]{1,4})?|:[0-9a-f]{1,4}(:|:[0-9a-f]{1,4}))):(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})

 

2-3.escape

escapeは、指定した条件でエスケープする必要がある箇所をエスケープして出力してくれるというもの。
もしかしたら、使えるサブコマンドの中で一番実用的なのかもしれない。

blacknon@BS-PUB-UBUNTU-01:~$ rgxg escape '(aaa|bbb)'
\(aaa\|bbb\)
blacknon@BS-PUB-UBUNTU-01:~$ rgxg escape '$((1+2))'
\$\(\(1\+2\)\)

 

2-4.range

rangeは、指定した範囲を表現する正規表現を出力してくれるというサブコマンド。

blacknon@BS-PUB-UBUNTU-01:~$ rgxg range 1 051
(5[01]|[1-4][0-9]|[1-9])
blacknon@BS-PUB-UBUNTU-01:~$ rgxg range 1001 1051
(105[01]|10[1-4][0-9]|100[1-9])

 

使うことがあるかはわからないけど、まぁ、全くの役に立たないってことは無いんじゃなかろうか。

 

詳説 正規表現 第3版 詳説 正規表現 第3版

Curlを使ってアクセスするとAsciiArtの天気図を取得、ターミナル上で表示できる「wttr.in」

$
0
0

なんかボケっとTwitterをみてたら、curlで天気図をコンソール上に表示させてる画像が回ってきたので、どんなものなのか調べてみた。
以下のコマンドをコンソール上で実行すると、天気図が取得されるようだ。
※Teratermとかだとエンコードが対応していないので、Macとかでやると良い。

curl http://wttr.in/

Cbo4Q-1UEAAMwuP

 

普通にブラウザからアクセスしても天気図が見れるんだけど、どうやらGO言語で作られたAscii Artで天気図を出すwegoってコマンドの出力結果を出すように作ってあるらしい。
こんなこと出来るんだ。。。

てことは、アスキーアートを出力させるコマンドの結果を、同じようにブラウザでもコンソール上でも出せるように出来るってことだよな?と考えると、結構面白いことが出来そうな気がする。

現代アートビジネス (アスキー新書 61) 現代アートビジネス (アスキー新書 61)

CentOS7にZabbix2.2をインストールする

$
0
0

自宅の検証環境の監視方法について検討するため、いくつかの監視ツールを試してみようと思う。
というわけで、まずはこちらを参考にOSSの監視ツールとして有名なZabbixから試してみる事にする。

なお、サーバ・エージェント共にCentOS 7を用いるものとし、バージョンはインストールの簡単なZabbix 2.2を対象とする。

1.Zabbixサーバインストール

Zabbix2.2の場合は、以下のコマンドでインストールを実施する。

yum install -y epel-release
yum install -y zabbix22 zabbix22-web zabbix22-agent zabbix22-server mariadb-server mariadb php-mysql

 

インストール完了後、データベースやhttpd、OS、Zabbix自体の設定を行う。

●Firewalld・SELinuxの設定

以下のコマンドで、SELinuxの無効化とFirewalldの設定を行う。

setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
firewall-cmd --get-default-zone
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --add-port=10050/tcp --permanent
firewall-cmd --add-port=10051/tcp --permanent
systemctl restart firewalld

 

●データベースの設定

Zabbixで利用するデータベースの設定をする。
参考ページと同様に、DBにはMariaDBを用いる。
(以下ではrootパスワードなどは未設定のため、別途mysql_secure_installationコマンドを実行することをおすすめする
zabbixユーザのパスワードはpasswordとなっているので、環境に応じて読み替えてもらいたい。)

systemctl enable mariadb
systemctl restart mariadb
mysql -u root -e "CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;GRANT ALL ON zabbix.* TO 'zabbix'@'localhost' IDENTIFIED BY 'zabbix_password';"
mysql -uzabbix -ppassword zabbix < /usr/share/zabbix-mysql/schema.sql
mysql -uzabbix -ppassword zabbix < /usr/share/zabbix-mysql/images.sql
mysql -uzabbix -ppassword zabbix < /usr/share/zabbix-mysql/data.sql

 

●httpdの設定

/etc/httpd/conf.d/zabbix.confに設定を追記する。

cat << EOF >> /etc/httpd/conf.d/zabbix.conf
php_value max_execution_time 300
php_value post_max_size 16M
php_value max_input_time 300
php_value date.timezone Asia/Tokyo
EOF

 

●Zabbixのパスワード設定

以下のコマンドを実行し、ZabbixのDBパスワードを設定する。

sed -i '/# DBPassword/cDBPassword=zabbix_password' /etc/zabbix/zabbix_server.conf
sed -i '/# DBPassword/cDBPassword=zabbix_password' /etc/zabbix_server.conf

 

以上が完了したら、Zabbixを起動する。

systemctl restart zabbix-agent
systemctl enable zabbix-agent
systemctl restart zabbix-server-mysql
systemctl enable zabbix-server-mysql
systemctl restart httpd

 

2.Zabbixサーバ WEB設定

ブラウザを開き、「http://Zabbixサーバ ホスト名orIPアドレス/zabbix/setup.php」にアクセスし、初期設定を行う。

Screenshot_from_2016-02-21 19_08_56

Screenshot_from_2016-02-21 19_12_44

Screenshot_from_2016-02-21 19_21_56

Screenshot_from_2016-02-21 19_22_21

Screenshot_from_2016-02-21 19_22_29

Screenshot_from_2016-02-21 19_22_32

 

これで、初期設定が完了した。
デフォルトのログインID/PWは「Admin/zabbix」となっている。

Screenshot_from_2016-02-21 19_22_36

Screenshot_from_2016-02-21 19_24_32

 

3.Zabbixエージェントインストール

さて、Zabbixサーバはインストールできたので、次は監視対象サーバにZabbixエージェントをインストールする。
今回は、yumからインストール出来るZabbix 2.2を利用しているので、エージェントもyumからインストールする。

yum install -y zabbix22-agent

 

Zabbixエージェントの設定ファイルに、ZabbixサーバのIPアドレスを記述、サービスを開始する。

sed -i -e '/^Server\=/cServer=IPアドレス' -e '/^ServerActive\=/cServerActive=IPアドレス' -e '/Hostname=/cHostname=Zabbix Agent01' /etc/zabbix_agentd.conf
systemctl enable zabbix-agent
systemctl start zabbix-agent

 

Zabbixエージェント起動後、Firewalldの設定及びSELinuxの無効を行う。

setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
firewall-cmd --add-port=10050/tcp
firewall-cmd --add-port=10051/tcp

 

最後に、疎通確認としてZabbixサーバからzabbix_getコマンドでエージェントのバージョンを取得出来ることを確認する。

zabbix_get -s エージェントのIPアドレス -k agent.version

 

値が帰ってきたら、後はWEBコンソール上から監視対象ホストを追加するだけだ(自動で認識されるわけではない)。
少しづつ使ってみて、どれがいいか決めていこうと思う。

 

改訂版 Zabbix統合監視実践入門 ~障害通知、傾向分析、可視化による省力運用 (Software Design plus) 改訂版 Zabbix統合監視実践入門 ~障害通知、傾向分析、可視化による省力運用 (Software Design plus)

【OS別】パスワード用文字列生成コマンド

$
0
0

最近、よくパスワードを新規で作成することがあったので、各OS別にパスワードに使えるランダムな文字列を生成してくれるコマンドを調べてみることにした。

1.Linux

RHEL/Debian系ともにpwgenコマンドでランダムなパスワード文字列が生成可能だ。
入ってない場合は、yum/apt-getでインストールできる。

オプション無しで実行すると、8桁の英数字を大量に出力してくれる。

pwgen
[root@test-node ~]# pwgen
XeituY4O ceeT0boo Taelu0oo EiKu3aev Oog6ma0u Vaedee0u wu7ri7Ah Ithee6Zu
hai3ThiP Book4she ea2Choa0 hohz5Oor ra3Tepee aikoQu0U Aib8Peel aiW7oobi
gaeBa8qu io9Eighu ief3UaXe aihi0Fei zaeNg6ie ahKow9ze Hif5lo2j Iu7aicee
Ohghae7e eel6uuLo lei2Oewo ahoP2wei wiejeeP5 EGhi8shi aecaiN4a cieZaex2
Chak7yei Iod3wieX ia4TeiV2 Tewey9za quai9uuJ aish9ooR EipahPh0 vec3Roon
ieNga5pu aezuoc6D thirei2O seleeW5n ood9pohD lees2Sae Chei9Ahg hoh5ahXa
aiche4Ei au7Oi5so wah4uk0I IePh0Aet bieR5aeG iuquai6O sohfeiB3 ue2raiBu
aeGaeP6s io0haeC1 PhooDe6k ceiR4shi Fea8Aiwa TeiD6cha za1Lootu eiGha4wi
Maa5leeR ooCh5uno iuF6Peix aedaev6H Rah6ieY4 ooth4Bai ooz2Ohka qui6Eech
IePh0Euj ohxahR0m ooraiVi7 oh1cei2O paike6Ch ca7Thaim aiXie1wo AhCh1Ohz
mieShuy7 Ier6rae3 mie9aeX5 Muubie1c Aechait3 Eph1shoo wu8haeSh huiP5Rie
da1Jaewa ma4ugh4S xainee4B Eec7iero Aihae5ch Mooc8aem phoo8Eer Yoocoo9x
Aipeig8b eiWahb2I ahp8ReiD vie8ooPi Ohph4cuD Ac9neiTe uW1ohw0m Aepi7mee
Thohg6eo Aij0aixi xeech6UP Aht9iech cho6aiDi Ja4juoJ3 iShuqu5p Ohtei7tu
sheeKet9 yoKa6pee iG0quu5u yi5eiBus lee8keeK eiMeim6a ho2Iv3ai xuzeiR7y
Ulee2pah em3Toigh Uhi5okie Oomei1ul quieTh2A kauB1aiC Aifaeya5 evu2gi6O
xo5Zaiki yahD6pu3 raY1ne2c Kie6quoc Lah0ogh8 iMoo5iex ASh8quee ae2ey2Vo
iez4zeiF oar6ieTo Laup1Gee phuD6Cho Yoese2ea Eefe7sai ie9Eije8 iph2Shuo
pheheeT5 yae8Aiv5 Ahsil0Af Ahlooc1e cheV6ohs RahPhei0 jeYo6vef Iev0Uan6
ieKee8de AeS7sai6 eingaeN2 Aengae3U Ju5jah4u aiW9ai2d Ahfae3oo sho1Aimo

 

これだと少々扱いにくいので、引数や以下のようなオプションを組み合わせてパスワードを生成すると良いだろう。

pwgen パスワード桁数 出力個数
  • -y … 記号付きパスワードを生成する
  • -0 … パスワードに数字を含めない
  • -A … 大文字無しにする
  • -s … 完全にランダムな文字列を生成する

 

強度の高いパスワードを生成するなら、以下のようにコマンドを実行すると良いだろう。

[root@test-node ~]# pwgen 16 1 -sy
$.h8cdQ05y="BYH~
pwgen 16 1 -ys

2.MacOS X

MacOS Xでも、Linux同様pwgenコマンドが利用出来る。
利用方法は同一のため割愛する。

 

3.Windows

Windowsでパスワードを自動生成する場合は、どうもスマートなコマンドが無いようだ。
なのでこちらを参考に、以下のようにPowerShellで実行すると良いだろう。

Add-Type -AssemblyName System.Web;[System.Web.Security.Membership]::GeneratePassword(パスワード桁数,$specialchar)
PS C:\Users\USER> Add-Type -AssemblyName System.Web;[System.Web.Security.Membership]::GeneratePassword(8,$specialchar)
r]ln0NJA

 

パスワード解析 完全版 パスワード解析 完全版

CentOS7にNagios 4をインストールする

$
0
0

自宅の検証環境の監視方法について検討するため、いくつかの監視ツールを試しているのだが、今回はZabbixに引き続き有名なNagiosを入れてみる事にする。
前回と同様、サーバ・エージェントともにCentOS 7を用いるものとする。

1.NagiosCore インストール

まず、前提となるhttpd、php、MariaDBをインストールしておく。
(ここでは実施していないが、mysql_secure_installationは実施しておくと良いだろう。)

yum -y install httpd php php-mbstring php-pear php-mysql mariadb-server mariadb
yum -y install gcc glibc glibc-common gd gd-devel make net-snmp openssl-devel xinetd unzip

 

前提パッケージのインストールができたら、Nagiosのインストール準備を行う。
まず、ユーザとグループを作成する。

useradd nagios
groupadd nagcmd
usermod -a -G nagcmd nagios
usermod -G nagcmd apache

 

次に、以下のコマンドでNagiosCoreをインストールする。

cd
curl -L -O https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.1.1.tar.gz
tar xzvf nagios-*.tar.gz
cd nagios-*
./configure --with-command-group=nagcmd
make all
make install
make install-commandmode
make install-init
make install-config
make install-webconf

 

これで、NagiosCoreのインストールが完了した。

 

2.NagiosPluginインストール

次に、NagiosPluginをインストールする。

cd
curl -L -O http://nagios-plugins.org/download/nagios-plugins-2.1.1.tar.gz
tar xvf nagios-plugins-*.tar.gz
cd nagios-plugins-*
./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-openssl
make &amp;&amp; make install

 

他サーバの監視で必要なNRPEについてもインストールする。

cd
curl -L -O http://downloads.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz
tar xvf nrpe-*.tar.gz
cd nrpe-*
./configure --enable-command-args --with-nagios-user=nagios --with-nagios-group=nagios --with-ssl=/usr/bin/openssl --with-ssl-lib=/usr/lib/x86_64-linux-gnu
make all
make install
make install-xinetd
make install-daemon-config

 

これで、NagiosPluginのインストールが完了した。

3.初期設定

インストールが完了したら、Nagiosで監視を行うための初期設定を実施する。
まず、/etc/xinetd.d/nrpeのonly_fromにNagiosサーバのIPアドレスを追記する。

ip -o -4 addr show | awk -F '[ /]+' '/global/ {print $4}' | xargs -I{} -n 1 sed&nbsp;-i '/only_from/s/$/ {}/g' /etc/xinetd.d/nrpe
service xinetd restart

 

/usr/local/nagios/etc/nagios.cfgを編集、ディレクトリを作成する。

sed -i '/^#cfg_dir=\/usr\/local\/nagios\/etc\/servers/s/#//g' /usr/local/nagios/etc/nagios.cfg
mkdir /usr/local/nagios/etc/servers

 

/usr/local/nagios/etc/objects/commands.cfgに追記をする。

cat << EOF >> /usr/local/nagios/etc/objects/commands.cfg
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
EOF

 

以下のコマンドで、WEBコンソールアクセス時に必要となるパスワード設定を行う。

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

 

最後に、Nagiosのサービス起動、SELinux/Firewalldの停止を行う。

service nagios restart
service httpd restart
setenforce 0
sed -i.bak "/SELINUX/s/enforcing/disabled/g" /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld

 

後は、NagiosサーバのURL(http://IPアドレス/nagios)にアクセスするだけだ。
なお、ログイン時のユーザ名は「nagiosadmin」、パスワードはhtpasswdコマンドで指定したものだ。

Screenshot_from_2016-02-22 08:43:27

 

4.Nagiosエージェントインストール

サーバのインストールは無事出来たので、次は監視対象となるサーバにNagiosエージェントをインストールする。
Nagiosエージェントと言っているが、Nagiosでは他の統合監視システムのエージェントソフトに該当するものはNRPEというものになる(UNIX系の場合。厳密に言うと異なるようだが、便宜上は分かりやすくこれで統一)。

早速、監視対象サーバで以下のコマンドを実行する。

yum -y install epel-release
yum -y install nrpe nagios-plugins-all
sed -i '/^allowed_hosts/s/$/,NagiosサーバIPアドレス/g' /etc/nagios/nrpe.cfg
systemctl start nrpe.service
systemctl enable nrpe.service

 

次に、Nagiosサーバ側で監視対象ホストについての設定ファイル(/usr/local/nagios/etc/servers/監視対象ホスト名.cfg)を作成する。
以下、設定例。

●/usr/local/nagios/etc/servers/test_host.cfg

define host{
      use                               linux-server
      host_name                         test-node
      alias                             lan
      address                           IPアドレス
}
define service {
        use                             generic-service
        host_name                       test-node
        service_description             PING
        check_command                   check_ping!100.0,20%!500.0,60%
}
define service {
        use                             generic-service
        host_name                       test-node
        service_description             SSH
        check_command                   check_ssh
        notifications_enabled           0
}

 

設定ファイル作成後、reloadする。

systemctl reload nagios

 

reload後、Webコンソールを見るとホストが追加されている事がわかる。

Screenshot_from_2016-02-23 00:08:40

 

Nagios統合監視[実践]リファレンス (Software Design plus) Nagios統合監視[実践]リファレンス (Software Design plus)
Viewing all 743 articles
Browse latest View live