2017年11月18日土曜日

aws-cli の s3暗号化(SSE-C) 時、 "file://[鍵保存ファイル]" に改行があるとエラーになる


asw-cli で、ファイルに保存した鍵でS3暗号化(SSE-C)をしようとしたら以下のエラーになった。
[root@centos701 ~]# aws s3api put-object --bucket blue21neo --key test.txt --body test.txt --sse-customer-algorithm AES256 --sse-customer-key file://sse-key

An error occurred (InvalidArgument) when calling the PutObject operation: The secret key was invalid for the specified algorithm.


sse-keyファイルに改行コードが含まれていることが原因だった。
改行コードを含まないように、鍵をファイルに保存したら成功した。
[root@centos701 ~]# echo -n "6yPXi6lTRSzuOO9vLy3BTAavvbhimo4L" > sse-key
[root@centos701 ~]# aws s3api put-object --bucket blue21neo --key test.txt --body test.txt --sse-customer-algorithm AES256 --sse-customer-key file://sse-key
"de1ddf908bbf0b547bab82c8f87ec234"      AES256  j/r5InkOc5IeHPGharNZog==




2017年10月23日月曜日

トラブルシューティングで使うコマンド


ping

指定したホストとの間でネットワークが疎通しているかどうかを調べる
http://www.atmarkit.co.jp/ait/articles/1709/14/news018.html

traceroute

あるホストから別のホストまでのネットワーク経路を調べる
http://www.atmarkit.co.jp/ait/articles/0108/30/news003.html

netstat

ホストのネットワーク接続状態やソケット/インターフェイスごとのネットワーク統計などを調べる
※ CentOS7は非推奨なので ss コマンドを使用
http://www.atmarkit.co.jp/ait/articles/1412/10/news003.html

route

IPパケットをルーティングするためのルーティングテーブルを調べる
※ CentOS7は非推奨なので ip コマンドを使用

ifconfig

ネットワークインターフェースの設定や現在の設定内容を表示
※ CentOS7は非推奨なので ip コマンドを使用

dig

DNSサーバーが正常に動作しているかどうか確認したい、問題がどこにあるかを突き止めたい、そんな時に「dig」を利用します
http://www.atmarkit.co.jp/ait/articles/1409/25/news001.html

tcpdump

ネットワーク上を走っているパケットを閲覧するためのプログラム(パケットキャプチャツール)として利用。tcpdump でキャプチャした情報をファイルに保存して、WaireSharkで見ることが多い。 
http://itpro.nikkeibp.co.jp/article/COLUMN/20140512/556024/
https://knowledge.sakura.ad.jp/6286/

ss

ネットワーク通信で利用する「ソケット」についての情報などを調べる
http://www.atmarkit.co.jp/ait/articles/1710/06/news014.html

telnet

TCPポートへの接続確認や、SMTPでのメール送信確認などに利用できる。
http://itpro.nikkeibp.co.jp/article/COLUMN/20060425/236322/
http://ash.jp/net/telnet_smtp.htm

curl

WEBサイトの動作確認で利用できる。
https://qiita.com/yasuhiroki/items/a569d3371a66e365316f

sar

サーバのCPUやメモリ、DISK IOなどの様々な情報のモニタリングが可能です。
Ksar を使ってグラフ化して見ることが多いです。

dstat

CPUやメモリ、ディスクやCPU割り込みといったハードウエアの他、ネットワークの状態も監視できる。
http://www.atmarkit.co.jp/ait/articles/1506/01/news152.html

file

ファイル形式や文字コードを調べる。coreファイルを出力したプログラムを調べる。
http://www.atmarkit.co.jp/ait/articles/1605/10/news018.html

ldd

指定したプログラムの実行に必要な共有ライブラリを調べる
http://itpro.nikkeibp.co.jp/article/COLUMN/20140127/532486/

strings

バイナリファイルやデータファイルから“文字列”として読める箇所を表示する
指定したバイナリ/データファイル内にある表示可能な文字列が、標準出力に出力される
http://www.atmarkit.co.jp/ait/articles/1703/09/news038.html

fuser

ファイルやソケットを使用しているプロセスを調べる
https://open-groove.net/linux-command/fuser/

lsof

特定のポートやファイルを使用しているプロセスを調べる
https://qiita.com/hypermkt/items/905139168b0bc5c28ef2

strace

プロセスが呼び出すシステムコールをトレースし、その内容を表示することができる
http://blog.livedoor.jp/sonots/archives/18193659.html

ps

実行中のプロセスの一覧を表示する
http://www.atmarkit.co.jp/ait/articles/1603/28/news022.html

watch

指定したコマンドを定期的に実行する。
下記例では、ssコマンドでTCPコネクションの状態を取得し、各状態が何件あるかを1秒間隔で表示する。
# watch -n1 'ss -at | cut -d " " -f 1 | sort | uniq -c'
Every 1.0s: ss -at | cut -d " " -f 1 | sort | uniq -c                                        Sat Oct 21 22:08:47 2017
      1 ESTAB
      4 LISTEN
      1 State



2017年8月9日水曜日

VirtualBox の centos で curl の httpアクセスが遅い


VirtualBox の centos で curl の httpアクセスが遅い。

DNSの名前解決が遅いのが原因。

下記URLのページが参考になりました。
https://tsuchinoko.dmmlabs.com/?p=808

とりあえず、resolv.conf に "options single-request-reopen" を追記することにしましたが、DHCPにしているので resolv.conf は自動生成されます。

resolv.conf を直接修正したくないので、OS別に以下のように修正。

CentOS6の場合


/etc/sysconfig/network に下記を追加。
RES_OPTIONS="single-request-reopen"

CentOS7の場合


下記コマンドを実行
[root@centos0702 ~]# nmcli con show enp0s3 | grep ipv4.dns-options
ipv4.dns-options:                       (デフォルト)
[root@centos0702 ~]# nmcli con modify enp0s3 ipv4.dns-options "single-request-reopen"
[root@centos0702 ~]# nmcli con show enp0s3 | grep ipv4.dns-options
ipv4.dns-options:                       "single-request-reopen"



2017年3月30日木曜日

OSSのJob Arranger for Zabbix


面白そうなOSSを見つけました。こんど試してみたいと思います。

見つけたのは「Job Arranger for Zabbix」 です。
大和総研ビジネス・イノベーションのサイトで公開されています。(下記URL)

http://xn--yck0c5b3804be7h.fitechforce.com/index.html

「Job Arranger for Zabbix」はZabbix にジョブ管理機能を追加するアドオンです。

Windowsアプリケーションの管理画面を使用します。
アイコンでフローを描いてジョブの作成ができるようです(JP1的な)
日本語のマニュアルも整備されています。

主な特長は以下のとおり。

・Zabbixに追加するだけの簡単導入で、すぐに利用可能
・C言語で開発した軽量ソフトウェアで、高いパフォーマンスと安定性を実現
・豊富な部品を組み合わせて、複雑なジョブも作成可能
・分かり易いGUIで高い操作性と視認性を実現
・機能ごとに分離した判りやすいGUIで、操作が簡単
・フルオープンソースながら公式サポート・ドキュメントが充実


2017年3月5日日曜日

Elasticsearch5.1 のクラスタ(unicast)に動的にノードを追加する

Elasticsearch5.xの File-Based Discovery Plugin を使用すると、クラスタ構築時にunicast で指定するホスト名(またはIPアドレス)を別ファイル(例: config/discovery-file/unicast_hosts.txt)で管理でるようです。
また、この別ファイルの変更は、動的に反映されるようなので、試してみました。

検証で使用した環境は、「Docker で Elasticsearch5.1 と head を試す」で作成したElasticsearch5.1です。(Docker)


プラグインのインストール


File-Based Discovery Plugin を以下のようにしてインストールします。
root@c40d8d6e3c73:/usr/share/elasticsearch# bin/elasticsearch-plugin install discovery-file
-> Downloading discovery-file from elastic
[=================================================] 100%  
-> Installed discovery-file

1台でクラスタ


まず、1台でクラスタを起動してみます。
File-Based Discovery Plugin を使用するには、elasticsearch.yml に discovery.zen.hosts_provider を追加します。discovery.zen.ping.unicast.hosts を使用していた場合はコメントアウトします。
# クラスタのノードを指定
#discovery.zen.ping.unicast.hosts: ["elasticsearch_es51a_1","elasticsearch_es51b_1","elasticsearch_es51b_2"]
discovery.zen.hosts_provider: file
File-Based Discovery Plugin が参照するファイルは $CONFIG_DIR/discovery-file/unicast_hosts.txt です。
unicast_hosts.txt にホスト名(またはIPアドレス)を記載します。
9300ポート使用していれば、ポートは省略できます。ポートを指定したい場合は、"hostname:port" 形式で記述します。
# cat config/discovery-file/unicast_hosts.txt
elasticsearch_es51a_1
これで、Elasticsearch を起動して、head で見ると下図のとおり。


ログには以下のように表示されます。
[2017-03-05T02:41:56,219][INFO ][o.e.p.PluginsService     ] [c40d8d6e3c73] loaded plugin [discovery-file]
[2017-03-05T02:41:56,281][WARN ][o.e.d.d.f.FileBasedDiscoveryPlugin] Using discovery.type setting to set hosts provider is deprecated. Set "discovery.zen.hosts_provider: file" instead
[2017-03-05T02:41:56,682][WARN ][o.e.d.s.g.GroovyScriptEngineService] [groovy] scripts are deprecated, use [painless] scripts instead
[2017-03-05T02:42:01,025][INFO ][o.e.n.Node               ] [c40d8d6e3c73] initialized
[2017-03-05T02:42:01,026][INFO ][o.e.n.Node               ] [c40d8d6e3c73] starting ...
[2017-03-05T02:42:01,293][INFO ][o.e.t.TransportService   ] [c40d8d6e3c73] publish_address {172.18.0.3:9300}, bound_addresses {[::]:9300}
[2017-03-05T02:42:01,304][INFO ][o.e.b.BootstrapCheck     ] [c40d8d6e3c73] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks

クラスタ稼働中に2台目を追加


クラスタを起動したまま、1台目のunicast-hosts.txt にノードを追加します。
再起動はしません。
# cat config/discovery-file/unicast_hosts.txt
elasticsearch_es51a_1
elasticsearch_es51b_1
2台目のノードも、1台目と同じ設定にしてから起動します。
head で見ると、下図のように表示されます。





2017年2月26日日曜日

Docker で Elasticsearch5.1 と head を試す


Docker で Elasticsearch5.1 と head を試してみます。
検証環境は以下のとおり
・Dockerホスト: CentOS7(メモリ1GB)
・Dcoker: 1.10.3
・docker-compose: 1.10.0

docker-composeの構成


以下の構成で docker-compose の環境を用意しました。
[root@centos0702 docker]# tree -Fl ./elasticsearch/
./elasticsearch/
├── docker-compose.yml
├── es51/
│   ├── Dockerfile
│   ├── config/
│   │   ├── elasticsearch.yml
│   │   ├── jvm.options
│   │   └── log4j2.properties
│   └── docker-entrypoint.sh*
└── head/
     └── Dockerfile
