Fix Lỗi Ansible: /usr/bin/python: not found trên Remote Host

beginner🔧 Ansible2026-03-26| Ansible 2.8+, Ubuntu 20.04/22.04, Debian 11/12, Rocky Linux 8/9, AlmaLinux — remote host không cài Python 2

Error Message

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

Lỗi Xảy Ra

Playbook của bạn thất bại ngay từ task đầu tiên, trước khi thực hiện bất kỳ thao tác nào:

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

Ansible đã cố chạy /usr/bin/python trên remote host. Đường dẫn đó không tồn tại. Đây là lỗi một dòng khiến rất nhiều người bị vấp khi nâng cấp lên Ubuntu 20.04 hoặc Debian 11 — các distro này chỉ đi kèm Python 3, và /usr/bin/python (đường dẫn của Python 2) đã bị gỡ bỏ hoàn toàn.

Nguyên Nhân

Ansible cần Python trên remote host để thực thi các module. Trước phiên bản 2.12, Ansible mặc định dùng /usr/bin/python — đường dẫn của Python 2. Ubuntu 18.04 và các phiên bản cũ hơn có cả Python 2 lẫn Python 3 nên không có vấn đề gì. Ubuntu 20.04 đã bỏ hoàn toàn Python 2. Tương tự với Debian 11, Rocky Linux 8 và AlmaLinux 8.

Có hai nguyên nhân có thể gây ra lỗi này:

  • Remote host có Python 3 tại /usr/bin/python3, nhưng không có symlink /usr/bin/python.
  • File ansible.cfg hoặc inventory của bạn cấu hình tường minh ansible_python_interpreter=/usr/bin/python.

Cách Sửa Nhanh — Đặt ansible_python_interpreter

Trỏ Ansible đến đúng binary Python. Chỉ cần vậy là xong.

Cách 1: Cấu hình theo host hoặc theo group trong inventory

Thêm ansible_python_interpreter trực tiếp vào host hoặc group bị ảnh hưởng:

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

Muốn dùng group vars? Dùng cách này:

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

Cách 2: Tự động nhận diện (tốt nhất cho môi trường hỗn hợp)

Đặt interpreter thành auto và để Ansible tự xử lý:

[webservers:vars]
ansible_python_interpreter=auto

Với auto, Ansible SSH vào từng host, kiểm tra các phiên bản Python đang có và chọn phiên bản phù hợp nhất. Không cần cấu hình thủ công cho từng host. Hoạt động tốt khi fleet của bạn là hỗn hợp — một số host vẫn dùng Python 2, phần lớn đã chuyển sang Python 3.

Cách Sửa Vĩnh Viễn — ansible.cfg

Cấu hình từng inventory rất tốn công. Cách gọn hơn: thêm giá trị mặc định toàn cục vào ansible.cfg:

[defaults]
interpreter_python = auto_silent

auto_silent thực hiện tự động nhận diện giống như auto, nhưng không hiển thị cảnh báo deprecation. Cảnh báo đó làm rối output trong pipeline CI/CD — tắt đi sớm cho gọn.

Tất cả host đã dùng Python 3? Bỏ qua bước tự động nhận diện và cấu hình tường minh:

[defaults]
interpreter_python = /usr/bin/python3

Phương Án Khác: Cài python-is-python3 trên Remote Host

Đôi khi bạn không thể sửa config của Ansible — có thể do dùng chung ansible.cfg, hoặc đang chạy playbook cũ với đường dẫn hardcode. Trong trường hợp đó, hãy tạo symlink trên remote host:

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

# Kiểm tra symlink
ls -la /usr/bin/python
# /usr/bin/python -> /usr/bin/python3

Package này tạo symlink /usr/bin/python/usr/bin/python3. Các playbook cũ tiếp tục hoạt động mà không cần thay đổi bất kỳ cấu hình Ansible nào.

Kiểm Tra Sau Khi Sửa

Chạy lệnh ping nhanh để xác nhận Ansible có thể kết nối và thực thi được:

ansible 192.168.1.10 -m ping -i inventory.ini

Kết quả mong muốn:

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

Muốn kiểm tra xem Ansible thực sự đã chọn interpreter nào? Chạy lệnh sau:

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

Để xem đầy đủ thông tin khi chạy playbook, thêm flag -v:

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

Tìm dòng này trong output:

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

Tóm Tắt

  • Ansible mặc định dùng /usr/bin/python, đường dẫn này không tồn tại trên các host chỉ có Python 3 (Ubuntu 20.04+, Debian 11+, Rocky Linux 8+).
  • Sửa nhanh nhất: thêm ansible_python_interpreter=/usr/bin/python3 vào inventory.
  • Sửa lâu dài tốt nhất: đặt interpreter_python = auto_silent trong ansible.cfg.
  • Xác nhận đã hoạt động: ansible <host> -m ping.

Related Error Notes