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