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:
commandshellcopytemplate
2. Cấu trúc Playbook mẫu
Ví dụ, ta muốn:
- Tạo một file trên controller có tên dạng
<hostname>_local_file.ini. - Copy file đó sang thư mục
/var/tmptrê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ông có
local_action, nên mặc định chạy trên remote host. srclấy file đã tạo ở controller.destlà 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ủ đề:
Ansible Vault – Bài 11
Ansible Role – Bài 10