AmazonLinuxでsupervisorをyumインストールする
渡辺です。
簡単なスクリプトをデーモン化するには、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