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.cfghoặc inventory của bạn cấu hình tường minhansible_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/python3vào inventory. - Sửa lâu dài tốt nhất: đặt
interpreter_python = auto_silenttrongansible.cfg. - Xác nhận đã hoạt động:
ansible <host> -m ping.

