cronsunを試してみた

CentOSに分散型ジョブ管理システムであるcronsunを構築してみました。

こんにちは!shinoharaです! コロナが早く収まると良いなと思う今日この頃です。 初めてのブログで何を書いたら良いのか悩んだのですが、unix上のジョブをポータルから管理実行出来るOSSシステムであるcronsunの構築方法を書いてみます。

なぜやってみようと思ったのか

システム運用に関わるとcron起動のジョブ管理をする場面は多々あると思いますが、
サーバの台数が増えると管理が大変になります。
そこで分散型ジョブ管理システムの dkronを利用していましたが、エラーが発生した場合などにログ履歴が 少なくもう少し、ログ管理機能が豊富なジョブ管理システムを探していた所cronsunが候補に上がったので試してみました。

・ダッシュボード画面

・ログ履歴画面

公式サイトはこちら

https://github.com/shunfei/cronsun


構成

cronsunの構成を考えると操作用のWebサーバとジョブが実行されるノードサーバ、  設定や履歴を保存する。DBサーバが必要ですので通常ならこのような構成になるかと思います。

今回はもう少し簡略化した構成にしてみます。

「 WEBサーバ、ノードサーバ、DBサーバ」を兼ねているサーバを以下
「マスタサーバ」とします。

インストールが必要なアプリケーション

アプリ version 機能 サーバ
mongodb 4.2.11 ドキュメント指向NoSQLデータベース マスタ
etcd 3.3.11-2 OSSのKey-Value Store マスタ
golang 1.11.13 go言語のランタイム環境 マスタ、ノード
git 1.8.3.1 分散型バージョン管理システム マスタ、ノード
wget 1.14.1 コンテンツを取得するダウンローダ マスタ、ノード
gcc 4.8.5 GNUコンパイラコレクション マスタ、ノード

※ golang以外のversionは動作確認時のもので必須ではありません。

インストールコマンドです。
yum install -y git
yum install -y wget
yum install -y gcc
yum install -y mongodb-org
yum install -y etcd
wget https://golang.org/dl/go1.11.13.linux-amd64.tar.gz

golangは任意のディレクトリに解凍し
GOROOT、GOPATH、PATHを設定して下さい。

マスタサーバの設定

まずは設定ファイルを修正します。

ETCD設定ファイル

  • /etc/etcd/etcd.conf
#[Member]
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
  • 上記の設定をノードサーバからも接続可能にする為、マスタサーバのIPアドレスに書き換えます。
#[Member]
ETCD_LISTEN_PEER_URLS="http://10.146.1.2:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

mongodb設定ファイル

  • /etc/mongod.conf
  • bindIpに接続を許可する為ノードサーバのIPアドレスを設定します。
# network interfaces
net:
  port: 27017
  bindIp: 10.146.1.3 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  • 設定ファイルの修正が完了したら、mongodb、etcdを起動します。

cronsunのインストールとビルド

 次に公式サイトの手順に従いcronsunをgithubから取得してビルドをします。

export GO111MODULE=on
go get -u github.com/shunfei/cronsun
cd $GOPATH/src/github.com/shunfei/cronsun
go mod vendor
sh build.sh

が、ここに落とし穴が!!

go get してもリポジトリが取得できない・・・・・・うーん
export GO111MODULE=off
にしてgo get を実行を実行。。。。リポジトリを取得できた。

  • GOPATH配下にリポジトリがクローンされるのでcronsunまでカレントディレクトリを移動します。

さっそくsh build.shを実行して、コンパイルが通らない・・・・・・うーん
go.sumファイルを削除
export GO111MODULE=on
にしてbuildを実行。。。。通った。

buildが正常終了するとcronsun以下にdistディレクトリが作成されます。

cronsunの設定ファイルを修正

  • mongodbにユーザパスワードを設定した場合は/dist/conf/db.jsonを修正する必要があります。
 "AuthSource": "admin",
 "UserName": "dbuser",
 "Password": "password",

cronsunを起動

  • distディレクトリで以下のコマンドを実行すれば立ち上がります。
    (終了する場合はkillコマンドを実行します。)
# ノードを起動
./cronnode -conf conf/base.json & 
# Webを起動
./cronweb -conf conf/base.json & 
  • ブラウザから以下のURLにアクセスするとログイン画面が表示されます。
    http://127.0.0.1:7079/ui/#/login
    (127.0.0.1はマスタサーバのIPアドレスとなります。)
ログイン画面

中国語ですね。右上の歯車アイコンから英語を選択出来ます。

デフォルトのログイン情報は以下となります。

 user:admin@admin.com
 passeord:admin

ノードサーバの設定

マスタサーバと同様に、cronsunのインストールとビルドを実行します。

cronsunの設定ファイルを修正

  • /dist/conf/etcd.jsonを修正する必要があります。EndpointsにマスタサーバのIPアドレスを記述します。
{
    "Endpoints":[
        "http://10.146.1.2:2379"
    ],
    "Username":"",
    "Password":"",
    "#DialTimeout":"单位秒",
    "DialTimeout": 2
}
  • /dist/conf/db.jsonを修正する必要があります。HostsにマスタサーバのIPアドレスを記述します。
{
  "Hosts": [
    "10.146.1.2:27017"
  ],
 # mongodbに認証をかけている場合は認証情報も記載します。
  "AuthSource": "admin",
  "UserName": "dbuser",
  "Password": "password",
} 

cronsunノードを起動

  • distディレクトリで以下のコマンドを実行すればノードが立ち上がります。
./cronnode -conf conf/base.json & 
  • Web画面からノードタグを選択しノードを確認してみます。

    マスタサーバとノードサーバの2つが表示されました。表示されない場合は画面をリロードすると表示される場合があります。

cronジョブを実行

  • Web画面からJobタグを選択するとジョブ登録が出来ます。
    ls コマンドを登録してみます。

SAVEで保存しジョブを実行

  • logタブからマスターサーバの実行履歴を見てみます。

  • logタブからノードーサーバの実行履歴を見てみます。

    マスタサーバとノードサーバでコマンドが実行されました。

おわり

思った以上に使いやすく動作も安定しています。ノード数は2つのみですが1万回以上の連続実行をしても問題はないようです。複数台のサーバを(弊社ではクラウドを使っていますのでVM管理になりますが)、管理する場合にはとても便利です。