2015年9月20日日曜日

[CentOS7][Rundeck] ジョブを計画実行する

[CentOS7][Rundeck] ジョブを即時実行する」の続きです。

前回作成したジョブを修正して、実行時間を設定し、計画実行してみます。
環境は以下のとおりです。
  • Rundeckサーバ(ローカル): centos7 [10.1.0.80]
  • ノード1(リモート): pm01 [10.1.0.71]
  • ノード2(リモート): pm01 [10.1.0.73]
  • プロジェクト: sandbox02
  • ジョブ: job01 

実行スケジュールの設定


ジョブを修正します。
メニューバーの[Jobs]をクリックしてジョブの一覧を表示したら、"job01" のメニューを表示して、[Edit this Job] を選択します。



画面をスクロールして、[Schedule to run repeatedly?] の "Yes" を選択すると下図のように、実行時刻を設定できるようになります。



[Simple]タブでは、下図のように、時間、曜日、月を指定できます。



[Crontab] タブでは、crontab と同じ設定方法で実行時間を指定できます。



実行時間を指定したら、[Save]をクリックして設定変更を保存します。



設定を保存すると、下図の赤線部分に、実行予定時間(実行までの残り時間)が表示されます。



実行結果の確認


計画実行されたジョブの結果は、[Activity]で確認できます。







使い方の詳細は、「ユーザマニュアル(日本語)」を参照してください。





2015年9月13日日曜日

[CentOS7][Rundeck] ジョブを即時実行する


[CentOS7][Rundeck] コマンドを実行する」の続きです。

前回は、コマンドを実行したので、今回は、ジョブを作って即時実行してみます。
環境は以下のとおりです。
  • Rundeckサーバ(ローカル): centos7 [10.1.0.80]
  • ノード1(リモート): pm01 [10.1.0.71]
  • ノード2(リモート): pm01 [10.1.0.73]
  • プロジェクト: sandbox02
Rundeck のジョブは、複数の処理ステップで構成することができます。
今回は下記の3つのステップを持つジョブを作成し、各サーバで実行します。
  • ジョブ(job01)
    • step1: /tmp/test.sh のファイル名で自サーバ上にスクリプトを作成する
    • step2: step1で作成したRundeck サーバ上の /tmp/test.sh を各サーバに送信して実行する
    • step3: step1で作成した自サーバ上の /tmp/test.sh を実行する
また、ジョブをグループ化すると、フォルダ構成のように表示されて管理しやすいので、グループ化することにします。(グループ化は任意です)


ジョブの作成


メニューバーの[Job]をクリックすると下図の画面が表示されます。
[Create Job] をクリックして新しいジョブを作成します。


[Job Name]、[Description]を入力します。
今回は、ジョブのグループ管理を試したい、demoグループ配下のgroup01グループにジョブが所属するように "demo/group01" と入力しています。


下にスクロールして、[Workflow]を入力します。
Workfrow に入力するステップの種類は、複数の選択肢がありますが、今回試すのは、"Command"、"Script"、"Script file or URL" の3つです。

まず、"step1" の処理を入力します。
[Script]をクリックします。


下図の赤枠で示した部分にスクリプトを入力します。
内容は以下のとおり。
echo "++ 開始 + `date '+%Y-%m-%d %H:%M:%S'`"
echo "++ 実行ホスト: `hostname`"
echo "++ 実行ユーザ: `id`"
echo "++ 実行シェル: ${SHELL}"
echo "++ 実行プログラム: $0"

# テストスクリプト作成
echo "++ テストスクリプト作成: /tmp/test.sh"
cat<<'EOF' > /tmp/test.sh
#!/bin/bash
echo "-- START - `date '+%Y-%m-%d %H:%M:%S'`"
EOF
cat<<EOF >> /tmp/test.sh
echo "-- 格納場所: `hostname`"
EOF
cat<<'EOF' >> /tmp/test.sh
echo "-- 実行ホスト: `hostname`"
echo "-- 実行ユーザ: `id`"
echo "-- 実行シェル: ${SHELL}"
echo "-- 実行プログラム: $0"
echo "-- END - `date '+%Y-%m-%d %H:%M:%S'`"
exit 0
EOF

# 実行権限付与
chmod 777 /tmp/test.sh

echo "++ 終了 + `date '+%Y-%m-%d %H:%M:%S'`"
exit 0
入力後、[save]をクリックして保存します。


[Add a step]をクリックして、"step2" の処理を入力します。


[Script file or URL] をクリックします。


[File Path/URL] に実行したいプログラムを入力します。
 "/tmp/test.sh" を入力したら、[Save] をクリックして保存します。



[Add a step]をクリックして "step3" の処理を入力します。


[Command]をクリックします。



