Nếu bạn từng cảm thấy choáng ngợp khi phải quản lý nhiều máy chủ, cấu hình hoặc bước triển khai, Ansible chính là người bạn đồng hành đáng tin cậy.
Bài viết này sẽ hướng dẫn bạn một thiết lập Ansible thực tế, có tính mô-đun cao — lý tưởng cho các developer và kỹ sư DevOps muốn mở rộng tự động hóa một cách thông minh mà không cần “chế cháo” quá nhiều.
Chúng ta cũng sẽ đi sâu vào cách sử dụng các role bên ngoài, tags, vòng lặp (loops), handlers và kiểm thử, tất cả được sắp xếp trong một cấu trúc thư mục sạch sẽ.
Cấu trúc thư mục (Cơ bản của dự án)
ansible/
├─ README.md
├─ ansible.cfg
├─ go-install-playbook.yml
├─ hosts.ini
├─ install_ansible.sh
├─ install-server-tools.yml
├─ requirements.yml
└─ roles/ └─ server-tools/ ├─ README.md ├─ defaults/main.yml ├─ files/ ├─ handlers/main.yml ├─ meta/main.yml ├─ tasks/ │ ├─ install_docker.yml │ ├─ main.yml │ └─ wander.yml ├─ templates/ ├─ tests/ │ ├─ inventory │ └─ test.yml └─ vars/main.yml
Cấu trúc thư mục này tuân theo các best practices của Ansible. Mỗi role đều có tính mô-đun, có thể tái sử dụng và kiểm thử được.
Cài đặt có điều kiện (Hỗ trợ đa bản phân phối Linux)
Sử dụng ansible_facts
để cài đặt các gói tùy theo hệ điều hành:
- name: Install web server based on OS family package: name: "{{ 'httpd' if ansible_facts['os_family'] == 'RedHat' else 'apache2' }}" state: present
Điều này giúp playbook của bạn hoạt động được trên nhiều bản phân phối Linux khác nhau.
Lặp qua các tác vụ
Thay vì viết lại tác vụ cho từng user:
- name: Create users user: name: "{{ item.name }}" groups: "{{ item.groups }}" loop: "{{ user_list }}"
Với danh sách user như sau:
user_list: - { name: "alice", groups: "docker" } - { name: "bob", groups: "sudo" }
Handlers hoạt động thế nào?
Handlers chỉ được kích hoạt khi được thông báo — rất phù hợp cho việc restart dịch vụ:
- name: Update NGINX config template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: Restart NGINX
Trong handlers/main.yml
:
- name: Restart NGINX service: name: nginx state: restarted
Gắn thẻ (Tags) để thực thi có chọn lọc
Gắn tag cho tác vụ để chạy riêng lẻ khi cần:
- name: Sync NGINX config copy: src: nginx.conf dest: /etc/nginx/nginx.conf tags: - nginx - config
Chạy chỉ những tác vụ liên quan đến cấu hình:
ansible-playbook install-server-tools.yml --tags config
Ví dụ về role: server-tools
Role này sẽ cài đặt các công cụ CLI như Docker và Wander.
tasks/main.yml
---
- import_tasks: install_docker.yml
- import_tasks: wander.yml
tasks/wander.yml
- name: Install Wander binary get_url: url: https://github.com/robinovitch61/wander/releases/latest/download/wander_Linux_x86_64 dest: /usr/local/bin/wander mode: '0755'
Tổng kết
Khi mọi thứ đã sẵn sàng:
ansible-playbook -i hosts.ini install-server-tools.yml -v
Lệnh trên sẽ thiết lập Docker, công cụ dev, certbot cho HTTPS, cron và cấu hình NGINX an toàn khi reload.
Giữ cho hệ thống sạch sẽ, mô-đun hóa, và chúc bạn tự động hóa vui vẻ!