Rundeck: スクリプトファイル読み込みによるジョブの実行

2015.11.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

OSSのジョブ管理ツール『Rundeck』ではスクリプトファイルを読みこませる事でその内容をジョブのステップの1つとする事が出来ます。当エントリではその手順についてご紹介したいと思います。

もくじ

Rundeck環境導入のEC2サーバに配備したスクリプトファイルを読み込んで実行

まずこちらで紹介するのが、Rundeckを導入した環境(EC2)配下にプログラムを配備し、そのファイルを読み込んで実行させるというものです。EC2(Amazon Linux)インスタンス上にRundeckサーバを導入するのは以前のエントリでご紹介しました。ここではその環境下で今回説明する手順を進めるという想定で行きます。

まずは実行プログラムの作成。シェルスクリプトでシンプルに文字情報と、dateコマンドによる日付時刻情報を出力するプログラムを作成しました。プログラムの配置パスを、ひとまずは/home/ec2-user/rundeck-job-test.shとしました。

/home/ec2-user/rundeck-job-test.sh

$ vi /home/ec2-user/rundeck-job-test.sh
#!/bin/sh
echo "rundeck job start."
date
echo "rundeck job end."

実行するとこんな感じで情報が出ます。

$ chmod +x rundeck-job-test.sh 
$ ./rundeck-job-test.sh 
rundeck job start.
2015年 11月 23日 月曜日 14:19:01 JST
rundeck job end.

任意のジョブを作成し、ステップを作成します。ここでは『Script file or URL』を選択。

rundeck-create-job_including-script-file_01

上記で指定したパスを『File Paht/URL』に指定、保存した上でジョブとして作成します。

rundeck-create-job_including-script-file_02

ジョブ実行。するとエラーとなってしまいました...

rundeck-create-job_including-script-file_03

エラーログを確認してみます。どうやら権限が足りない様です。

14:23:23 localhost 1. /home/ec2-user/rundeck-job-test.sh
  Failed dispatching to node localhost: error writing to tempfile:
  /home/ec2-user/rundeck-job-test.sh (Permission denied)
14:23:23 Execution failed: 2:
  [Workflow result:,
   step failures: {
     1=Dispatch failed on 1 nodes:
       [localhost: IOFailure: error writing to tempfile:
       /home/ec2-user/rundeck-job-test.sh (Permission denied)]},
       Node failures: {localhost=[IOFailure: error writing to tempfile:
       /home/ec2-user/rundeck-job-test.sh (Permission denied)]},
       flow control: Continue, status: failed]

実行ユーザーを確認する為にwhoamiコマンドを実行するステップを追加し、上記実行ステップの前に設定してみます。

rundeck-create-job_including-script-file_04

再度実行。whoamiコマンドの実行結果にはrundeckと表示されました。どうやらRundeckインストール時にこのユーザーが作成されていて、Rundeckの処理実行においてはこのユーザーで諸々の処理が行われている様です。

rundeck-create-job_including-script-file_05

導入時点でのユーザーの一覧を確認してみます。パスワードファイルの内容を見てみると(『Linux ユーザー 一覧』で確認する術がありました)、確かに、rundeckというユーザーの存在を確認出来ました。

root
:
:
ec2-user
rundeck

Rundeck実行ユーザー(rundeck)用に環境と実行ファイルを整えてみたいと思います。ここでは/home 配下にこのユーザー用のスクリプト格納ディレクトリを用意し、所有者もrundeckユーザーに変更しました。

$ sudo mkdir /home/rundeck/
$ sudo mkdir /home/rundeck/scripts
$ sudo cp /home/ec2-user/rundeck-job-test.sh /home/rundeck/scripts/
$ sudo chown -R rundeck.rundeck /home/rundeck/

$ cd /home/
$ ll
合計 8
drwx------ 4 ec2-user ec2-user 4096 11月 23 14:46 ec2-user
drwxr-xr-x 3 rundeck  rundeck  4096 11月 23 15:01 rundeck

$ cd rundeck/
$ ll
合計 4
drwxr-xr-x 2 rundeck rundeck 4096 11月 23 15:02 scripts

$ cd scripts/
$ ll
合計 4
-rwxr-xr-x 1 rundeck rundeck 65 11月 23 15:02 rundeck-job-test.sh
$

実行するスクリプトファイルのパスも上記変更を加えた内容に変更します。

rundeck-create-job_including-script-file_06

再度ジョブ実行。今度は権限周りの問題もクリアされたようで、ちゃんと動きました。

rundeck-create-job_including-script-file_07

参考: Pythonスクリプトを実行させる場合

上記ではシェルスクリプトファイルを設定してみましたが、他のスクリプトファイルも実行させたい、という要望もあるかと思います。ここでは一例としてPythonスクリプトをRundeckで実行させる場合のポイントについて補足しておこうと思います。 まずはRundeckサーバ上でPythonを実行可能な状態であるかどうかを確認します。EC2サーバ(Amazon Linux)であれば環境作成時にPythonはインストール済となっているので問題ありませんね。

$ python --version
Python 2.7.10

Rundeck上のこのフォーマットで実行させる場合の1つの手段としては、実行権限を付与した上でスクリプトの1行目にShebangを記載しておくというものがあるかと思います。下記エントリのサンプルコードを拝借したスクリプトを作成します。

rundeck-job.python

$ vi rundeck-job.python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print("Hello Python!")

この様に指定をしておく事で、シェルを選択するだけでPythonプログラムが実行出来るようになります。

$ ./rundeck-job.python 
Hello Python!

所定のパスへのファイル移動、及び権限設定を済ませておき、

$ chmod +x rundeck-job.python 
$ sudo cp rundeck-job.python /home/rundeck/scripts/
$ sudo chown rundeck.rundeck /home/rundeck/scripts/rundeck-job.python

$ ll /home/rundeck/scripts/
合計 8
-rwxr-xr-x 1 rundeck rundeck 65 11月 23 15:02 rundeck-job-test.sh
-rwxr-xr-x 1 rundeck rundeck 89 11月 23 17:20 rundeck-job.python
$

ジョブのステップとしてパスを設定。

rundeck-create-job_including-script-file_08

ジョブ実行。シェルスクリプト同様に、Rundeck経由で任意のPythonプログラムを実行させる事が出来ました。

rundeck-create-job_including-script-file_09

S3に配置したスクリプトファイルを読み込んで実行

今回試した経路では、任意のパスの他にも『任意のURL』からスクリプトファイルを読み込み、その内容を実行するという設定も行えます。

上記で試したスクリプトファイル2つを任意のS3バケットにアップロードし、外部からダウンロード出来るようにPublicアクセス可能な形に設定します。

rundeck-create-job_including-script-file_10

S3バケット上でのURLをジョブのステップとして設定し、実行してみます。問題無く処理が行えている様ですね!

rundeck-create-job_including-script-file_11

アクセス制限について

上記設定でS3にアップロードしたファイルの実行が行えましたが、publicアクセス可能な形に設定した状態になっているのでセキュリティ面では不安があります。こちらについては併せてバケットへのアクセスをIPアドレスで制限する等の対策も施しておく必要があるでしょう。詳細な手順については以下のエントリ等をご参照ください。

まとめ

Rundeckのジョブにスクリプトファイルを読み込ませて実行する際の手順についてのご紹介でした。恐らくは本番利用する場合の手順としてもこの形が最も多く活用される形なのではと思っています。幾つかルールはありますが、この辺りを上手く踏まえて活用して行きたいところですね。こちらからは以上です。