エラーの内容
プレイブックが最初のタスクで、何も実行される前に落ちてしまいます:
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_silent は auto と同じ自動検出を行いますが、非推奨の警告が表示されません。この警告は 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.cfgにinterpreter_python = auto_silentを設定する。 - 動作確認:
ansible <host> -m pingを実行する。

