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アドレス>