Ansible Local Action – Thực thi tác vụ trên Controller

Trong Ansible, hầu hết các playbook hay task đều được thiết kế để chạy trên remote hosts (client). Tức là, Ansible controller (máy quản lý) chỉ giữ vai trò điều khiển, còn việc thực thi diễn ra trên các máy được quản lý.

Tuy nhiên, trong một số trường hợp đặc biệt, bạn cần chạy một số tác vụ ngay trên controller node (máy cài Ansible), ví dụ như:

  • Tạo file tạm trước khi copy sang client.
  • Sinh dữ liệu động (dynamic data) cần xử lý cục bộ trước khi áp dụng lên remote host.
  • Thực hiện các lệnh hệ thống để chuẩn bị môi trường cho việc triển khai.

Khi đó, bạn sẽ dùng local_action.

Xem thêm:

Hướng dẫn sử dụng Block, Rescue và Always trong Ansible Playbook

Hướng dẫn sử dụng Error Handling trong Ansible Playbook

Hướng dẫn tạo Cron Job tự động dọn dẹp log bằng Ansible

1. Local Action là gì?

  • Ansible Local Action cho phép bạn chạy một module hoặc command ngay trên Ansible controller, thay vì chạy trên remote host.
  • Cú pháp:
    - local_action: <module hoặc command>
    
  • Thường dùng với:
    • command
    • shell
    • copy
    • template

2. Cấu trúc Playbook mẫu

Ví dụ, ta muốn:

  1. Tạo một file trên controller có tên dạng <hostname>_local_file.ini.
  2. Copy file đó sang thư mục /var/tmp trên từng remote host.

Playbook sẽ như sau:

---
- name: Demo Local Action in Ansible
  hosts: all
  become: yes
  tasks:
    - name: Create local file with hostname
      local_action: 
        module: command
        cmd: "touch /tmp/{{ inventory_hostname }}_local_file.ini"

    - name: Copy file to remote host
      copy:
        src: "/tmp/{{ inventory_hostname }}_local_file.ini"
        dest: "/var/tmp/{{ inventory_hostname }}_local_file.ini"

3. Giải thích từng bước

Bước 1: Tạo file trên controller

- name: Create local file with hostname
  local_action: 
    module: command
    cmd: "touch /tmp/{{ inventory_hostname }}_local_file.ini"
  • local_action → chỉ định task này chạy ngay trên controller.
  • command → module thực thi lệnh Linux.
  • inventory_hostname → biến của Ansible, đại diện cho tên host hiện tại trong inventory.
  • Kết quả: trên controller sẽ xuất hiện file /tmp/<hostname>_local_file.ini.

Bước 2: Copy file sang remote host

- name: Copy file to remote host
  copy:
    src: "/tmp/{{ inventory_hostname }}_local_file.ini"
    dest: "/var/tmp/{{ inventory_hostname }}_local_file.ini"
  • Task này khônglocal_action, nên mặc định chạy trên remote host.
  • src lấy file đã tạo ở controller.
  • dest là nơi file sẽ được lưu trên remote host.

Local Action là một công cụ hữu ích khi bạn cần xử lý tác vụ ngay trên controller trước khi áp dụng lên remote hosts. Tuy không thường xuyên dùng, nhưng hiểu rõ Local Action giúp bạn linh hoạt hơn khi viết playbook.

Cảm ơn bạn đã tham khảo ansible tutorial trên ttnguyen.net

Bài viết cùng chủ đề:

tags trong Ansible

Ansible Vault – Bài 11

Ansible Role – Bài 10

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em