Sửa lỗi Ansible "no action detected in task" — Tên module bị viết sai trong Playbook

beginner🔧 Ansible2026-05-07| Ansible 2.9+, Ubuntu 20.04/22.04, RHEL 8/9, bất kỳ control node nào chạy Python 3.x

Error Message

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.
#module#playbook#lỗi đánh máy#yaml

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_pakage thay vì apt
  • systemd_service thay vì systemd
  • copy_file thay vì copy
  • git_clone thay vì git
  • comand thay 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 aptstate 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.

Related Error Notes