Tổng quan về Ansible Ad-hoc
Ad-hoc trong Ansible đề cập đến việc thực thi các lệnh đơn lẻ, tức thời mà không cần lưu trữ dưới dạng kịch bản (playbook). Ansible hoạt động chủ yếu qua hai cơ chế: Ad-hoc (chạy lệnh trực tiếp) và Playbook. Chế độ Ad-hoc đặc biệt hữu ích cho các tác vụ quản trị hàng ngày như kiểm tra trạng thái hệ thống, sao chép tệp tin nhanh hoặc khởi động lại dịch vụ.
Cú pháp lệnh Ad-hoc
ansible <host_pattern> -m <module_name> -a <arguments>
# Ví dụ:
ansible app_servers -m command -a 'uptime'
Mã màu trạng thái khi thực thi
- Màu xanh lá cây (Green): Tác vụ thành công và không có thay đổi nào được thực hiện trên hệ thống đích (idempotent).
- Màu vàng (Yellow): Tác vụ thành công và có sự thay đổi trạng thái trên máy chủ đích.
- Màu đỏ (Red): Tác vụ thất bại do lỗi cú pháp, lỗi kết nối hoặc lỗi thực thi.
Luồng thực thi của Ansible
- Đọc tệp cấu hình mặc định (thường là
/etc/ansible/ansible.cfg). - Tải module tương ứng được chỉ định (ví dụ:
ping,command). - Đóng gói module và tham số thành một tệp Python tạm thời, sau đó truyền qua SSH đến máy chủ đích.
- Cấp quyền thực thi cho tệp tạm thời trên máy chủ đích.
- Chạy tệp Python và thu thập kết quả trả về.
- Xóa tệp tạm thời và kết thúc tiến trình.
Các công cụ dòng lệnh cơ bản
Bộ công cụ Ansible cung cấp nhiều tiện ích CLI khác nhau:
ansible: Thực thi các tác vụ Ad-hoc.ansible-doc: Tra cứu tài liệu và cách sử dụng của các module.ansible-playbook: Chạy các kịch bản YAML (playbook).ansible-vault: Mã hóa và giải mã các dữ liệu nhạy cảm.ansible-galaxy: Quản lý và tải xuống các roles từ cộng đồng.
Sử dụng ansible-doc
# Liệt kê tất cả các module có sẵn
ansible-doc -l
# Xem tài liệu chi tiết của module 'ping'
ansible-doc ping
# Xem ví dụ mẫu (snippet) để đưa vào playbook
ansible-doc -s ping
Các tham số phổ biến của lệnh ansible
--version: Hiển thị phiên bản Ansible hiện tại.-m: Chỉ định module (mặc định làcommand).-v,-vv,-vvv: Tăng mức độ chi tiết của log debug.--list-hosts: Liệt kê danh sách các máy chủ sẽ bị ảnh hưởng mà không thực thi.-k/--ask-pass: Yêu cầu nhập mật khẩu SSH (nếu không dùng SSH key).-K/--ask-become-pass: Yêu cầu mật khẩu để nâng quyền (sudo).-C/--check: Chạy ở chế độ dry-run (kiểm tra mà không áp dụng thay đổi).-T: Thiết lập thời gian chờ (timeout) cho kết nối SSH.-u: Chỉ định người dùng SSH để kết nối đến máy chủ đích.-b/--become: Kích hoạt cơ chế nâng quyền (thay thế cho sudo cũ).
Các Module quản lý hệ thống thông dụng
1. Module command
Đây là module mặc định, dùng để thực thi các lệnh hệ thống cơ bản. Lưu ý rằng module này không hỗ trợ các toán tử shell như pipe (|), redirect (>) hay biến môi trường.
# Kiểm tra thời gian hoạt động của hệ thống
ansible db_servers -m command -a "uptime"
# Kết quả mẫu:
# 10.0.1.50 | CHANGED | rc=0 >>
# 10:15:32 up 45 days, 2:14, 1 user, load average: 0.00, 0.01, 0.05
2. Module shell
Tương tự như command, nhưng được thực thi thông qua shell (/bin/sh), do đó hỗ trợ đầy đủ các tính năng như pipe, wildcard và redirect.
# Lấy địa chỉ IP của card mạng eth0
ansible db_servers -m shell -a "ip addr show eth0 | grep 'inet ' | awk '{print $2}'"
3. Module script
Cho phép đẩy một script từ máy điều khiển (control node) lên máy chủ đích và thực thi nó ngay lập tức mà không cần lưu script lại trên máy chủ đích.
# Tạo script kiểm tra dung lượng ổ đĩa
cat << 'EOF' > check_disk.sh
#!/bin/bash
df -h | grep '/dev/sda1'
EOF
chmod +x check_disk.sh
# Thực thi script trên các máy chủ đích
ansible db_servers -m script -a "./check_disk.sh"
4. Module copy
Dùng để sao chép tệp tin từ máy điều khiển đến các máy chủ đích, đồng thời có thể thiết lập quyền hạn và tạo bản sao lưu.
# Sao chép tệp cấu hình và phân quyền
ansible app_servers -m copy -a "src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf.backup backup=yes mode=0644 owner=www-data"
# Các tham số quan trọng:
# - src: Đường dẫn tệp nguồn.
# - dest: Đường dẫn đích trên máy chủ.
# - backup: Tạo bản sao lưu nếu tệp đích đã tồn tại.
# - content: Ghi trực tiếp nội dung chuỗi vào tệp đích thay vì copy từ src.
# - mode, owner, group: Thiết lập quyền và sở hữu.
5. Module fetch
Hoạt động ngược lại với copy, dùng để kéo tệp tin từ máy chủ đích về máy điều khiển. Lưu ý: module này chỉ hỗ trợ kéo từng tệp tin đơn lẻ, không hỗ trợ kéo cả thư mục.
# Kéo tệp log từ máy chủ về thư mục /tmp/logs/
ansible app_servers -m fetch -a "src=/var/log/syslog dest=/tmp/logs/ flat=no"
6. Module file
Quản lý trạng thái, quyền hạn và thuộc tính của tệp tin hoặc thư mục trên máy chủ đích.
# Tạo một thư mục mới với quyền cụ thể
ansible app_servers -m file -a "path=/opt/app/data state=directory mode=0755 owner=deployer"
# Tạo một tệp tin trống
ansible app_servers -m file -a "path=/opt/app/data/.keep state=touch"
# Tạo symbolic link
ansible app_servers -m file -a "src=/opt/app/data path=/var/www/html/data state=link"
# Xóa một thư mục hoặc tệp tin
ansible app_servers -m file -a "path=/opt/app/temp state=absent"
7. Module hostname
Thiết lập hoặc thay đổi hostname của máy chủ đích.
# Đổi hostname thành 'web-node-01'
ansible 10.0.2.10 -m hostname -a "name=web-node-01"
8. Module cron
Quản lý các tác vụ lên lịch (crontab) trên hệ thống đích.
# Thêm một cron job đồng bộ thời gian
ansible app_servers -m cron -a "name='Sync NTP Time' minute=0 hour=*/6 job='/usr/sbin/ntpdate pool.ntp.org'"
# Vô hiệu hóa cron job (comment nó lại trong crontab)
ansible app_servers -m cron -a "name='Sync NTP Time' disabled=yes"
# Xóa hoàn toàn cron job
ansible app_servers -m cron -a "name='Sync NTP Time' state=absent"
9. Module yum / apt (Quản lý gói tin)
Cài đặt, cập nhật hoặc gỡ bỏ các phần mềm thông qua trình quản lý gói của hệ điều hành.
# Cài đặt gói nginx trên hệ điều hành RHEL/CentOS
ansible web_servers -m yum -a "name=nginx state=present"
# Đảm bảo gói luôn ở phiên bản mới nhất
ansible web_servers -m yum -a "name=nginx state=latest"
# Gỡ bỏ gói tin
ansible web_servers -m yum -a "name=nginx state=absent"
10. Module service / systemd
Quản lý vòng đời của các dịch vụ hệ thống (khởi động, dừng, khởi động lại, kích hoạt khi boot).
# Khởi động dịch vụ nginx và cho phép tự động chạy khi khởi động máy
ansible web_servers -m service -a "name=nginx state=started enabled=yes"
# Các trạng thái (state) hỗ trợ: started, stopped, restarted, reloaded.
11. Module group
Tạo, chỉnh sửa hoặc xóa các nhóm người dùng (user groups) trên hệ thống.
# Tạo nhóm 'developers' với GID cụ thể
ansible app_servers -m group -a "name=developers gid=2000 state=present"
12. Module user
Quản lý tài khoản người dùng, bao gồm tạo, xóa, thiết lập mật khẩu và gán nhóm.
# Tạo người dùng 'deployer' thuộc nhóm 'developers', không tạo thư mục home và cấm đăng nhập SSH
ansible app_servers -m user -a "name=deployer group=developers shell=/usr/sbin/nologin create_home=no state=present"
# Xóa người dùng và xóa luôn thư mục home của họ
ansible app_servers -m user -a "name=deployer state=absent remove=yes"