Điều gì đang xảy ra?
Bạn đã dành cả giờ đồng hồ để tinh chỉnh một playbook. Bạn nhấn enter, mong đợi thấy các máy chủ web được cập nhật, nhưng quá trình thực thi lại kết thúc trong chưa đầy một giây. Thay vì một loạt các trạng thái 'ok' màu xanh, terminal của bạn lại tràn ngập các cảnh báo màu vàng. Ansible thông báo rằng nó không thể tìm thấy các host của bạn, tự động chuyển sang localhost, và bỏ qua mọi task vì host pattern của bạn—như [webservers]—về cơ bản là không tồn tại.
Cảnh báo này xuất hiện khi Ansible tìm kiếm danh sách các node được quản lý nhưng không có kết quả. Có thể nó không tìm thấy file inventory của bạn, hoặc file tìm thấy không thể đọc được hoặc bị trống. Dưới đây là thông báo cụ thể cho thấy sự cố này:
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: Could not match supplied host pattern: webservers
Thứ tự tìm kiếm: Nơi Ansible rà soát
Ansible không đoán xem các host của bạn nằm ở đâu. Nó tuân theo một hệ thống phân cấp nghiêm ngặt đã được thiết lập sẵn. Nếu bạn không chỉ định rõ ràng một file, nó sẽ kiểm tra các vị trí này theo đúng thứ tự sau:
- Flag
-iđược sử dụng trong dòng lệnh của bạn. - Biến môi trường
ANSIBLE_INVENTORY. - Cài đặt
inventorytrong fileansible.cfgnằm ở thư mục làm việc hiện tại. - Cài đặt
inventorytrong~/.ansible.cfg(thư mục home của bạn). - Mặc định hệ thống tại
/etc/ansible/hosts.
Nếu tất cả các bước kiểm tra này đều không có kết quả, Ansible sẽ từ bỏ hạ tầng từ xa của bạn và mặc định chọn máy cục bộ.
Cách khắc phục nhanh: Sử dụng Flag Inventory
Cách nhanh nhất để khắc phục là cho Ansible biết chính xác file nào cần sử dụng. Hãy dùng flag -i (inventory) để chỉ định đường dẫn. Ví dụ: nếu file của bạn tên là production.ini, hãy chạy playbook như sau:
ansible-playbook -i production.ini site.yml
Cách này cũng hiệu quả với các lệnh ad-hoc. Để kiểm tra kết nối cho 12 máy chủ cùng lúc, bạn sẽ chạy:
ansible all -i production.ini -m ping
Cách khắc phục lâu dài: Cấu hình ở cấp độ Project
Việc dùng flag thủ công khá phiền phức và dễ dẫn đến sai sót. Để giải quyết vấn đề này về lâu dài, hãy tạo một file ansible.cfg trong thư mục gốc của project—cùng nơi với playbook của bạn. Điều này yêu cầu Ansible luôn tìm kiếm trong thư mục cục bộ trước.
Thêm các dòng sau vào file ansible.cfg:
[defaults]
inventory = ./hosts.ini
host_key_checking = False
Giờ đây, chỉ cần chạy ansible-playbook site.yml, hệ thống sẽ tự động tải hosts.ini mà không cần gõ thêm gì cả.
Xử lý các lỗi tiềm ẩn
Nếu bạn đã thiết lập đường dẫn chính xác nhưng lỗi vẫn còn, thì một trong ba vấn đề sau có thể là nguyên nhân:
1. Bẫy định dạng YAML
YAML nổi tiếng là khắt khe. Chỉ cần một ký tự tab thay vì hai dấu cách cũng có thể làm hỏng file hosts.yaml của bạn. Điều thú vị là Ansible không phải lúc nào cũng báo lỗi "Syntax Error." Nó có thể chỉ đơn giản là không phân tích được file và âm thầm bỏ qua nó.
Kiểm tra cấu trúc của bạn bằng cách chuyển đổi nó. Tôi thường sử dụng YAML ↔ JSON Converter để xem cấu trúc có khớp chính xác hay không. Nếu đầu ra JSON trông bị lồng sai hoặc bị hỏng, thì việc thụt đầu dòng (indentation) YAML của bạn đang bị lỗi.
2. Tên Group không khớp
Đôi khi Ansible đọc được file nhưng không tìm thấy group cụ thể mà bạn yêu cầu. Hãy xác minh rằng tên group trong inventory khớp với dòng hosts: trong playbook của bạn. Một file hosts.ini chuẩn sẽ trông như sau:
[webservers]
192.168.1.10
192.168.1.11
[dbservers]
10.0.0.5
3. Quyền truy cập Linux
Ansible cần đọc được file của bạn để sử dụng. Nếu bạn tạo file bằng quyền root nhưng lại chạy playbook bằng người dùng bình thường, Ansible có thể bị chặn. Hãy chạy ls -l hosts.ini để kiểm tra. Nếu quyền truy cập hiển thị dạng -rw------- và bạn không phải là chủ sở hữu, bạn sẽ cần chạy chmod 644 hosts.ini để cho phép đọc file.
Xác minh: Cách kiểm tra xem nó đã hoạt động chưa
Đừng lãng phí thời gian chạy một playbook khổng lồ chỉ để kiểm tra kết nối. Hãy sử dụng công cụ ansible-inventory để xem chính xác những gì Ansible đang ghi nhận.
Chạy lệnh này để xem danh sách thô:
ansible-inventory --list -y
Hoặc sử dụng lệnh này để xem dưới dạng cây trực quan rõ ràng hơn:
ansible-inventory --graph
Nếu đầu ra hiển thị hostname và địa chỉ IP của bạn, bạn đã sẵn sàng. Nếu bạn chỉ thấy @all và @ungrouped mà không có dữ liệu bên dưới, Ansible vẫn đang bỏ qua file của bạn.
Danh sách kiểm tra tóm tắt
- Tên file: Đó là
hosts.ini,hosts.yml, hay chỉ làhosts? Hãy đảm bảo cấu hình của bạn khớp với tên thực tế. - Đường dẫn: Bạn đã cung cấp đường dẫn qua flag
-ihay định nghĩa nó trongansible.cfgchưa? - Tên Group:
[group_name]của bạn có khớp với dònghosts:trong playbook không? - Cú pháp: Nếu sử dụng YAML, có ký tự tab ẩn hoặc lỗi thụt đầu dòng nào không?

