AmazonLinuxでsupervisorをyumインストールする

AWS

この記事は公開されてから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

AWS Cloud Roadshow 2017 福岡