[MUNIN] Pythonプラグインで文字コードエラーが発生する際の解決方法

この記事は、シリーズ「Muninでサーバー監視」の一部です。( 3 / 4 )

MUNINプラグインでClickが出すエラー、RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Consult https://click.palletsprojects.com/en/7.x/python3/ for mitigation steps.への対応方法です。

結論

/etc/munin/plugin-conf.d/munin-nodeに、環境変数の設定を追加する。

[plugin_name.py]
env.LANG C.UTF-8
env.LC_ALL C.UTF-8

現象

MUNINプラグインをPython3.6で開発し、python3.6コマンドによる動作確認も完了しました。
そこで/etc/munin/pluginに移し、sudo munin-runで動かしたところ、下記のようなExceptionが表示されました。

(venv) ➜  project git:(master) ✗ sudo munin-run plugin_name.py config
Traceback (most recent call last):
  File "/etc/munin/plugins/plugin_name.py", line 80, in <module>
    cmd()
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/click/core.py", line 696, in main
    _verify_python3_env()
  File "/usr/local/lib/python3.6/dist-packages/click/_unicodefun.py", line 124, in _verify_python3_env
    ' mitigation steps.' + extra
RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Consult https://click.palletsprojects.com/en/7.x/python3/ for mitigation steps.

This system supports the C.UTF-8 locale which is recommended.
You might be able to resolve your issue by exporting the
following environment variables:

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8

原因

エラーの表示内容のとおり、環境変数LC_ALL, LANGを設定すれば解決すると考えました。
一般ユーザでもrootユーザでも発生しておらず、それらのLANGja-JP.UTF-8に設定しているためです。
sudo munin-runでは実行ユーザがmuninであるため、LANGが適切に設定されていないようです。

対応

muninユーザの環境変数を設定します。
とはいえ、muninユーザにログインしたり、.bashrc等を触ったりする必要はありません。

Munin Document – Configuringには、以下のように解説されています。

env.<var> <contents>
対象のプラグインが動作する際、環境変数<var><contents>に設定します。
複数行の記述が可能です。値を””で囲む必要はありません。

なので、下記のように記述すればOKです。
sudo vim /etc/munin/plugin-conf.d/munin-node

[plugin_name.py]
env.LANG C.UTF-8
env.LC_ALL C.UTF-8

この設定をした後、無事エラーが発生しなくなりました。

この記事は、シリーズ「Muninでサーバー監視」の一部です。( 3 / 4 )