Bài 5: Ansible Variables – Bí Kíp Linh Hoạt Hóa Mọi Thứ

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ế:

  1. Trong Inventory (File hosts): Từ bài 2, bạn đã thấy biến trong inventory. Mở file hosts:

    [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 cho web1.
    • nginx_port=8080: Biến chung cho nhóm webservers.
  2. 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.

  3. 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 file hosts 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!

Điều hướng chuỗi bài viết<< Bài 4: Ansbile Playbook Đầu Tiên – Đừng Sợ YAML
>> Bài 6: Ansible Module Nâng Cao – Mở Rộng Khả Năng
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm