この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
カテゴリ的にはRundeckとしていますが、内容的にはどちらかと言うとPythonのものになるかもしれません。Rundeckでスクリプトファイル等を実行出来る事は以前のエントリでもご紹介しましたが、この環境下でPythonスクリプトを動かす際に、ユーティリティ系のもの等の利用頻度が高いスクリプトについてはimportの機能を使って外部プログラムとして取り込み、利便性を高めたいと思いました。幾つかの試行錯誤を経て実現に至ったので、その過程をエントリとして書き起こしてみたいと思います。
Rundeck導入のLinuxサーバ内でPythonの任意のプログラムimportを実現する
やろうとしている事は、Rundeck上で以下のようなジョブの実行です。
- Rundeckのジョブとして、任意のパスに配置しているPythonプログラムを実行する
- そのプログラムは、ユーティリティ的な別のPythonプログラムを実行している
- ユーティリティプログラムを実行プログラムからimportして使いたい
検証を行なう環境は以下の様なものを用意しました。下記エントリを参考にして、フォルダcommonの配下に中身の記載無し、ファイル名のみの__init__.pyというプログラムを配置しています。
$ pwd
/home/rundeck/scripts/python
$ ll
合計 16
drwxr-xr-x 2 rundeck rundeck 4096 1月 8 16:37 common
-rwxr-xr-x 1 rundeck rundeck 179 1月 8 16:38 import-test.py
$
$ ll
$ ll common/
合計 12
-rw-r--r-- 1 rundeck rundeck 0 1月 8 15:05 __init__.py
-rwxr-xr-x 1 rundeck rundeck 150 1月 8 15:02 cmutil.py
ユーティリティプログラムとなるcmutil.pyは以下の様な構成にしています。
cmutil.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def printMessage():
print("this program is cmutil.py.");
この場合、通常のPythonお作法であれば、この構成下ならば実行ファイルimport-test.pyで以下のような構成を取ることにより、
import-test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from common import cmutil
cmutil.printMessage();
実行する事で以下のような出力を得る事が出来ます。
$ ./import-test.py
this program is cmutil.py.
Rundeckのジョブを登録し、上記で作成したPythonファイルを絶対パスで指定します。
実行!しかしエラーとなってしまいました。ログを確認してみると、指定したパスのプログラムでは無く、指定のプログラムを別のディレクトリ(/tmp)配下に配備したものを実行する形となってしまっています。結果として想定した上記の構成では無くなってしまい、モジュールを読み込めずエラーとなったようです。
Pythonのプログラムimport指定を、モジュールへのパスを追加する事で対応
対応方法の1つとしては、以下の様にモジュールへのパスを追加する事で、相対パス指定では達する事が出来なかった部分を補完する事が出来ます。
import-test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
sys.path.append('/home/rundeck/scripts/python/')
from common import cmutil
cmutil.printMessage();
再度実行してみます。今度は上手く行きました!
参考にしたエントリには『デフォルト検索パス』に必要な値を含めてしまう事で適宜パスに追加しなくても済む手段も紹介されていました。今回Rundeckを導入したサーバはAmazon Linuなので、以下のパスにファイルを作成し、
$ sudo vi /usr/lib/python2.7/dist-packages/custompath.pth
/home/rundeck/scripts/python/
先ほど指定していたパス追加の部分はコメントアウトしておきます。確認用にプログラム呼び出し前後でデバッグ文を埋め込み。
import-test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#import sys
#sys.path.append('/home/rundeck/scripts/python/')
from common import cmutil
print("program import start.");
cmutil.printMessage();
print("program import end.");
ローカル(Linuxサーバ上)で実行出来る事を確認し、改めてRundeck上で実行してみます。こちらも上手く行きました!
まとめ
以上、Rundeck導入サーバ配下でPythonの独自プログラムをimportする際の手順について、個人的に引っ掛かっていた部分のまとめでした。これで、ジョブ作成時に作っておいた自作の便利系スクリプトを効率的に扱う事が出来そうです。こちらからは以上です。