プロジェクト名は、"elasticsearch" の前提で設定を行います。

docker-compose.yml の設定


docker-compose.yml の内容は以下のとおり
[root@centos0702 docker]# cat elasticsearch/docker-compose.yml
version: '2'
services:
  es51a:
    build: ./es51
    image: elasticsearch:5.1
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - ./vol/es/data:/usr/share/elasticsearch/data
      - ./vol/es/backup:/usr/share/elasticsearch/backup

  es51b:
    image: elasticsearch:5.1

  head:
    build: ./head
    image: elasticsearch-head
    ports:
      - "9100:9100"
"es51a" は Elasticsearch5.1です。通常は、この1台で検証を行います。
"es51b" も Elasticsearch5.1ですが、こちらは、クラスタの検証をする場合だけ使用します。
"head" は、Elasticsearch-head です。

Elasticsearch のビルド環境


Elasticsearch5.1 のビルド環境は、es51 ディレクトリにあります。
DocukerHUB にあったものを、少し、修正して使います。
Dokerfile の内容は以下のとおり。
[root@centos0702 es51]# cat Dockerfile
FROM openjdk:8-jre

# grab gosu for easy step-down from root
ENV GOSU_VERSION 1.7
RUN set -x \
        && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \
        && wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \
        && export GNUPGHOME="$(mktemp -d)" \
        && gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
        && gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
        && rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
        && chmod +x /usr/local/bin/gosu \
        && gosu nobody true

RUN set -ex; \
# https://artifacts.elastic.co/GPG-KEY-elasticsearch
        key='46095ACC8548582C1A2699A9D27D666CD88E42B4'; \
        export GNUPGHOME="$(mktemp -d)"; \
        gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
        gpg --export "$key" > /etc/apt/trusted.gpg.d/elastic.gpg; \
        rm -r "$GNUPGHOME"; \
        apt-key list

