Chuyện gì đã xảy ra
Bạn chạy ansible-playbook, nhưng thay vì các task được thực thi, bạn nhận được thông báo này:
ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.
The error appears to be in '/home/user/playbooks/deploy.yml': line 14, column 5
Ansible gặp một task và không thể xác định cần làm gì — tên module không khớp với bất kỳ thứ gì nó biết. Chín trên mười trường hợp là do gõ nhầm tên, sai tên key, hoặc lỗi thụt lề khiến một giá trị trông giống như một key.
Tái hiện lỗi
Đây là một playbook tối giản để kích hoạt lỗi này:
- name: Install nginx
hosts: webservers
tasks:
- name: Install nginx package
apt_pakage: # typo: should be apt or ansible.builtin.apt
name: nginx
state: present
Ansible phân tích apt_pakage, không tìm thấy module nào khớp và dừng lại. Toàn bộ khối task bị đánh dấu lỗi — không có gì được chạy.
Gỡ lỗi
Bước 1 — Đọc số dòng trong thông báo lỗi
Ansible hầu như luôn cho bạn biết chính xác file và dòng nào:
The error appears to be in '/home/user/playbooks/deploy.yml': line 14, column 5
Nhảy thẳng đến dòng đó. Đừng dò cả file.
Bước 2 — Kiểm tra tên module xem có gõ nhầm không
Những lỗi hay gặp nhất:
apt_pakagethay vìaptsystemd_servicethay vìsystemdcopy_filethay vìcopygit_clonethay vìgitcomandthay vìcommand
Không chắc tên chính xác? Tra cứu như sau:
ansible-doc -l | grep <keyword>
# Example:
ansible-doc -l | grep apt
Định dạng FQCN như ansible.builtin.apt cũng hoạt động và loại bỏ mọi nhầm lẫn về collection bạn đang nhắm tới.
Bước 3 — Kiểm tra lỗi thụt lề đang che khuất tên module
Lỗi này khiến nhiều người vấp phải. Nếu một đối số của module vô tình bị giảm thụt lề xuống cùng cấp với task, Ansible sẽ đọc nó như tên module thứ hai:
# Bị lỗi — 'state' bị Ansible hiểu là một module
- name: Install nginx
apt:
name: nginx
state: present # ← thụt lề sai, giờ ở cấp task
Ansible thấy apt và state là hai key riêng biệt ở cấp task. Nó không thể xác định cái nào là action. Lỗi xảy ra.
Sửa lại thụt lề là xong:
- name: Install nginx
apt:
name: nginx
state: present # ← thụt lề đúng dưới apt
Bước 4 — Kiểm tra cấu trúc YAML
Trước khi đi sâu hơn, hãy loại trừ các vấn đề YAML cơ bản. Dán playbook của bạn vào YAML ↔ JSON Converter trên ToolCraft — công cụ này chuyển đổi YAML sang JSON ngay trên trình duyệt mà không cần upload file. Nếu chuyển đổi thất bại hoặc cấu trúc bị biến dạng, đó là dấu hiệu rõ ràng của lỗi thụt lề hoặc cú pháp. Tôi dùng công cụ này thường xuyên khi playbook trông ổn bằng mắt nhưng cứ báo lỗi.
Linter của Ansible cũng dùng được:
ansible-playbook --syntax-check deploy.yml
Lệnh này phát hiện lỗi tên module mà không động đến host nào.
Cách sửa
Thường chỉ cần thay một từ. Trước và sau khi sửa:
# Trước (bị lỗi)
- name: Restart nginx
systemd_service:
name: nginx
state: restarted
# Sau (đã sửa)
- name: Restart nginx
systemd:
name: nginx
state: restarted
Hoặc viết đầy đủ với FQCN để hoàn toàn rõ ràng:
- name: Restart nginx
ansible.builtin.systemd:
name: nginx
state: restarted
Sửa lỗi đường dẫn module của collection
Đang dùng collection của cộng đồng hoặc bên thứ ba? Hãy đảm bảo collection đã được cài đặt và FQCN khớp chính xác:
# Cài đặt collection
ansible-galaxy collection install community.general
# Dùng đúng FQCN trong task
- name: Install pip package
community.general.pip:
name: requests
state: present
Xem những collection đã có sẵn trên control node của bạn:
ansible-galaxy collection list
Kiểm tra kết quả
Chạy kiểm tra cú pháp trước:
ansible-playbook --syntax-check deploy.yml
# Expected output:
playbook: deploy.yml
Output sạch nghĩa là Ansible nhận ra module. Giờ chạy thử với inventory thực của bạn:
ansible-playbook -i inventory.ini deploy.yml --check
Nếu --check hoàn thành mà không còn lỗi no action detected, bạn đã xong.
Bài học rút ra
Dù trông có vẻ khó hiểu, lỗi này luôn chỉ có một nghĩa: Ansible tìm thấy một key trong khối task mà nó không thể ánh xạ tới module nào. Ba nguyên nhân, theo thứ tự thường gặp:
- Gõ nhầm tên module — phổ biến nhất. Đối chiếu lại cách viết với
ansible-doc -l. - Lỗi thụt lề — một đối số của module trượt xuống cấp task. VS Code với extension YAML hiển thị lỗi này trực quan; cài 30 giây là đáng.
- Sai đường dẫn collection — dùng module của cộng đồng mà chưa cài collection, hoặc viết sai FQCN.
Thêm --syntax-check như một bước kiểm tra trước trong CI pipeline sẽ bắt được toàn bộ lớp lỗi này trước khi nó chạm tới bất kỳ host nào.

