この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。
簡単なスクリプトをデーモン化するには、supervisorが便利です。 supervisorはPythonで書かれているため、pipやeasy_installでインストールできます。 しかし、yumを使ってインストールした方が、余計な設定無しでsupervisorをサービスとして利用できるでしょう。 Ansible使いとしても、できればyumを使いたいところです。
supervisorをepelリポジトリからインストールする
2016年8月現在、supervisorはAWSのyumリポジトリからはインストールできません。 epelリポジトリを有効にしてインストールします。
$ sudo yum --enablerepo=epel install supervisor
起動します。
$ sudo service supervisord start
Starting supervisord: Traceback (most recent call last):
File "/usr/bin/supervisord", line 2, in <module>
from supervisor.supervisord import main
ImportError: No module named supervisor.supervisord
[FAILED]
えー。 インストールは成功したのに、モジュールがないとか言われてしまいました...。
Python関連のプロダクトの問題はバージョン周りを確認する
AmazonLinuxはRedHat Enterprise(CentOS)系のLinuxです。 OSの基本的な部分にPythonが広く利用されています。 また、Python2.6がデフォルトでしたが、Amazon Linux AMI 2015.03よりPython2.7がデフォルトになりました([速報]Amazon Linux AMI 2015.03 がリリースされました!)。
実は、この変更後、稀にPython関連の挙動でハマることがあるのです。
pythonのバージョンを確認します。
$ python --version
Python 2.7.10
ライブラリを確認します。
$ ls /usr/lib/python2.7/site-packages/
README
本来、このディレクトリにsupervisorがインストールされている筈です。 PythonのImportではsite-packagesを参照しに行くため、ImportErrorが発生したわけですね。
では、どこにインストールされたのでしょうか?
答えは、Python2.6のsite-packagesです。
$ ls /usr/lib/python2.6/site-packages/
README supervisor supervisor-2.1-py2.6.egg-info
どうやら、yumでepelリポジトリからsupervisorをインストールした場合、Python2.6のsite-packagesにsupervisorがインストールされるようです。
原因は判明しました。 supervisorでPython2.6を利用すば良さそうです。
supervisordでPython2.6を利用する
では、/usr/bin/supervisord
でPython2.6を利用するように修正しましょう。
#!/usr/bin/python
from supervisor.supervisord import main
# __doc__ required to make supervisord -h work
from supervisor.supervisord import __doc__
main()
1行目を修正します。
#!/usr/bin/python26
from supervisor.supervisord import main
# __doc__ required to make supervisord -h work
from supervisor.supervisord import __doc__
main()
$ sudo service supervisord start
Starting supervisord: [ OK ]
無事に起動できました!
同様に /usr/bin/supervisorctl
も修正してください。
まとめ
AmazonLinuxでは定期的にアップデートが行われますが、ベースとなるLinuxがCentOS6系です。 このため、特にepelなどデフォルト以外のリポジトリを利用するとPython絡みでハマることがあります。 また、supervisorの最新版は3系ですが、epelのリポジトリからインストールした場合は2系でした。 このように古いバージョンとなることも多いでしょう。
ベストプラクティスとしては、Python絡みのパッケージはyumを利用せず、pipなどでインストールすることです。 どうしてもyumを利用したい場合は、今回のようにPython2.6を利用するようにハックするのがひとつの解決方法です。
おまけにAnsibleでのタスクを公開しておきます。
- name: supervisor installed
yum:
name: supervisor
enablerepo: epel
- name: huck using python2.6
lineinfile:
dest: "{{ item }}"
regexp: "^#!/usr/bin"
line: "#!/usr/bin/python26"
with_items:
- /usr/bin/supervisord
- /usr/bin/supervisorctl
- name: supervisord started
service:
name: supervisord
state: started
enabled: yes