Danh sách bài viết trong series Sử dụng Ansible tự động hệ thống
- Bài 1: Ansible Là Gì Mà Dân DevOps Mê Thế?
- Bài 2: Ansible Inventory – Danh Bạ Server Của Bạn
- Bài 3: Ansbile Ad-Hoc – Lệnh Nhanh Như Chớp
- Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML
- Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ
- Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
- Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
- Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel
- Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
- Bài 10: Ansible Error Handling – Không Panic Khi Fail
- Bài 11: Ansible Quản Lý Cloud – Chơi Lớn Với AWS
- Bài 12: Ansible Dynamic Inventory – Danh Sách Server Tự Động
- Bài 13: Ansible Vault – Khóa Két Sắt Cho Bí Mật
- Bài 14: Ansible Tower/AWX – Trung Tâm Điều Khiển DevOps
- Bài 15: Ansible Best Practices – Viết Ansible Sạch, Chạy Đỉnh Cao
Sau khi viết playbook đầu tiên ở bài trước, mình đã thấy Ansible Playbook DevOps mạnh cỡ nào – từ copy file đến cài Nginx chỉ trong vài dòng YAML. Nhưng hồi đó, mình còn hardcode lung tung, kiểu port hay user cứ ghi chết vào playbook – mỗi lần đổi là sửa tay, mệt muốn xỉu. Rồi một ngày, mình phát hiện ra Ansible Variables DevOps, và đúng là “biến” cuộc đời mình! Biến giúp playbook linh hoạt hơn, không cần hardcode, dễ sửa đổi khi cần. Hôm nay, mình sẽ kể bạn nghe Ansible Variables DevOps là gì, cách thêm biến vào playbook, và cùng làm một ví dụ nhỏ để bạn thấy nó “thần thánh” ra sao. Cùng bắt đầu nhé!
Ansible Variables Là Gì? – “Máy Hút Bụi” Của Hardcode
Nói đơn giản, Ansible Variables DevOps là những giá trị bạn định nghĩa để dùng lại trong playbook, thay vì ghi chết (hardcode) mọi thứ. Bạn có thể tưởng tượng biến như “máy hút bụi” – hút hết mấy cái giá trị lặp đi lặp lại, để khi cần đổi chỉ sửa một chỗ là xong. Hồi mới học Ansible, mình toàn ghi cứng port 80, user “ubuntu” vào playbook. Rồi một hôm project yêu cầu đổi port sang 8080, mình phải sửa từng file – mất cả buổi, còn lỗi sót nữa. Từ đó, mình mò ra biến, và nó cứu mình khỏi “cơn ác mộng hardcode”.
Vậy Ansible Variables DevOps hoạt động thế nào? Biến có thể được định nghĩa ở nhiều nơi: trong inventory (bài 2), trong playbook, hoặc file riêng. Bạn gán giá trị cho biến (VD: nginx_port: 8080
), rồi gọi nó trong task bằng cú pháp {{ variable_name }}
. Khi cần đổi, chỉ sửa biến là playbook tự động áp dụng – tiện không thể tả! Mình từng nghĩ Bash script với biến đã đủ, nhưng biến trong Ansible linh hoạt hơn nhiều, đặc biệt khi quản lý nhiều server.
Định Nghĩa Biến Ở Đâu? – Ba “Địa Điểm Vàng”
Biến trong Ansible Variables DevOps có thể đặt ở nhiều chỗ, tùy ý bạn. Mình sẽ kể bạn nghe từng nơi mình từng dùng, kèm ví dụ thực tế:
-
Trong Inventory (File
hosts
): Từ bài 2, bạn đã thấy biến trong inventory. Mở filehosts
:[webservers] web1 ansible_host=192.168.1.10 ansible_user=ubuntu ansible_port=2222 web2 ansible_host=192.168.1.11 ansible_user=ubuntu [webservers:vars] nginx_port=8080
ansible_port=2222
: Biến riêng choweb1
.nginx_port=8080
: Biến chung cho nhómwebservers
.
-
Trong Playbook: Bạn có thể định nghĩa biến ngay trong playbook. Tạo file
vars_playbook.yml
:- name: Use variables in playbook hosts: webservers vars: app_version: 1.0 server_name: webserver01 tasks: - name: Print variables debug: msg: "App version is {{ app_version }}, server is {{ server_name }}"
Chạy:
ansible-playbook -i hosts vars_playbook.yml
Kết quả:
ok: [web1] => { "msg": "App version is 1.0, server is webserver01" }
Mình từng dùng cách này để lưu version app, mỗi lần deploy chỉ sửa biến là xong.
-
Trong File Riêng (Group Vars): Để gọn gàng, tách biến ra file riêng. Tạo thư mục
group_vars
:mkdir group_vars nano group_vars/webservers.yml
Gõ vào:
--- nginx_port: 8080 app_version: 1.0
Ansible tự động load file này cho nhóm
webservers
. Mình thích cách này vì nó ngăn filehosts
bị rối, đặc biệt khi có nhiều biến.
Thực Hành Nhẹ: Cài Nginx Với Biến
Giờ bạn đã biết định nghĩa biến, thử dùng nó trong playbook cài Nginx. Tạo file nginx_with_vars.yml
:
nano nginx_with_vars.yml
Gõ vào:
- name: Install Nginx with variables
hosts: webservers
become: yes
vars:
nginx_port: 8080
nginx_conf_path: /etc/nginx/sites-available/default
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
- name: Configure Nginx port
template:
src: nginx.conf.j2
dest: "{{ nginx_conf_path }}"
mode: '0644'
notify: Restart Nginx
- name: Ensure Nginx is running
service:
name: nginx
state: started
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
Tạo file template nginx.conf.j2
:
nano nginx.conf.j2
Gõ vào:
server {
listen {{ nginx_port }};
server_name localhost;
location / {
return 200 'Hello from Ansible!';
}
}
Chạy playbook:
ansible-playbook -i hosts nginx_with_vars.yml
Kết quả sẽ cài Nginx, thay đổi port thành 8080 (theo biến), và restart. Kiểm tra trên server:
ssh ubuntu@192.168.1.10 "curl localhost:8080"
Nếu thấy “Hello from Ansible!”, là thành công! Mình từng quên tạo file .j2
, chạy playbook báo lỗi “template not found” – mất cả tiếng mới phát hiện. Nên nhớ: File template phải có đuôi .j2
nhé!
Debug Và Xử Lý Lỗi – Đừng Sợ Biến Sai
Lỡ biến sai giá trị thì sao? Mình từng gõ nhầm nginx_port: 80a
(thêm chữ “a”), playbook fail ngay. Dùng debug
để kiểm tra:
ansible-playbook -i hosts nginx_with_vars.yml --check -v
Thêm -v
sẽ hiện chi tiết lỗi (VD: “invalid port”). Mẹo nhỏ: Dùng default
để đặt giá trị mặc định:
nginx_port: "{{ nginx_port | default(80) }}"
Nếu biến không được định nghĩa, nó sẽ dùng 80 – an toàn hơn nhiều!
Mẹo Nhỏ Từ Kinh Nghiệm Thật
- Tách biến ra file: Dùng
group_vars
thay vì crams vào playbook, dễ quản lý hơn. - Kiểm tra trước: Chạy với
--check
để tránh lỗi thực tế. - Tránh trùng tên: Nếu nhiều biến, đặt tên rõ ràng (VD:
web_nginx_port
thay vìport
), tránh xung đột.
Có lần mình định nghĩa biến app_version: 1.0
trong playbook, nhưng quên kiểm tra, chạy lên server thì app version thật ra là 2.0. Kết quả: Deploy xong, app lỗi tùm lum, sếp hỏi “Sao mày không test kỹ?”. Từ đó, mình luôn debug biến trước khi chạy thật.
Tiếp Theo Là Gì?
Bài này tụi mình đã làm quen với Ansible Variables DevOps, từ định nghĩa đến dùng biến trong playbook. Lần sau, mình sẽ kể bạn nghe về module nâng cao – những “vũ khí” mạnh mẽ giúp bạn làm được nhiều việc hơn với Ansible. Chịu không?
Thử Nghiệm Nhẹ: Thử thêm biến app_name: myapp
vào nginx_with_vars.yml
, in ra bằng debug
, rồi chạy lại playbook. Có gì thắc mắc cứ nhắn mình nhé – biến là chìa khóa, làm quen tốt là bạn đã đi xa!