[Command]に実行したコマンドを入力します。
"/tmp/test.sh" を入力したら、[Save]コマンドをクリックして保存します。


これで、下図のように3つのステップを持つ Warkfow ができました。
ステップを修正したい場合は、修正したいステップをクリックします。


ステップが作成できたら、
[Nodes]で、このジョブを実行するノードを指定します。
今回は、".*"を入力して、centos7(localhost)/pm01/pm02 で実行するように設定します。


最後に、スクロールして、[Create]をクリックします。
これで、ジョブが保存されます。


ジョブの即時実行


ジョブの作成が成功すると、下図のように表示されます。
[Run Job Now]をクリックすると、ジョブが実行されます。



ジョブの実行が完了すると下図のように表示されます。
[Log Output]タブをクリックするとログを見ることができます。



標準出力のメッセージを下図のように見ることができます。
日本語も表示できます。


ログは、ステップを実行した順番で表示されています。
pm01のステップ2のログは、以下のように表示されています。
このログを見ると、Rundeckサーバ(centos7)上の /tmp/test.sh を /tmp/67-52-pm01-test.sh に転送して、rootユーザ(ノード追加時に指定)で実行したことがわかります。 ドキュメントによるとスクリプトの転送には scp を使うようです。
-- START - 2015-09-13 11:17:15
-- 格納場所: centos7
-- 実行ホスト: pm01
-- 実行ユーザ: uid=0(root) gid=0(root) 所属グループ=0(root)
-- 実行シェル: /bin/bash
-- 実行プログラム: /tmp/67-52-pm01-test.sh
-- END - 2015-09-13 11:17:15

pm01のステップ3のログは、以下のように表示されています。
このログを見ると、ステップ1で作成したスクリプトを実行していることがわかります。
-- START - 2015-09-13 11:17:17
-- 格納場所: pm01
-- 実行ホスト: pm01
-- 実行ユーザ: uid=0(root) gid=0(root) 所属グループ=0(root)
-- 実行シェル: /bin/bash
-- 実行プログラム: /tmp/test.sh
-- END - 2015-09-13 11:17:17


今回は、[WorkflowのStrategy] や [Tred Count] をデフォルト設定でジョブを実行したので、各ステップがシーケンシャルに実行されましたが、各サーバでジョブを並列処理させることも可能です。

使い方の詳細は、「ユーザマニュアル(日本語)」を参照してください。


2015年9月6日日曜日

[CentOS6] NFSクライアントがNULLを返す


たまたま、下記のページを見つけた。
NFS3(非同期)の場合、
  1. NFSサーバ側で、常にデータをファイルに書き込む。
  2. NFSクライアント側で、tail コマンドでデータを読み込む。
といったことをすると、
NFSクライアントがデータをNULL(0x00)で置き換えることがあるそうです。
ファイルの属性情報とNFSキャッシュのデータがずれることが原因みたい。

そんなことあるのか? と思い、CentOS6で試してみました。

NFSサーバの設定は以下のようにします。
[root@pm01 ~]# cat /etc/exports
/data 10.1.0.0/24(rw,no_root_squash,async,wdelay)
NFSサーバ側で以下のように実行して、0.1 秒間隔で 10個のファイルに "abc" を書き込みます。
[root@pm01 ~]# for f in /data/file{00..09}; do while true; do echo 'abc' >> ${f}; sleep .1; done & done
[1] 2356
[2] 2357
[3] 2358
[4] 2359
[5] 2360
[6] 2361
[7] 2362
[8] 2363
[9] 2364
[10] 2365
[root@pm01 ~]#
NFSクライアント側では、NFSver3 でマウントし、rsize/wsize を大きい値に設定します。
マウント後、tail コマンドを実行して、ファイルを監視すると、NULL(0x00)が出ました。(赤字部分)
[root@pm02 ~]# mount -t nfs -o nfsvers=3,rsize=32768,wsize=32768 10.1.0.71:/data /mnt
[root@pm02 ~]# for f in /mnt/file{00..09}; do tail -f ${f} | hexdump -C & done
[1] 2498
[2] 2500
[3] 2502
[4] 2504
[5] 2506
[6] 2508
[7] 2510
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
[8] 2512
[9] 2514
[10] 2516
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
[root@pm02 ~]# 00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000000  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*

[root@pm02 ~]# 000001f0  61 62 63 0a 00 00 00 00  61 62 63 0a 61 62 63 0a  |abc.....abc.abc.|
00000200  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*
00000610  61 62 63 0a 00 00 00 00  61 62 63 0a 61 62 63 0a  |abc.....abc.abc.|
00000620  61 62 63 0a 61 62 63 0a  61 62 63 0a 61 62 63 0a  |abc.abc.abc.abc.|
*


fluentd の in_tail プラグインを使うときは注意しよう。。。