Ansible エラー修正: リモートホストで /usr/bin/python が見つからない

beginner🔧 Ansible2026-03-26| Ansible 2.8+、Ubuntu 20.04/22.04、Debian 11/12、Rocky Linux 8/9、AlmaLinux — Python 2 が未インストールのリモートホスト

Error Message

fatal: [192.168.1.10]: FAILED! => {"changed": false, "msg": "/usr/bin/python: not found", "rc": 127}
#python#ansible_python_interpreter#インタープリター#python3

エラーの内容

プレイブックが最初のタスクで、何も実行される前に落ちてしまいます:

fatal: [192.168.1.10]: FAILED! => {"changed": false, "msg": "/usr/bin/python: not found", "rc": 127}

Ansible がリモートホスト上で /usr/bin/python を実行しようとしましたが、そのパスが存在しません。Ubuntu 20.04 や Debian 11 へアップグレードしたユーザーが多く踏むエラーです — これらのディストリビューションは Python 3 のみを同梱しており、/usr/bin/python(Python 2 のパス)はすでに存在しないのです。

原因

Ansible はモジュールを実行するためにリモートホスト上の Python を必要とします。バージョン 2.12 以前は /usr/bin/python(Python 2 のパス)をデフォルトとして使用していました。Ubuntu 18.04 以前は Python 2 と Python 3 の両方が存在していたため問題ありませんでした。しかし Ubuntu 20.04 では Python 2 が完全に削除されました。Debian 11、Rocky Linux 8、AlmaLinux 8 も同様です。

このエラーが発生する原因は主に 2 つあります:

  • リモートホストに /usr/bin/python3 は存在するが、/usr/bin/python のシンボリックリンクがない。
  • ansible.cfg またはインベントリに ansible_python_interpreter=/usr/bin/python が明示的に設定されている。

すぐできる修正 — ansible_python_interpreter を設定する

Ansible が正しい Python バイナリを参照するよう指定するだけで解決します。

方法 1: インベントリでホストまたはグループごとに設定する

該当ホストまたはグループに ansible_python_interpreter を直接追加します:

[webservers]
192.168.1.10 ansible_python_interpreter=/usr/bin/python3
192.168.1.11 ansible_python_interpreter=/usr/bin/python3

グループ変数を使いたい場合はこちら:

[webservers:vars]
ansible_python_interpreter=/usr/bin/python3

方法 2: 自動検出(混在環境に最適)

インタープリターを auto に設定して Ansible に自動判断させます:

[webservers:vars]
ansible_python_interpreter=auto

auto を指定すると、Ansible は各ホストに SSH 接続し、利用可能な Python バージョンを確認して最適なものを選択します。ホストごとの手動設定が不要です。Python 2 が残っているホストと Python 3 に移行済みのホストが混在するフリートでも有効です。

恒久的な修正 — ansible.cfg に設定する

インベントリごとに設定するのは手間がかかります。よりすっきりした方法として、ansible.cfg にグローバルなデフォルト値を追加します:

[defaults]
interpreter_python = auto_silent

auto_silentauto と同じ自動検出を行いますが、非推奨の警告が表示されません。この警告は CI/CD パイプラインの出力を煩雑にするため、早めに抑制しておきましょう。

すべてのホストが Python 3 のみであれば、自動検出のオーバーヘッドを省いて明示的に指定することもできます:

[defaults]
interpreter_python = /usr/bin/python3

代替手段: リモートホストに python-is-python3 をインストールする

Ansible の設定を変更できない場合もあります — 共有の ansible.cfg を使っているか、パスがハードコードされたレガシープレイブックを実行している場合などです。そのときは、リモートホスト側でシンボリックリンクを作成します:

# Ubuntu / Debian
sudo apt install python-is-python3 -y

# シンボリックリンクを確認
ls -la /usr/bin/python
# /usr/bin/python -> /usr/bin/python3

このパッケージにより /usr/bin/python/usr/bin/python3 のシンボリックリンクが作成されます。Ansible の設定を変更することなく、古いプレイブックも引き続き動作します。

修正の確認

ping を実行して Ansible がホストに到達でき、実行できることを確認します:

ansible 192.168.1.10 -m ping -i inventory.ini

以下のような結果が表示されれば成功です:

192.168.1.10 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Ansible が実際にどのインタープリターを選択したか確認したい場合は、次を実行します:

ansible 192.168.1.10 -m command -a "python3 --version" -i inventory.ini

プレイブック実行時に詳細を確認するには -v を追加します:

ansible-playbook site.yml -i inventory.ini -v

出力の中で以下の行を確認してください:

Using /usr/bin/python3 as the Python interpreter on host 192.168.1.10

まとめ

  • Ansible はデフォルトで /usr/bin/python を使用しますが、Python 3 のみのホスト(Ubuntu 20.04+、Debian 11+、Rocky Linux 8+)にはこのパスが存在しません。
  • 最速の修正: インベントリに ansible_python_interpreter=/usr/bin/python3 を追加する。
  • 長期的に最善の修正: ansible.cfginterpreter_python = auto_silent を設定する。
  • 動作確認: ansible <host> -m ping を実行する。

Related Error Notes