# https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html
# https://www.elastic.co/guide/en/elasticsearch/reference/5.0/deb.html
RUN set -x \
        && apt-get update && apt-get install -y --no-install-recommends apt-transport-https && rm -rf /var/lib/apt/lists/* \
        && echo 'deb https://artifacts.elastic.co/packages/5.x/apt stable main' > /etc/apt/sources.list.d/elasticsearch.list

ENV ELASTICSEARCH_VERSION 5.1.1
ENV ELASTICSEARCH_DEB_VERSION 5.1.1

RUN set -x \
        \
# don't allow the package to install its sysctl file (causes the install to fail)
# Failed to write '262144' to '/proc/sys/vm/max_map_count': Read-only file system
        && dpkg-divert --rename /usr/lib/sysctl.d/elasticsearch.conf \
        \
        && apt-get update \
        && apt-get install -y --no-install-recommends "elasticsearch=$ELASTICSEARCH_DEB_VERSION" \
        && rm -rf /var/lib/apt/lists/*

ENV PATH /usr/share/elasticsearch/bin:$PATH

WORKDIR /usr/share/elasticsearch

COPY config ./config

RUN set -ex \
        && for path in \
                ./data \
                ./logs \
                ./config \
                ./config/scripts \
                ./backup \
        ; do \
                mkdir -p "$path"; \
                chown -R elasticsearch:elasticsearch "$path"; \
        done

RUN elasticsearch-plugin install analysis-kuromoji \
     && elasticsearch-plugin install analysis-icu

VOLUME [ "/usr/share/elasticsearch/data", "/usr/share/elasticsearch/backup" ]

COPY docker-entrypoint.sh /

EXPOSE 9200 9300
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["elasticsearch"]
オリジナルからの変更ポイントは以下のとおり。
・スナップショットの格納先として"backup"ディレクトリの作成を追加
・kuromoji/icu プラグインのインストール

config/elasticsearch.yml は以下のとおり。
3台でクラスタを組めるようにしています。
[root@centos0702 es51]# cat config/elasticsearch.yml
#########################
# 基本設定
#########################

# http アクセスを制限しない
http.host: 0.0.0.0

# ノード名をホスト名にする
node.name: ${HOSTNAME}

# elasticsearch-head 用
# クロスドメインアクセスを許可することでWEBブラウザから直接クエリを実行できる
http.cors.enabled: true
http.cors.allow-origin: "*"

#########################
# クラスタ設定
#########################

# クラスタメンバのアクセスを制限しない
transport.host: 0.0.0.0

# 1台でもマスタになれるようにしておく。
# 通常は、SplitBrain 対策として 全ノードの過半数を設定
discovery.zen.minimum_master_nodes: 1

# 検証環境が非力なのでタイムアウトを長めにする
discovery.zen.ping.unicast.hosts.resolve_timeout: 60s
discovery.zen.ping_timeout: 60s

# クラスタのノードを指定
discovery.zen.ping.unicast.hosts: ["elasticsearch_es51a_1","elasticsearch_es51b_1","elasticsearch_es51b_2"]

# クラスタ名
cluster.name: demo-cluster

#########################
# スナップショット設定
#########################

# スナップショットの格納先
path.repo: ["/usr/share/elasticsearch/backup"]

config/jvm.options は以下のとおり。
HEEP_SIZE を 256MB にしています。(デフォルトは2GB)
[root@centos0702 es51]# cat config/jvm.options
## JVM configuration

################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms256m
-Xmx256m

################################################################
## Expert settings
################################################################
##
## All settings below this section are considered
## expert settings. Don't tamper with them unless
## you understand what you are doing
##
################################################################

## GC configuration
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly

## optimizations

# disable calls to System#gc
-XX:+DisableExplicitGC

# pre-touch memory pages used by the JVM during initialization
-XX:+AlwaysPreTouch

## basic

# force the server VM (remove on 32-bit client JVMs)
-server

# explicitly set the stack size (reduce to 320k on 32-bit client JVMs)
-Xss1m

# set to headless, just in case
-Djava.awt.headless=true

# ensure UTF-8 encoding by default (e.g. filenames)
-Dfile.encoding=UTF-8

# use our provided JNA always versus the system one
-Djna.nosys=true

# use old-style file permissions on JDK9
-Djdk.io.permissionsUseCanonicalPath=true

# flags to keep Netty from being unsafe
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true

# log4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true

## heap dumps

# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError

# specify an alternative path for heap dumps
# ensure the directory exists and has sufficient space
#-XX:HeapDumpPath=${heap.dump.path}

## GC logging

#-XX:+PrintGCDetails
#-XX:+PrintGCTimeStamps
#-XX:+PrintGCDateStamps
#-XX:+PrintClassHistogram
#-XX:+PrintTenuringDistribution
#-XX:+PrintGCApplicationStoppedTime

# log GC status to a file with time stamps
# ensure the directory exists
#-Xloggc:${loggc}

# Elasticsearch 5.0.0 will throw an exception on unquoted field names in JSON.
# If documents were already indexed with unquoted fields in a previous version
# of Elasticsearch, some operations may throw errors.
#
# WARNING: This option will be removed in Elasticsearch 6.0.0 and is provided
# only for migration purposes.
#-Delasticsearch.json.allow_unquoted_field_names=true

config/log4j2.properties は以下のとおり。
[root@centos0702 es51]# cat config/log4j2.properties
status = error

appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n

rootLogger.level = info
rootLogger.appenderRef.console.ref = console

docker-entrypoint.sh は以下のとおり。
このファイルには実行権限をつけておきます。( chmod +x )
[root@centos0702 es51]# cat docker-entrypoint.sh
#!/bin/bash

set -e

# Add elasticsearch as command if needed
if [ "${1:0:1}" = '-' ]; then
        set -- elasticsearch "$@"
fi

# Drop root privileges if we are running elasticsearch
# allow the container to be started with `--user`
if [ "$1" = 'elasticsearch' -a "$(id -u)" = '0' ]; then
        # Change the ownership of user-mutable directories to elasticsearch
        for path in \
                /usr/share/elasticsearch/data \
                /usr/share/elasticsearch/logs \
        ; do
                chown -R elasticsearch:elasticsearch "$path"
        done

        set -- gosu elasticsearch "$@"
        #exec gosu elasticsearch "$BASH_SOURCE" "$@"
fi

# As argument is not related to elasticsearch,
# then assume that user wants to run his own process,
# for example a `bash` shell to explore this image
exec "$@"

elasticsearch-head のビルド環境


elasticsearch-head のビルド環境は head ディレクトリになります。
Dockerfile は以下のとおり。
[root@centos0702 docker]# cat elasticsearch/head/Dockerfile
FROM node:slim

RUN apt-get update && \
    apt-get install -y git node-gyp && \
    apt-get autoremove -y && \
    apt-get clean all && \
    rm -rf /var/lib/apt/lists/* && \
    npm install -g grunt grunt-cli && \
    git clone git://github.com/mobz/elasticsearch-head.git

RUN cd elasticsearch-head && \
    npm install && \
    sed -i 's/port: 9100,/hostname: "0.0.0.0", port: 9100,/g' Gruntfile.js

WORKDIR /elasticsearch-head

EXPOSE 9100

CMD ["grunt", "server"]

Dockerイメージをビルド


Dockerイメージをビルドします。
[root@centos0702 elasticsearch]# pwd
/root/workspace/docker/elasticsearch
[root@centos0702 elasticsearch]# docker-compose buil
作成したイメージを確認します。
[root@centos0702 elasticsearch]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
elasticsearch                             5.1                 e34960c49557        16 hours ago        366.4 MB
elasticsearch-head                        latest              fb3330d58553        29 hours ago        627.4 MB

動作確認


Dockerコンテナを起動して動作を確認します。
まず、es51a と head を起動します。
[root@centos0702 elasticsearch]# docker-compose up -d es51a
Creating network "elasticsearch_default" with the default driver
Creating elasticsearch_es51a_1
[root@centos0702 elasticsearch]# docker-compose up -d head
Creating elasticsearch_head_1
ブラウザで "http://<DockerホストのIPアドレス>:9100"  にアクセスします。
下図のような画面になればOKです。
赤枠には、"http://<DockerホストのIPアドレス>:9200" を入力します。



試しにドキュメントを登録してみます。
[root@centos0702 elasticsearch]# curl 'http://localhost:9200/index01/type01/1?pretty' -d '{"title":"テストのドキュメント"}'
{
  "_index" : "index01",
  "_type" : "type01",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : true
}
インデックスが作成され、head には以下のように表示されます。



Elsticsearch のノードを1台追加して、計2台にしてみます。
[root@centos0702 elasticsearch]# docker-compose up -d es51b
Creating elasticsearch_es51b_1
headの表示は以下のようになります。




2017年2月18日土曜日

DockerのJobScheduler+Zabbix+MariaDBでHyclopsJobMonitoring を試す


DockerHUB のイメージで JobScheduker + Zabbix + MariaDB のテスト環境をつくり、HyclopsJobMonitoring を試してみます。

Dockerホストは CentOS7 です。
今回は、docker-compose を使い、以下のようなコンテナを4つ起動します。
・JobScheduler Master 1.10 (docker.io/floedermann/jobscheduler)
・MariaDB 10.1 (docker.io/mariadb)
・Zabbix Server 3.2 (docker.io/zabbix/zabbix-server-mysql)
・Zabbix Webインターフェース 3.2 (docker.io/zabbix/zabbix-web-nginx-mysql)

また、上記の各コンテナのタイムゾーンは、"Asia/Tokyo" で統一し、WEBインターフェースは日本語にします。


ディレクトリ構成


docker-conpose のプロジェクト名が sosjs10 となるようにしたいので、sosjs10 ディレクトリ以下にファイルを配置しました。
[root@centos0702 docker]# tree sosjs10
sosjs10
├── docker-compose.yml
├── hyclops_jm-0.1.a
│   ├── README.md
│   ├── fabfile.py
│   ├── hyclops_jm.conf
│   ├── hyclops_jm_template.xml
│   └── modules
│       ├── live
│       │   └── hyclops_jm
│       │       ├── HyClops_JM_Trigger_Switch_Template.job_chain.xml
│       │       ├── HyClops_JM_Trigger_ret.job.xml
│       │       ├── HyClops_JM_Trigger_switch.job.xml
│       │       ├── HyClops_JM_jobelapse.job.xml
│       │       ├── HyClops_JM_sync.job.xml
│       │       ├── target_zabbix_host.xml
│       │       └── test_user_job.job.xml
│       └── scripts
│           ├── fabfile.py
│           ├── hyclops_jm
│           └── hyclops_jm_mail.sh
└── initdb.d
     ├── init-js.sql
     └── init-zabbix.sql

"hyclops_jm-0.1.a" は、TISのサイトからダウンロードした 0.1.0 を、今回使用するdocker 環境にあわせて修正したものです。
"initdb.d" には、MariaDB の初期設定用(DB、ユーザ作成)のスクリプトを配置しています。
MariaDBは、JobScheduler と Zabbix で使用します。

docker-compose の設定


docker-compose.yml は以下のとおり。
[root@centos0702 docker]# cat sosjs10/docker-compose.yml
version: '2'
services:
  js-master:
    image: floedermann/jobscheduler
    volumes:
      - ./data/sosjs/config:/opt/jobscheduler/data/scheduler/config
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "4444:4444"
      - "40444:40444"
    environment:
      - MYSQL_PORT_3306_TCP_ADDR=sosjs10_db_1
      - MYSQL_PORT_3306_TCP_PORT=3306
      - MYSQL_ENV_MYSQL_USER=jobscheduler
      - MYSQL_ENV_MYSQL_PASSWORD=jobscheduler
      - MYSQL_ENV_MYSQL_DATABASE=jobscheduler
    depends_on:
      - db

  db:
    image: mariadb
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
      - ./data/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      MYSQL_ROOT_PASSWORD: p@ssw0rd

  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-3.2-latest
    volumes:
      - ./data/zabbix:/var/lib/zabbix
      - /etc/localtime:/etc/localtime:ro
    environment:
      DB_SERVER_HOST: sosjs10_db_1
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
    ports:
      - "10051:10051"
    depends_on:
      - db

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest
    volumes:
      - /usr/share/fonts/ipa-pgothic/ipagp.ttf:/usr/share/zabbix/fonts/graphfont.ttf:ro
    environment:
      DB_SERVER_HOST: sosjs10_db_1
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      ZBX_SERVER_HOST: sosjs10_zabbix-server_1
      TZ: Asia/Tokyo
    ports:
      - "80:80"
    depends_on:
      - db
      - zabbix-server
"js-master" は、JobSchedulerコンテナです。
コンテナのタイムゾーンを、Dockerホストのタイムゾーン(Asia/Tokyo)に合わせるようにしています。また、JobScheduler の configディレクトリ をDockerホスト側で変更できるようにしています。

"db" は、MariaDBコンテナです。
コンテナのタイムゾーンを、Dockerホストのタイムゾーン(Asia/Tokyo)に合わせるようにしています。また、./init.d をコンテナの /docker-entrypoint-initdb.d にマウントすることで、初回起動時にスクリプトが実行されるようにしています。
[root@centos0702 docker]# cat sosjs10/initdb.d/init-js.sql
CREATE DATABASE jobscheduler;
GRANT ALL PRIVILEGES ON jobscheduler.* TO 'jobscheduler'@'%' IDENTIFIED BY 'jobscheduler';
[root@centos0702 docker]# cat sosjs10/initdb.d/init-zabbix.sql
CREATE DATABASE zabbix;
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%'  IDENTIFIED BY 'zabbix';

"zabbix-server" は、ZabbixServerコンテナです。
コンテナのタイムゾーンを、Dockerホストのタイムゾーン(Asia/Tokyo)に合わせるようにしています。

"zabbix-web" は、Zabbix のWEBインターフェースです。
環境変数でタイムゾーン(Asia/Tokyo)を設定しています。
また、DockerホストのIPAフォントをコンテナにマウントして、Zabbixのグラフで日本語表示が文字化けしないようにしています。
Dockerホストには、以下のようにしてフォントをインストールしておきます。
[root@centos0702 docker]# yum install ipa-pgothic-fonts

コンテナの起動


sosjs10 ディレクトリに移動します。
コンテナのイメージをダウンロードして、ローカルのレポジトリを確認します。
[root@centos0702 sosjs10]# docker-compose pull
[root@centos0702 sosjs10]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
docker.io/mariadb                         latest              7eca0e0b51c9        4 weeks ago         393.4 MB
docker.io/zabbix/zabbix-web-nginx-mysql   alpine-3.2-latest   5e7f58ad9bec        8 weeks ago         174.1 MB
docker.io/zabbix/zabbix-server-mysql      alpine-3.2-latest   5f40f7fa997b        8 weeks ago         106.8 MB
docker.io/floedermann/jobscheduler        latest              58aaf95b6f91        9 weeks ago         837.8 MB

コンテナを起動します。
[root@centos0702 sosjs10]# docker-compose up -d
Creating network "sosjs10_default" with the default driver
Creating sosjs10_db_1
Creating sosjs10_js-master_1
Creating sosjs10_zabbix-server_1
Creating sosjs10_zabbix-web_1

Zabbix Webインターフェース の日本語化


Zabbix Webインターフェースの php.ini のタイムゾーンを Asia/Tokyo に変更します。
[root@centos0702 sosjs10]# docker-compose exec zabbix-web sed -i 's|^\(date.timezone =\) .*$|\1 "Asia/Tokyo"|' /etc/php5/php.ini
[root@centos0702 sosjs10]# docker-compose exec zabbix-web grep 'date.timezone' /etc/php5/php.ini
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"
コンテナを再起動します。
[root@centos0702 sosjs10]# docker-compose restart zabbix-web
Restarting sosjs10_zabbix-web_1 ... done
ブラウザで、下記URLにアクセスし、admin/zabbix でログインします。
http://<DockerホストのIPアドレス>/
画面右上のヒト型アイコンをクリックして[ユーザプロファイル]を表示し、[言語]を"日本語" に変更します。


下図のように日本語表示になります。


Jobscheduler の日本語化


JobScheduler のJOCを日本語化します。
[root@centos0702 sosjs10]# sed -i "s/^\(_sos_lang            = \)'';$/\1'ja';/" data/sosjs/config/operations_gui/custom.js
[root@centos0702 sosjs10]# grep 'sos_lang' data/sosjs/config/operations_gui/custom.js
*  A language file scheduler_lang_[_sos_lang].js must exist.
_sos_lang            = 'ja';
下記URLにアクセスすると、JOCが日本語で表示されます。
http://<DockerホストのIPアドレス>:4444/

ついでに、イベント機能も使用できるようにします。
[root@centos0702 sosjs10]# docker-compose exec js-master sed -i 's|^\( .*<entry key="jobEvents" value="\)off\("/>\)$|\1on\2|' /root/install/scheduler_install.xml
hyclops_jm 用にエラーメールが送信されるように設定します。
[root@centos0702 sosjs10]# docker-compose exec js-master sed -i 's|^\( .*<entry key="mailOnError" value="\)no\("/>\)$|\1yes\2|' /root/install/scheduler_install.xml
[root@centos0702 sosjs10]# docker-compose exec js-master sed -i 's|^\( .*<entry key="mailServer" value="\)\("/>\)$|\1localhost\2|' /root/install/scheduler_install.xml
[root@centos0702 sosjs10]# docker-compose exec js-master sed -i 's|^\( .*<entry key="mailFrom" value="\)\("/>\)$|\1root@localhost\2|' /root/install/scheduler_install.xml
[root@centos0702 sosjs10]# docker-compose exec js-master sed -i 's|^\( .*<entry key="mailTo" value="\)\("/>\)$|\1hyclops_jm@localhost\2|' /root/install/scheduler_install.xml
変更内容を確認します。
[root@centos0702 sosjs10]# docker-compose exec js-master egrep 'mail|Events' /root/install/scheduler_install.xml
            <entry key="mailServer" value="localhost"/>
            <entry key="mailPort" value="25"/>
            <entry key="mailFrom" value="root@localhost"/>
            <entry key="mailTo" value="hyclops_jm@localhost"/>
            <entry key="mailCc" value=""/>
            <entry key="mailBcc" value=""/>
    <com.izforge.izpack.panels.UserInputPanel id="email">
            <entry key="mailOnError" value="yes"/>
            <entry key="mailOnWarning" value="no"/>
            <entry key="mailOnSuccess" value="no"/>
            <entry key="jobEvents" value="on"/>
JobSchedulerからのメールを受信できるように postfix をインストールします。
なお、デバッグ用に vim と rsyslog もインストールします。
[root@centos0702 sosjs10]# docker-compose exec js-master apt-get update
[root@centos0702 sosjs10]# docker-compose exec js-master apt-get install rsyslog vim postfix
インストール中にpostfix の設定を聞かれるので、以下のように設定しました。
Postfix Configuration
---------------------

Please select the mail server configuration type that best meets your needs.

 No configuration:
  Should be chosen to leave the current configuration unchanged.
 Internet site:
  Mail is sent and received directly using SMTP.
 Internet with smarthost:
  Mail is received directly using SMTP or by running a utility such
  as fetchmail. Outgoing mail is sent using a smarthost.
 Satellite system:
  All mail is sent to another machine, called a 'smarthost', for delivery.
 Local only:
  The only delivered mail is the mail for local users. There is no network.

  1. No configuration  2. Internet Site  3. Internet with smarthost  4. Satellite system  5. Local only

General type of mail configuration: 5


The "mail name" is the domain name used to "qualify" _ALL_ mail addresses without a domain name. This includes mail to and from <root>: please do not make
your machine send out mail from root@example.org unless root@example.org has told you to.

This name will also be used by other programs. It should be the single, fully qualified domain name (FQDN).

Thus, if a mail address on the local host is foo@example.org, the correct value for this option would be example.org.

System mail name: example.local

コンテナ起動時に postfix と rsyslog が起動するようにします。
赤字が追加した行です。
[root@centos0702 sosjs10]# docker-compose exec js-master vi /opt/startup_scheduler.sh
[root@centos0702 sosjs10]# docker-compose exec js-master tail /opt/startup_scheduler.sh
sed -i -e "s/{{DB_SERVER_USER}}/$DB_SERVER_USER/g" /root/install/scheduler_install.xml
sed -i -e "s/{{DB_SERVER_PASSWORD}}/$DB_SERVER_PASSWORD/g" /root/install/scheduler_install.xml
sed -i -e "s/{{DB_SERVER_DATABASE}}/$DB_SERVER_DATABASE/g" /root/install/scheduler_install.xml

(cd /root/install; ./setup.sh -u scheduler_install.xml)

/etc/init.d/rsyslog start
/etc/init.d/postfix start

sleep infinity
コンテナを再起動します。
[root@centos0702 sosjs10]# docker-compose restart js-master
Restarting sosjs10_js-master_1 ... done
コンテナのログを確認します。正常だと以下のように表示されます。
[root@centos0702 sosjs10]# docker-compose logs js-master 2>&1 | tail
js-master_1      |      libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd28ac7e000)
js-master_1      |      libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd28a8d3000)
js-master_1      |      libgcc_s.so.1 => /opt/jobscheduler/scheduler/lib/libgcc_s.so.1 (0x00007fd28a6bc000)
js-master_1      |      /lib64/ld-linux-x86-64.so.2 (0x00007fd28c0ef000)
js-master_1      | Starting JobScheduler...
js-master_1      | [ Processing finished ]
js-master_1      | [ Writing the uninstaller data ... ]
js-master_1      | [ Automated installation done ]
js-master_1      | Starting enhanced syslogd: rsyslogd.
js-master_1      | Starting Postfix Mail Transport Agent: postfix.

hyclops_jm の修正


今回のDocker環境にあわせて hycrops_jm を修正します。
hyclops_jm.conf は以下のようにしました。
PostgreSQL ではなく MariaDB 用にしています。
[root@centos0702 sosjs10]# cat hyclops_jm-0.1.a/hyclops_jm.conf
# HyClops JobMonitoring user
jm_user = hyclops_jm
jm_passwd = hyclops_jm

# JobScheduler configuration
js_id = scheduler
js_user = jobscheduler
js_passwd = jobscheduler
js_host = sosjs10_js-master_1
js_port = 4444

# Zabbix configuration
zbx_server = sosjs10_zabbix-server_1
zbx_web = sosjs10_zabbix-web_1
zbx_login_user = Admin
zbx_login_passwd = zabbix
zbx_external_scripts_dir = /usr/lib/zabbix/externalscripts

# Database super user
db_user = root
db_passwd = p@ssw0rd
db_host = sosjs10_db_1
db_port = 3306
インストール用の fabfile.py は以下のとおり。けっこう修正しました。
[root@centos0702 sosjs10]# cat hyclops_jm-0.1.a/fabfile.py
#!/usr/bin/env python
#-*- coding: utf-8 -*

"""
  HyClop JobMonitoring install script
  Usage : fab -c hyclops_jm.conf install
"""

#############################################################
# Import modules and initial settings
#############################################################
from fabric.api import lcd, cd, local, run, env, hide, sudo
import sys, os, os.path, time, fnmatch
#from datetime import datetime as dt
#from datetime import datetime

# local(コンテナ内)でコマンドを実行するのでコメントアウト。
#env.hosts = ['192.168.56.101']
#env.user = 'root'
#env.password = 'p@ssw0rd'

#============================================================
# private functions
#============================================================
def _set_user(user, passwd):
  env.jm_user = user
  env.jm_passwd = passwd

def _allow_error():
  env.warn_only = True

def _deny_error():
  env.warn_only = False

# JobSchedulerからメールを受信するユーザを作成する
def _add_user(user, passwd):
  # Add hyclops jm user
  _allow_error()
  res = local('id %s' % user)
  _deny_error()
  if res.return_code != 0:
    local('useradd %s -p"%s"' %(user, passwd))

# root で JobScheduler を実行するのでsudo設定しない
#def _sudo_to_user(user):
#  _allow_error()
#  res = local('grep %s /etc/sudoers || grep -r %s /etc/sudoers.d' % (user, user))
#  _deny_error()
#  if res.return_code != 0:
#    local('echo "%s  ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/%s' % (user, user))
#    local('echo "Defaults:%s !requiretty,env_reset" >> /etc/sudoers.d/%s' % (user, user))
#

# env.jm_user がメールを受信したらシェルを実行するように設定する
def _setup_postfix():
  _allow_error()
  res = local('grep %s /etc/aliases' % env.jm_user)
  _deny_error()
  if res.return_code != 0:
    local('echo "%s: | \\"/usr/local/sbin/hyclops_jm_mail.sh\\"" >> /etc/aliases' % env.jm_user)
    local('newaliases')

# MariaDBにシステム情報を登録する
def _setup_db():

  sqls = ["CREATE TABLE sysinfo (name text,value text);",
    "CREATE TABLE jobid_tbl (job text,lastid text);",
    "GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%%';" % (env.jm_user,env.js_user),
    "FLUSH PRIVILEGES;",
    "INSERT INTO sysinfo (name,value) VALUES ('jos_server','%s');" % env.js_host,
    "INSERT INTO sysinfo (name,value) VALUES ('jos_port','%s');" % env.js_port,
    "INSERT INTO sysinfo (name,value) VALUES ('zbx_server','%s');" % env.zbx_server,
    "INSERT INTO sysinfo (name,value) VALUES ('zbx_web','%s');" % env.zbx_web,
    "INSERT INTO sysinfo (name,value) VALUES ('zbx_login','%s');" % env.zbx_login_user,
    "INSERT INTO sysinfo (name,value) VALUES ('zbx_pass','%s');" % env.zbx_login_passwd,
    "INSERT INTO sysinfo (name,value) VALUES ('jos_timeout','3');"]
  mysql = "mysql --user=%s --password=%s --host=%s --port=%s -e" % (env.db_user, env.db_passwd, env.db_host, env.db_port)

  _allow_error()
  local("%s 'DROP DATABASE %s'" % (mysql, env.jm_user))
  _deny_error()
  local("%s 'CREATE DATABASE %s'" % (mysql, env.jm_user))

  for sql in sqls:
    mysql = "mysql --user=%s --password=%s --host=%s --port=%s --database=%s -e" % (env.db_user, env.db_passwd, env.db_host, env.db_port, env.jm_user)
    local("%s \"%s\"" % (mysql, sql))

# スクリプトを配置する。なお、環境に合わせて修正
def _setup_scripts():
  tmpl_name = 'hyclops_jm_template.xml'
  log_dir = '/var/log/hyclops_jm'
  js_home = '/root'
  jm_home = "%s/hyclops_jm" % js_home
  js_data = "/opt/jobscheduler/data/%s" % env.js_id
  js_bin = "/opt/jobscheduler/%s/bin" % env.js_id

  local("mkdir -p %s" % log_dir)
  local("mkdir -p %s/live" % jm_home)
  local("cp %s %s/" % (tmpl_name, jm_home))
  local("sed -e 's/HYCLOPS_JM_USER/%s/g' modules/scripts/fabfile.py > %s/fabfile.py" % (env.js_user, jm_home))
  local("sed -i 's/HYCLOPS_JM_DB/%s/g' %s/fabfile.py" % (env.jm_user, jm_home))
  local("sed -i 's/HYCLOPS_JM_PASSWORD/%s/g' %s/fabfile.py" % (env.js_passwd, jm_home))
  local("sed -i 's/HYCLOPS_JM_HOST/%s/g'     %s/fabfile.py" % (env.db_host, jm_home))
  local("sed -i 's/HYCLOPS_JM_PORT/%s/g'     %s/fabfile.py" % (env.db_port, jm_home))
  local("chown -R %s:%s %s" % (env.js_user, env.js_user, log_dir))
  local("chown -R %s:%s %s" % (env.js_user, env.js_user, jm_home))
  local("sed -e 's|HYCLOPS_JM_HOME|%s|g' modules/scripts/hyclops_jm > /usr/local/sbin/hyclops_jm" % jm_home)
  local("sed -i 's|HYCLOPS_JS_BIN|%s|g' /usr/local/sbin/hyclops_jm" % js_bin)
  local("sed -e 's/HYCLOPS_ZBX_SERVER/%s/g' modules/scripts/hyclops_jm_mail.sh > /usr/local/sbin/hyclops_jm_mail.sh" % env.zbx_server)
  local("sed -i 's/HYCLOPS_JS_SERVER/%s/g' /usr/local/sbin/hyclops_jm_mail.sh" % env.js_host)
  local("chown %s:%s /usr/local/sbin/hyclops_jm*" % (env.js_user, env.js_user))
  local("chmod +x /usr/local/sbin/hyclops_jm*")

  local("mkdir -p %s/config/live/hyclops_jm" % js_data)
  local("chown %s:%s %s/config/live/hyclops_jm" % (env.js_user, env.js_user, js_data))
  files = local("cd modules; find live -type f", capture=True)
  for file in files.split('\n'):
    local("sed -e 's/HYCLOPS_JM_USER/%s/g' modules/%s > %s/config/%s" % (env.js_user, file, js_data, file))
    local("sed -i 's|HYCLOPS_JS_BIN|%s|g'  %s/config/%s" % (js_bin, js_data, file))
    local("sed -i 's|HYCLOPS_JM_HOME|%s|g' %s/config/%s" % (jm_home, js_data, file))

# JobSchedulerでジョブが異常終了したらメール送信するように設定する
# scheduler_install.xml で設定するので、以下は実行しない
#def _setup_jobscheduler():
#  js_data = "/opt/jobscheduler/data/%s" % (env.js_id)
#
#  _allow_error()
#  res = local('grep %s %s/config/factory.ini' % (env.jm_user, js_data))
#  _deny_error()
#  if res.return_code != 0:
#    current_mails = local('grep log_mail_to %s/config/factory.ini' % js_data)
#    local("sed -i 's/log_mail_to.*=/log_mail_to             = %s@localhost,/g' %s/config/factory.ini" % (env.jm_user, js_data))

#============================================================
# public functions
#============================================================
def install(user = 'hyclops_jm', passwd = 'hyclops_jm'):
  if 'js_user' not in env:
    print 'Usage: fab -c hyclops_jm.conf install'
    return False

  _deny_error()
  _set_user(user, passwd)

  _add_user(user, passwd)
  _add_user(env.js_user, env.js_passwd)
#  _sudo_to_user(env.js_user)
  _setup_postfix()
#  _setup_jobscheduler()
  _setup_db()
  _setup_scripts()

  print "================================================================"
  print "= Thank you for installing HyClops JM!!                        ="
  print "= You can monitor JobScheduler's job using Zabbix from now on. ="
  print "= Please access the Zabbix web interface and enjoy monitoring. ="
  print "= - example: http://your-domain/zabbix                         ="
  print "================================================================"
hyclops_jm_template.xml は変更なしで使用します。
modules/live のジョブ定義はパスなどを修正しています。
オリジナルとの差分は以下のとおり。
[root@centos0702 sosjs10]# diff -r hyclops_jm-0.1.a/modules/live  hyclops_jm-0.1.0/modules/live
diff -r hyclops_jm-0.1.a/modules/live/hyclops_jm/HyClops_JM_Trigger_ret.job.xml hyclops_jm-0.1.0/modules/live/hyclops_jm/HyClops_JM_Trigger_ret.job.xml
8c8
< export JM_HOME="HYCLOPS_JM_HOME"
---
> export JM_HOME="/home/scheduler/hyclops_jm"
diff -r hyclops_jm-0.1.a/modules/live/hyclops_jm/HyClops_JM_Trigger_switch.job.xml hyclops_jm-0.1.0/modules/live/hyclops_jm/HyClops_JM_Trigger_switch.job.xml
19c19
< export JM_HOME="HYCLOPS_JM_HOME"
---
> export JM_HOME="/home/scheduler/hyclops_jm"
diff -r hyclops_jm-0.1.a/modules/live/hyclops_jm/HyClops_JM_sync.job.xml hyclops_jm-0.1.0/modules/live/hyclops_jm/HyClops_JM_sync.job.xml
9,10c9,10
< .  HYCLOPS_JS_BIN/jobscheduler_environment_variables.sh
< export JM_HOME="HYCLOPS_JM_HOME"
---
> .  /opt/sos-berlin.com/jobscheduler/HYCLOPS_JM_USER/bin/jobscheduler_environment_variables.sh
> export JM_HOME="/home/HYCLOPS_JM_USER/hyclops_jm"
diff -r hyclops_jm-0.1.a/modules/live/hyclops_jm/target_zabbix_host.xml hyclops_jm-0.1.0/modules/live/hyclops_jm/target_zabbix_host.xml
3c3
<   <param name="zabbix_host" value="sosjs10_zabbix-server_1"/>
---
>   <param name="zabbix_host" value="localhost"/>
modules/scripts も修正しています。
オリジナルとの差分は以下のとおり。
[root@centos0702 sosjs10]# diff -r hyclops_jm-0.1.a/modules/scripts  hyclops_jm-0.1.0/modules/scripts
diff -r hyclops_jm-0.1.a/modules/scripts/fabfile.py hyclops_jm-0.1.0/modules/scripts/fabfile.py
31,32c31,32
< from dateutil import parser
< from pytz import timezone
---
> from datetime import datetime as dt
> from datetime import datetime
55,56c55,56
< # For MySQL
< import MySQLdb
---
> # For PostgreSQL
> import psycopg2
66d65
< env.zbx_web="localhost"
72,76c71,75
< env.db_name='HYCLOPS_JM_DB'
< env.db_user='HYCLOPS_JM_USER'
< env.db_password='HYCLOPS_JM_PASSWORD'
< env.db_host='HYCLOPS_JM_HOST'
< env.db_port=HYCLOPS_JM_PORT
---
> env.psqldatabase='hyclops_jm'
> env.psqluser='HYCLOPS_JM_USER'
> env.psqlpassword='HYCLOPS_JM_USER'
> env.psqlhost='127.0.0.1'
> env.psqlport=5432
129c128
<       DBからシステム情報を取得
---
>       PostgreSQLからシステム情報を取得
138,143c137,142
<       connection = MySQLdb.connect(
<        db = env.db_name,
<        user = env.db_user,
<        passwd = env.db_password,
<        host = env.db_host,
<        port = env.db_port)
---
>       connection = psycopg2.connect(
>        database = env.psqldatabase,
>        user = env.psqluser,
>        password = env.psqlpassword,
>        host = env.psqlhost,
>        port = env.psqlport)
159,160d157
<               elif row[0] == 'zbx_web':
<                       env.zbx_web=row[1]
196,197c193,194
<       webservice = httplib.HTTP("%s" % (env.zbx_web) )
<       webservice.putrequest("POST", "/api_jsonrpc.php")
---
>       webservice = httplib.HTTP("%s" % (env.zbx_server) )
>       webservice.putrequest("POST", "/zabbix/api_jsonrpc.php")
1290,1295c1287,1292
<       connection = MySQLdb.connect(
<        db = env.db_name,
<        user = env.db_user,
<        passwd = env.db_password,
<        host = env.db_host,
<        port = env.db_port)
---
>       connection = psycopg2.connect(
>        database = env.psqldatabase,
>        user = env.psqluser,
>        password = env.psqlpassword,
>        host = env.psqlhost,
>        port = env.psqlport)
1363c1360,1361
<       for e in root.findall('.//job'):        # ジョブの情報を取得
---
>       org_time = dt.strptime('1970-01-01 07:00:00','%Y-%m-%d %H:%M:%S')
>       for e in root.findall('answer/state/jobs/job/'):        # ジョブの情報を取得
1381c1379
<                               for elem in root.findall('.//history.entry'):
---
>                               for elem in root.findall('answer/history/history.entry/'):
1388,1389c1386,1387
<                                                       start_time = parser.parse(t).astimezone(timezone('Asia/Tokyo'))
<                                                       start_time_ut = int(time.mktime(start_time.timetuple()))
---
>                                                       start_time = dt.strptime(t, '%Y-%m-%dT%H:%M:%S.000Z')
>                                                       start_time_ut = int(time.mktime(time.strptime(t, '%Y-%m-%dT%H:%M:%S.000Z')))
1391,1392c1389,1390
<                                                       end_time = parser.parse(t).astimezone(timezone('Asia/Tokyo'))
<                                                       end_time_ut = int(time.mktime(end_time.timetuple()))
---
>                                                       end_time = dt.strptime(t, '%Y-%m-%dT%H:%M:%S.000Z')
>                                                       end_time_ut = int(time.mktime(time.strptime(t, '%Y-%m-%dT%H:%M:%S.000Z')))
1429c1427
<       cmd ="echo '%s' | /usr/bin/zabbix_sender -z %s -T -i -" % ( "\n".join(elapses), env.zbx_server)
---
>       cmd ="echo -e '%s' | /usr/bin/zabbix_sender -z %s -T -i -" % ( "\n".join(elapses), env.zbx_server)
diff -r hyclops_jm-0.1.a/modules/scripts/hyclops_jm hyclops_jm-0.1.0/modules/scripts/hyclops_jm
5,6c5,6
< .  HYCLOPS_JS_BIN/jobscheduler_environment_variables.sh
< export JM_HOME="HYCLOPS_JM_HOME"
---
> .  /opt/sos-berlin.com/jobscheduler/HYCLOPS_JM_USER/bin/jobscheduler_environment_variables.sh
> export JM_HOME="/home/HYCLOPS_JM_USER/hyclops_jm"
diff -r hyclops_jm-0.1.a/modules/scripts/hyclops_jm_mail.sh hyclops_jm-0.1.0/modules/scripts/hyclops_jm_mail.sh
4,5c4,5
< ZBX_HOST="HYCLOPS_ZBX_SERVER"
< ZBX_NAME="HYCLOPS_JS_SERVER"
---
> ZBX_HOST="127.0.0.1"
> ZBX_NAME="localhost"
主な修正ポイントは以下のとおり。
・MariaDB対応
・ZabbixServerとZabbixWebインターフェースにコンテナを分離したことへの対応
・Zabbix WebインターフェースのURLを変更
・JobSchedulerから取得したジョブ履歴の時間(UTC)を Asia/Tokyo に変換
・echo の "-e " を引数として認識しないので削除

hycrops_jm のインストール


上記で修正した hyclops_jm を JobSchedulerコンテナにコピーします。
[root@centos0702 sosjs10]# docker cp ./hyclops_jm-0.1.a sosjs10_js-master_1:/root/.
hyclops_jm に必要なパッケージをインストールします。
[root@centos0702 sosjs10]# docker-compose exec js-master apt-get install fabric python-mysqldb mysql-client python-tz python-dateutil
zabbix_sendarコマンド をインストールします。
[root@centos0702 sosjs10]# docker-compose exec js-master curl -L -o /root/zabbix-sender.deb http://repo.zabbix.com/zabbix/3.2/debian/pool/main/z/zabbix/zabbix-sender_3.2.0-1+jessie_amd64.deb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  255k  100  255k    0     0   277k      0 --:--:-- --:--:-- --:--:--  277k
[root@centos0702 sosjs10]# docker-compose exec js-master dpkg -i /root/zabbix-sender.deb
Selecting previously unselected package zabbix-sender.
(Reading database ... 20493 files and directories currently installed.)
Preparing to unpack /root/zabbix-sender.deb ...
Unpacking zabbix-sender (1:3.2.0-1+jessie) ...
Setting up zabbix-sender (1:3.2.0-1+jessie) ...
hyclops_jm のインストールスクリプトを実行します。
[root@centos0702 sosjs10]# docker-compose exec js-master /bin/bash -c "cd /root/hyclops_jm-0.1.a ; fab -c hyclops_jm.conf install"
[localhost] local: id hyclops_jm
id: hyclops_jm: no such user

Warning: local() encountered an error (return code 1) while executing 'id hyclops_jm'

[localhost] local: useradd hyclops_jm -p"hyclops_jm"
[localhost] local: id jobscheduler
id: jobscheduler: no such user

Warning: local() encountered an error (return code 1) while executing 'id jobscheduler'

[localhost] local: useradd jobscheduler -p"jobscheduler"
[localhost] local: grep hyclops_jm /etc/aliases

Warning: local() encountered an error (return code 1) while executing 'grep hyclops_jm /etc/aliases'

[localhost] local: echo "hyclops_jm: | \"/usr/local/sbin/hyclops_jm_mail.sh\"" >> /etc/aliases
[localhost] local: newaliases
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 -e 'DROP DATABASE hyclops_jm'
ERROR 1008 (HY000) at line 1: Can't drop database 'hyclops_jm'; database doesn't exist

Warning: local() encountered an error (return code 1) while executing 'mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 -e 'DROP DATABASE hyclops_jm''

[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 -e 'CREATE DATABASE hyclops_jm'
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "CREATE TABLE sysinfo (name text,value text);"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "CREATE TABLE jobid_tbl (job text,lastid text);"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "GRANT ALL PRIVILEGES ON hyclops_jm.* TO 'jobscheduler'@'%';"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "FLUSH PRIVILEGES;"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('jos_server','sosjs10_js-master_1');"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('jos_port','4444');"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('zbx_server','sosjs10_zabbix-server_1');"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('zbx_web','sosjs10_zabbix-web_1');"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('zbx_login','Admin');"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('zbx_pass','zabbix');"
[localhost] local: mysql --user=root --password=p@ssw0rd --host=sosjs10_db_1 --port=3306 --database=hyclops_jm -e "INSERT INTO sysinfo (name,value) VALUES ('jos_timeout','3');"
[localhost] local: mkdir -p /var/log/hyclops_jm
[localhost] local: mkdir -p /root/hyclops_jm/live
[localhost] local: cp hyclops_jm_template.xml /root/hyclops_jm/
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/scripts/fabfile.py > /root/hyclops_jm/fabfile.py
[localhost] local: sed -i 's/HYCLOPS_JM_DB/hyclops_jm/g' /root/hyclops_jm/fabfile.py
[localhost] local: sed -i 's/HYCLOPS_JM_PASSWORD/jobscheduler/g' /root/hyclops_jm/fabfile.py
[localhost] local: sed -i 's/HYCLOPS_JM_HOST/sosjs10_db_1/g'     /root/hyclops_jm/fabfile.py
[localhost] local: sed -i 's/HYCLOPS_JM_PORT/3306/g'     /root/hyclops_jm/fabfile.py
[localhost] local: chown -R jobscheduler:jobscheduler /var/log/hyclops_jm
[localhost] local: chown -R jobscheduler:jobscheduler /root/hyclops_jm
[localhost] local: sed -e 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' modules/scripts/hyclops_jm > /usr/local/sbin/hyclops_jm
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g' /usr/local/sbin/hyclops_jm
[localhost] local: sed -e 's/HYCLOPS_ZBX_SERVER/sosjs10_zabbix-server_1/g' modules/scripts/hyclops_jm_mail.sh > /usr/local/sbin/hyclops_jm_mail.sh
[localhost] local: sed -i 's/HYCLOPS_JS_SERVER/sosjs10_js-master_1/g' /usr/local/sbin/hyclops_jm_mail.sh
[localhost] local: chown jobscheduler:jobscheduler /usr/local/sbin/hyclops_jm*
[localhost] local: chmod +x /usr/local/sbin/hyclops_jm*
[localhost] local: mkdir -p /opt/jobscheduler/data/scheduler/config/live/hyclops_jm
[localhost] local: chown jobscheduler:jobscheduler /opt/jobscheduler/data/scheduler/config/live/hyclops_jm
[localhost] local: cd modules; find live -type f
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/HyClops_JM_Trigger_Switch_Template.job_chain.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_Switch_Template.job_chain.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_Switch_Template.job_chain.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_Switch_Template.job_chain.xml
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/HyClops_JM_Trigger_ret.job.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_ret.job.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_ret.job.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_ret.job.xml
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/HyClops_JM_Trigger_switch.job.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_switch.job.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_switch.job.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_Trigger_switch.job.xml
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/HyClops_JM_jobelapse.job.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_jobelapse.job.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_jobelapse.job.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_jobelapse.job.xml
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/HyClops_JM_sync.job.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_sync.job.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_sync.job.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/HyClops_JM_sync.job.xml
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/target_zabbix_host.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/target_zabbix_host.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/target_zabbix_host.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/target_zabbix_host.xml
[localhost] local: sed -e 's/HYCLOPS_JM_USER/jobscheduler/g' modules/live/hyclops_jm/test_user_job.job.xml > /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/test_user_job.job.xml
[localhost] local: sed -i 's|HYCLOPS_JS_BIN|/opt/jobscheduler/scheduler/bin|g'  /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/test_user_job.job.xml
[localhost] local: sed -i 's|HYCLOPS_JM_HOME|/root/hyclops_jm|g' /opt/jobscheduler/data/scheduler/config/live/hyclops_jm/test_user_job.job.xml
================================================================
= Thank you for installing HyClops JM!!                        =
= You can monitor JobScheduler's job using Zabbix from now on. =
= Please access the Zabbix web interface and enjoy monitoring. =
= - example: http://your-domain/zabbix                         =
================================================================

Done.
JOC を見ると、hyclops_jm のジョブが追加されているのがわかります。


Zabbix の画面で、[設定] > [ホスト] を見ると、JobScheduler のホスト名(sosjs10_js-master-1)が登録されています。


sosjs10_js-master_1 のIPアドレスが間違っているので修正します。
ホスト名をクリックすると、下図の画面になるので、[ホスト]名を入力して[DNS]を選択し、[更新]ボタンをクリックします。


hyclops_jm の動作確認(ジョブ実行時間)


ジョブの実行時間が Zabbix に記録されているか確認します。
[監視データ] > [最新データ] で遷移して、[ホスト]に "sosjs10_js-master_1" を入力し、[ヒストリがないアイテムを表示]のチェックを外して、[適用]ボタンをクリックします。
下図のようにジョブの一覧が表示されたら、実行時間が記録されています。


[グラフ]をクリックすると、ジョブの実行時間を下図のようにグラフで見ることができます。


hyclops_jm の動作確認(ジョブ異常終了の通知)


ジョブの異常終了がZabbixに通知されるか試します。
まず、異常終了するジョブを登録します。
[root@centos0702 sosjs10]# mkdir ./data/sosjs/config/live/test
[root@centos0702 sosjs10]# vi ./data/sosjs/config/live/test/job01.job.xml
[root@centos0702 sosjs10]# cat ./data/sosjs/config/live/test/job01.job.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<job  order="no">
    <script  language="shell">
        <![CDATA[
echo "error"
exit 1
        ]]>
    </script>
    <run_time />
</job>
JOCで実行して、異常終了させます。


Zabbixの画面で、[監視データ] > [障害] を見ると、ジョブの異常終了が通知されていました。




2017年2月4日土曜日

ssh の ProxyCommand で踏み台経由のコマンド実行


以下のような環境があるとします。
  • クライアント: 192.168.56.102(centos0601)
  • 踏み台: 192.168.56.101(centos0702)
  • 内部サーバ: 172.18.0.2(docker01)
「クライアント」から「内部サーバ」には直接アクセスできないので、「クライアント」からは「踏み台」経由で「内部サーバ」にアクセスします。

「踏み台」は、両方にアクセスできます。
[root@centos0702 centos6]# uname -n
centos0702
[root@centos0702 centos6]# sshpass -p p@ssw0rd ssh 192.168.56.102 uname -n
Warning: Permanently added '192.168.56.102' (RSA) to the list of known hosts.
centos601
[root@centos0702 centos6]# ssh -i ./centos.pem centos@172.18.0.2 uname -n
Warning: Permanently added '172.18.0.2' (RSA) to the list of known hosts.
docker01

ProxyCommand を使用すると、「クライアント」から「踏み台」を経由して「内部サーバ」にコマンドを実行できます。
[root@centos601 workspace]# ssh -o ProxyCommand='ssh -i ./root.pem root@192.168.56.101 -W 172.18.0.2:22' -i ./centos.pem centos@172.18.0.2 uname -n
Warning: Permanently added '192.168.56.101' (RSA) to the list of known hosts.
Warning: Permanently added '172.18.0.2' (RSA) to the list of known hosts.
docker01
Killed by signal 1.

秘密鍵はクライアント側においてあります。
[root@centos601 workspace]# ls
centos.pem  root.pem

また、上記例ではクライアント側のconfig設定に koun_hosts を無視する設定をいれています。
[root@centos601 workspace]# cat ~/.ssh/config
Host *
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null





2017年2月3日金曜日

tarアーカイブを指定したディレクトリに展開する



下記のようにディレクトリ付で展開されるアーカイブがあります。

[root@centos0702 master]# tar xvfz jobscheduler_linux-x64.1.11.0-RC3.tar.gz
jobscheduler.1.11.0-RC3/
jobscheduler.1.11.0-RC3/install_jobscheduler.txt
jobscheduler.1.11.0-RC3/jobscheduler_install.xml
jobscheduler.1.11.0-RC3/licence.gpl
jobscheduler.1.11.0-RC3/licence.txt
jobscheduler.1.11.0-RC3/jobscheduler_linux-x64.1.11.0-RC3.jar
jobscheduler.1.11.0-RC3/setup.sh

このアーカイブを ./js_engin ディレクトリに展開するには以下のようにします。

[root@centos0702 master]# mkdir -p ./js_engine && tar xvfz jobscheduler_linux-x64.1.11.0-RC3.tar.gz -C ./js_engine --strip-components 1
jobscheduler.1.11.0-RC3/install_jobscheduler.txt
jobscheduler.1.11.0-RC3/jobscheduler_install.xml
jobscheduler.1.11.0-RC3/licence.gpl
jobscheduler.1.11.0-RC3/licence.txt
jobscheduler.1.11.0-RC3/jobscheduler_linux-x64.1.11.0-RC3.jar
jobscheduler.1.11.0-RC3/setup.sh
[root@centos0702 master]# tree ./js_engine/
./js_engine/
├── install_jobscheduler.txt
├── jobscheduler_install.xml
├── jobscheduler_linux-x64.1.11.0-RC3.jar
├── licence.gpl
├── licence.txt
└── setup.sh

0 directories, 6 files



2017年2月2日木曜日

dockerのzabbix3.2環境でエージェント自動登録を試す

docker で zabbix3.2 のテスト環境を作る」で構築したZabbix環境でエージェントの自動登録を試してみます。


Zabbixサーバの設定変更


Zabbixエージェント起動時に自動登録するようにします。
Zabbixサーバの設定変更は、下記ページが参考になります。
http://junkbox.wicurio.com/index.php?Zabbix3%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E7%99%BB%E9%8C%B2

[ホストメタデータ]に "linux" を含む場合は、"LinuxServersグループ"に所属させ、"Template OS Linux" を適用するようにします。


Zabbixエージェントの設定変更


Zabbixエージェントの設定は、"/etc/zabbix/zabbix_agentd.conf"に記載されています。
DockerHubのZabbixエージェントの場合は、コンテナ作成時に指定する環境変数で zabbix_agnet.conf を変更できます。
詳細は、下記参照
https://hub.docker.com/r/zabbix/zabbix-agent/

今回は、docker-compose.yml を修正して、Zabbixエージェント起動時に自動登録するように設定します。
ホストメタデータ(ZBX_METADATA)には、上記の「Zabbixサーバ設定変更」にあわせて "linux" を設定します。
  agent:
    image: zabbix/zabbix-agent:alpine-latest
    volumes:
      - /etc/localtime:/etc/localtime:ro
    environment:
      ZBX_SERVER_HOST: zabbix_server_1
      ZBX_HOSTNAMEITEM: system.hostname
      ZBX_METADATA: linux
    ports:
      - "10050:10050"
    depends_on:
      - server
    privileged: true

動作確認


コンテナの状態を確認します。
[root@centos0702 zabbix]# docker-compose ps
     Name                    Command               State                 Ports
--------------------------------------------------------------------------------------------
zabbix_agent_1    /bin/bash /run_zabbix_comp ...   Up      0.0.0.0:10050->10050/tcp
zabbix_db_1       docker-entrypoint.sh mysql ...   Up      0.0.0.0:3306->3306/tcp
zabbix_server_1   /bin/bash /run_zabbix_comp ...   Up      0.0.0.0:10051->10051/tcp, 162/udp
zabbix_web_1      /bin/bash /run_zabbix_comp ...   Up      443/tcp, 0.0.0.0:80->80/tcp

agent のコンテナを再構築して、自動登録の設定を有効にします。
[root@centos0702 zabbix]# docker-compose up -d --no-deps agent
Recreating zabbix_agent_1

ログで設定変更を確認します。
[root@centos0702 zabbix]# docker-compose logs agent
Attaching to zabbix_agent_1
agent_1   | ** Deploying Zabbix agentd with none database
agent_1   | ** Preparing the system
agent_1   | ** Preparing Zabbix agent
agent_1   | ** Preparing Zabbix agent configuration file
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "PidFile": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "LogType": 'console'... added
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "LogFile": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "LogFileSize": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "DebugLevel": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "SourceIP": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "EnableRemoteCommands": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "LogRemoteCommands": ''... removed
agent_1   | ** Using 'zabbix_server_1' servers for passive checks
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "Server": 'zabbix_server_1'... updated
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "ListenPort": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "ListenIP": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "StartAgents": ''... removed
agent_1   | ** Using 'zabbix_server_1:10051' servers for active checks
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "ServerActive": 'zabbix_server_1:10051'... updated
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "Hostname": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "HostnameItem": 'system.hostname'... added
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "HostMetadata": 'linux'... added
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "HostMetadataItem": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "RefreshActiveChecks": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "BufferSend": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "BufferSize": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "MaxLinesPerSecond": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "Timeout": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "Include": '/etc/zabbix/zabbix_agentd.d/'... added first occurrence
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "UnsafeUserParameters": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "LoadModulePath": '/var/lib/zabbix/modules/'... added
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSConnect": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSAccept": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSCAFile": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSCRLFile": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSServerCertIssuer": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSServerCertSubject": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSCertFile": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSKeyFile": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSPSKIdentity": ''... removed
agent_1   | ** Updating '/etc/zabbix/zabbix_agentd.conf' parameter "TLSPSKFile": ''... removed
agent_1   | ** Cleaning the system
agent_1   | ########################################################
agent_1   | ** Executing supervisord
agent_1   | 2017-01-30 10:56:42,545 CRIT Set uid to user 0
agent_1   | 2017-01-30 10:56:42,545 CRIT Set uid to user 0
agent_1   | 2017-01-30 10:56:42,545 WARN Included extra file "/etc/supervisor/conf.d/supervisord_zabbix.conf" during parsing
agent_1   | 2017-01-30 10:56:42,545 WARN Included extra file "/etc/supervisor/conf.d/supervisord_zabbix.conf" during parsing
agent_1   | 2017-01-30 10:56:42,558 INFO RPC interface 'supervisor' initialized
agent_1   | 2017-01-30 10:56:42,558 INFO RPC interface 'supervisor' initialized
agent_1   | 2017-01-30 10:56:42,559 INFO supervisord started with pid 1
agent_1   | 2017-01-30 10:56:42,559 INFO supervisord started with pid 1
agent_1   | 2017-01-30 10:56:43,594 INFO spawned: 'zabbix-agentd' with pid 55
agent_1   | 2017-01-30 10:56:43,594 INFO spawned: 'zabbix-agentd' with pid 55
agent_1   | Starting Zabbix Agent [b23ca4da2c2a]. Zabbix 3.2.3 (revision 64610).
agent_1   | Press Ctrl+C to exit.
agent_1   |     55:20170130:105643.616 Starting Zabbix Agent [b23ca4da2c2a]. Zabbix 3.2.3 (revision 64610).
agent_1   |     55:20170130:105643.616 **** Enabled features ****
agent_1   |     55:20170130:105643.616 IPv6 support:          YES
agent_1   |     55:20170130:105643.616 TLS support:           YES
agent_1   |     55:20170130:105643.616 **************************
agent_1   |     55:20170130:105643.616 using configuration file: /etc/zabbix/zabbix_agentd.conf
agent_1   |     55:20170130:105643.616 agent #0 started [main process]
agent_1   |     56:20170130:105643.616 agent #1 started [collector]
agent_1   |     57:20170130:105643.617 agent #2 started [listener #1]
agent_1   |     58:20170130:105643.620 agent #3 started [listener #2]
agent_1   |     59:20170130:105643.624 agent #4 started [listener #3]
agent_1   |     60:20170130:105643.626 agent #5 started [active checks #1]
agent_1   |     60:20170130:105643.819 no active checks on server [zabbix_server_1:10051]: host [b23ca4da2c2a] not found
agent_1   | 2017-01-30 10:56:44,821 INFO success: zabbix-agentd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
agent_1   | 2017-01-30 10:56:44,821 INFO success: zabbix-agentd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

画面で確認します。
[設定] > [ホスト] を見ると、コンテナが登録されています。









2017年2月1日水曜日

docker で zabbix3.2 のテスト環境を作る


DockerHUB の zabbix イメージを使用して、テスト環境を作ってみます。

環境は以下のとおり。
  • Dockerホスト(CentOS7.3)
    • docker1.10.3
    • docker-compose1.10.0
  • Dockerコンテナ(AlpineLinux)
    • zabbix server 3.2
    • mariadb
    • zabbix agent
    • nginx
Dockerコンテナは4つ作成します。
zabbix ディレクトリに下記内容の docker-compose.yml を格納します。
[root@centos0702 zabbix]# cat docker-compose.yml
version: '2'
services:
  db:
    image: mariadb
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./data/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: docker
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix

  server:
    image: zabbix/zabbix-server-mysql:alpine-3.2-latest
    volumes:
      - ./data/zabbix:/var/lib/zabbix
      - /etc/localtime:/etc/localtime:ro
    environment:
      DB_SERVER_HOST: zabbix_db_1
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
    ports:
      - "10051:10051"
    depends_on:
      - db

  web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest
    volumes:
      - /usr/share/fonts/ipa-pgothic/ipagp.ttf:/usr/share/zabbix/fonts/graphfont.ttf:ro
    environment:
      DB_SERVER_HOST: zabbix_db_1
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix
      ZBX_SERVER_HOST: zabbix_server_1
      TZ: Asia/Tokyo
    ports:
      - "80:80"
    depends_on:
      - db
      - server

  agent:
    image: zabbix/zabbix-agent:alpine-latest
    volumes:
      - /etc/localtime:/etc/localtime:ro
    environment:
      ZBX_SERVER_HOST: zabbix_server_1
    ports:
      - "10050:10050"
    depends_on:
      - server
    privileged: true

zabbixのグラフで日本語表示したいのでDockerホストに日本語フォントをインストールしてDockerコンテナにマウントします。
Dockerコンテナで以下のようにしてIPAフォントをインストールしておきます。
[root@centos0702 zabbix]# yum install ipa-pgothic-fonts

コンテナのイメージをDockerHUBから取得します。
[root@centos0702 zabbix]# docker-compose pull
Pulling db (mariadb:latest)...
Trying to pull repository docker.io/library/mariadb ...
latest: Pulling from docker.io/library/mariadb
~省略~
Digest: sha256:53c987d54e0ce4abae97894ea960f6ba889a19a574a00a77c295ac33d1bd3bd4
Status: Downloaded newer image for docker.io/zabbix/zabbix-agent:alpine-latest
Pulling web (zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest)...
Trying to pull repository docker.io/zabbix/zabbix-web-nginx-mysql ...
alpine-3.2-latest: Pulling from docker.io/zabbix/zabbix-web-nginx-mysql
3690ec4760f9: Already exists
4f869513b27c: Pull complete
392eaccdd003: Pull complete
fc10ef29bc10: Pull complete
fbc02d3e2931: Pull complete
ee440b489bcc: Pull complete
51e71efce406: Pull complete
ad903346923a: Pull complete
e81f8c02dbab: Pull complete
2930a57f9526: Pull complete
104265cc9514: Pull complete
2a7d5d79e121: Pull complete
Digest: sha256:bdea5baf5441d60b0df30e826a50a2275d2e1209cbf31e5aa341e26e3a633051
Status: Downloaded newer image for docker.io/zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest

コンテナを起動します。
[root@centos0702 zabbix]# docker-compose up -d
Creating network "zabbix_default" with the default driver
Creating zabbix_db_1
Creating zabbix_server_1
Creating zabbix_web_1
Creating zabbix_agent_1

コンテナの状態を確認します。
[root@centos0702 zabbix]# docker-compose ps
     Name                    Command               State                 Ports
--------------------------------------------------------------------------------------------
zabbix_agent_1    /bin/bash /run_zabbix_comp ...   Up      0.0.0.0:10050->10050/tcp
zabbix_db_1       docker-entrypoint.sh mysql ...   Up      0.0.0.0:3306->3306/tcp
zabbix_server_1   /bin/bash /run_zabbix_comp ...   Up      0.0.0.0:10051->10051/tcp, 162/udp
zabbix_web_1      /bin/bash /run_zabbix_comp ...   Up      443/tcp, 0.0.0.0:80->80/tcp

zabbix ディレクトリの data ディレクトリが自動的に作成され、mariadb と zabbix-server の一部がマウントされます。
[root@centos0702 zabbix]# tree -F .
.
├── data/
│   ├── mysql/
│   │   ├── aria_log.00000001
│   │   ├── aria_log_control
│   │   ├── ib_logfile0
│   │   ├── ib_logfile1
│   │   ├── ibdata1
│   │   ├── multi-master.info
│   │   ├── mysql/
│   │   │   ├── column_stats.MYD
│   │   │   ├── column_stats.MYI
│   │   │   ├── column_stats.frm
│   │   │   ├── columns_priv.MYD
│   │   │   ├── columns_priv.MYI
│   │   │   ├── columns_priv.frm
│   │   │   ├── db.MYD
│   │   │   ├── db.MYI
│   │   │   ├── db.frm
│   │   │   ├── event.MYD
│   │   │   ├── event.MYI
│   │   │   ├── event.frm
│   │   │   ├── func.MYD
│   │   │   ├── func.MYI
│   │   │   ├── func.frm
│   │   │   ├── general_log.CSM
│   │   │   ├── general_log.CSV
│   │   │   ├── general_log.frm
│   │   │   ├── gtid_slave_pos.frm
│   │   │   ├── gtid_slave_pos.ibd
│   │   │   ├── help_category.MYD
│   │   │   ├── help_category.MYI
│   │   │   ├── help_category.frm
│   │   │   ├── help_keyword.MYD
│   │   │   ├── help_keyword.MYI
│   │   │   ├── help_keyword.frm
│   │   │   ├── help_relation.MYD
│   │   │   ├── help_relation.MYI
│   │   │   ├── help_relation.frm
│   │   │   ├── help_topic.MYD
│   │   │   ├── help_topic.MYI
│   │   │   ├── help_topic.frm
│   │   │   ├── host.MYD
│   │   │   ├── host.MYI
│   │   │   ├── host.frm
│   │   │   ├── index_stats.MYD
│   │   │   ├── index_stats.MYI
│   │   │   ├── index_stats.frm
│   │   │   ├── innodb_index_stats.frm
│   │   │   ├── innodb_index_stats.ibd
│   │   │   ├── innodb_table_stats.frm
│   │   │   ├── innodb_table_stats.ibd
│   │   │   ├── plugin.MYD
│   │   │   ├── plugin.MYI
│   │   │   ├── plugin.frm
│   │   │   ├── proc.MYD
│   │   │   ├── proc.MYI
│   │   │   ├── proc.frm
│   │   │   ├── procs_priv.MYD
│   │   │   ├── procs_priv.MYI
│   │   │   ├── procs_priv.frm
│   │   │   ├── proxies_priv.MYD
│   │   │   ├── proxies_priv.MYI
│   │   │   ├── proxies_priv.frm
│   │   │   ├── roles_mapping.MYD
│   │   │   ├── roles_mapping.MYI
│   │   │   ├── roles_mapping.frm
│   │   │   ├── servers.MYD
│   │   │   ├── servers.MYI
│   │   │   ├── servers.frm
│   │   │   ├── slow_log.CSM
│   │   │   ├── slow_log.CSV
│   │   │   ├── slow_log.frm
│   │   │   ├── table_stats.MYD
│   │   │   ├── table_stats.MYI
│   │   │   ├── table_stats.frm
│   │   │   ├── tables_priv.MYD
│   │   │   ├── tables_priv.MYI
│   │   │   ├── tables_priv.frm
│   │   │   ├── time_zone.MYD
│   │   │   ├── time_zone.MYI
│   │   │   ├── time_zone.frm
│   │   │   ├── time_zone_leap_second.MYD
│   │   │   ├── time_zone_leap_second.MYI
│   │   │   ├── time_zone_leap_second.frm
│   │   │   ├── time_zone_name.MYD
│   │   │   ├── time_zone_name.MYI
│   │   │   ├── time_zone_name.frm
│   │   │   ├── time_zone_transition.MYD
│   │   │   ├── time_zone_transition.MYI
│   │   │   ├── time_zone_transition.frm
│   │   │   ├── time_zone_transition_type.MYD
│   │   │   ├── time_zone_transition_type.MYI
│   │   │   ├── time_zone_transition_type.frm
│   │   │   ├── user.MYD
│   │   │   ├── user.MYI
│   │   │   └── user.frm
│   │   ├── performance_schema/
│   │   │   └── db.opt
│   │   ├── tc.log
│   │   └── zabbix/
│   │       ├── db.opt
│   │       ├── group_discovery.frm
│   │       ├── group_discovery.ibd
│   │       ├── group_prototype.frm
│   │       ├── group_prototype.ibd
│   │       ├── groups.frm
│   │       ├── groups.ibd
│   │       ├── hosts.frm
│   │       ├── hosts.ibd
│   │       ├── maintenances.frm
│   │       ├── maintenances.ibd
│   │       ├── screens.frm
│   │       ├── screens.ibd
│   │       ├── screens_items.frm
│   │       ├── screens_items.ibd
│   │       ├── users.frm
│   │       └── users.ibd
│   └── zabbix/
│       ├── enc/
│       ├── mibs/
│       ├── modules/
│       ├── snmptraps/
│       ├── ssh_keys/
│       └── ssl/
│           ├── certs/
│           ├── keys/
│           └── ssl_ca/
└── docker-compose.yml

15 directories, 115 files

下記URLで zabbix のログイン画面が表示されるので、ユーザ:admin、パスワード:zabbix でログインできます。
http://<DockerホストのIPアドレス>



2017年1月31日火曜日

JOC Cockpit のLDAP認証を試す

下記ページを参考に、JOC Cockpit のLDAP認証を試してみます。
https://kb.sos-berlin.com/display/PKB/Authentication+and+Authorization+-+Configuration
JOC Cockpit の認証は、shiro.ini で設定します。
shiro.ini には、デフォルトで複数の Role が定義されており、ユーザによって使用できる機能を制限できます。
詳細は下記ページを参照
https://kb.sos-berlin.com/display/PKB/Authentication+and+Authorization+-+Permissions+for+the+JOC+Cockpit+Web+Service
テスト環境は以下のとおり。dockerコンテナ4台で試します。
  • Dockerホスト(CentOS7.3)
    • docker1.10.3
    • docker-compose1.10.0
  • Dockerコンテナ(Debian8)
    • JobSchedulerMaster1.11.0-R3
    • JOC Cockpit1.11.0-R3 
    • MariaDB10.1
    • OpenLDAP2.4.40


LDAPのユーザ登録


DockerHUBのイメージを使用して OpenLDAPサーバを起動しました。
ドメインは "dc=example, dc=local" とします。
[root@centos0702 ldap]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45be5aba3636        dinkel/openldap     "/entrypoint.sh slapd"   22 hours ago        Up 30 minutes       0.0.0.0:389->389/tcp   ldap_server_1

下記のユニットを登録します。
[root@centos0702 ldap]# cat unit.ldif
dn: ou=Users,dc=example,dc=local
objectclass: organizationalUnit
ou: Users

dn: ou=Groups,dc=example,dc=local
objectclass: organizationalUnit
ou: Groups

dn: ou=Computers,dc=example,dc=local
objectclass: organizationalUnit
ou: Computers
[root@centos0702 ldap]# ldapadd -x -w p@ssw0rd -D "cn=admin,dc=example,dc=local" -f unit.ldif
adding new entry "ou=Users,dc=example,dc=local"

adding new entry "ou=Groups,dc=example,dc=local"

adding new entry "ou=Computers,dc=example,dc=local"


上記で登録した Users にテスト用のユーザを1人登録します。
後述のJOC Cockpit の設定で、「LDAPのgidNumber」 と 「JOC Cockpit の Role」 を紐つけるように設定します。
[root@centos0702 ldap]# ldapadd -x -w p@ssw0rd -D "cn=admin,dc=example,dc=local" -f user.ldif
adding new entry "uid=dev01,ou=Users,dc=example,dc=local"


登録した dev01 ユーザを検索してみます。
[root@centos0702 ldap]# ldapsearch -x -D "uid=dev01,ou=Users,dc=example,dc=local" -w p@ssw0rd -b "ou=Users,dc=example,dc=local" "(&(objectClass=posixAccount)(uid=dev01))"
# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=example,dc=local> with scope subtree
# filter: (&(objectClass=posixAccount)(uid=dev01))
# requesting: ALL
#

# dev01, Users, example.local
dn: uid=dev01,ou=Users,dc=example,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
sn: dev01-sn
cn: dev01-cn
displayName: develop01
uid: dev01
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/dev01
loginShell: /bin/bash
userPassword:: e0NSWVBUfU9Kd0FkMkJjdGo1aXc=
mail: dev01@example.local

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

JOC Cockpit のLDAP認証設定


JOC Cockpit の認証設定は、shiro.ini に記載されています。
設定ファイルのデフォルトの格納場所は、以下のとおり。
/home/[install user]/sos-berlin.com/joc/resources/joc/shiro.ini
今回は、以下の PATH に格納しています。
/root/sos-berlin.com/joc/resources/joc/shiro.ini 
デフォルトのshiro.ini では、[user] に root ユーザが定義されています。
LDAP認証に変更すると、この root ユーザは使用不可になります。
[user]は、変更せずに残します。

[Role]には、"administrator"や"application_manager" などが、あらかじめ定義されているので、ユーザごとに割り当てる Role を変更して使用可能なJOCの機能を制限することにします。
[Role]も変更せずに残します。

[main]は、[user]で定義したユーザでログインできるような設定になっているので、以下のようにしてLDAP認証に変更します。
[main]

ldapRealm = com.sos.auth.shiro.SOSLdapAuthorizingRealm

ldapRealm.userDnTemplate = uid={0},ou=Users,dc=example,dc=local
ldapRealm.searchBase = ou=Users,dc=example,dc=local
ldapRealm.contextFactory.url = ldap://ldap_server_1:389

ldapRealm.groupNameAttribute = gidNumber
#ldapRealm.userNameAttribute = uid
ldapRealm.userSearchFilter = (&(objectClass=posixAccount)(uid=%s))

# Mapping of a LDAP group to roles. You can assign more than one role with separator sign |
ldapRealm.groupRolesMap = \
"1000":"administrator|application_manager", \
"1001":"application_manager", \
"1002":"it_operator"

rolePermissionResolver = com.sos.auth.shiro.SOSPermissionResolverAdapter
rolePermissionResolver.ini = $iniRealm
ldapRealm.rolePermissionResolver = $rolePermissionResolver

securityManager.realms = $ldapRealm
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager

#Session timeout in milliseconds
securityManager.sessionManager.globalSessionTimeout = 1800000

ldapRealm.userDnTemplate は、LDAP サーバーからユーザーを取得する DN テンプレートです。{0}は、JOC Cockpitログイン画面で入力したユーザIDが入ります。
ldapRealm.searchBaseは、ユーザーを検索するLDAP ディレクトリーのルートを設定します。
ldapRealm.contextFactory.urlは、LDAPサーバのURLを設定します。
ldapRealm.groupNameAttributeは、ldapRealm.groupRolesMapで紐つけるLDAP属性(gidNumber)を指定 ldapRealm.groupRolesMapは、LDAP属性の gidNumber と JOCのRole を紐つけます。複数のロールを紐つける場合は "|" で区切ります。

このLDAP用の shiro.ini をコンテナにコピーして JocCockpit を再起動します。
[root@centos0702 sosjs11]# docker cp ./shiro.ini.ldap sosjs11_joc_cockpit_1:/root/sos-berlin.com/joc/resources/joc/shiro.ini
[root@centos0702 sosjs11]# docker exec sosjs11_joc_cockpit_1 /etc/init.d/joc restart                                      Stopping Jetty: OK
Starting Jetty: . . . . . OK Sun Jan 29 02:57:32 UTC 2017

ログイン確認


コンテナの状態を確認します。
[root@centos0702 sosjs11]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                         NAMES
fd455e36a585        js_master           "bash /opt/startup_sc"   16 hours ago        Up 3 minutes        0.0.0.0:4444->4444/tcp, 0.0.0.0:40444->40444/tcp, 48444/tcp   sosjs11_master_1
b51cc531a282        joc_cockpit         "bash /opt/startup_jo"   16 hours ago        Up 3 minutes        0.0.0.0:4446->4446/tcp, 0.0.0.0:40446->40446/tcp              sosjs11_joc_cockpit_1
7c09a173ee7a        mariadb             "docker-entrypoint.sh"   16 hours ago        Up 3 minutes        3306/tcp                                                      sosjs11_db_1
45be5aba3636        dinkel/openldap     "/entrypoint.sh slapd"   23 hours ago        Up About an hour    0.0.0.0:389->389/tcp                                          ldap_server_1

下記URLでログインします。
http://<DockerホストのIPアドレス>:4446/
ログイン画面で、上記で登録したLDAPユーザの dev01/p@ssw0rd を入力してログインします。


ログインに成功して、右上の[dev01] > [プロファイル] を選択すると、下図のように使用可能な機能を確認できます。