Bài 8: Ansible Template Jinja2 – Config Động Như Phim Marvel

Sau khi tổ chức playbook với Ansible Role DevOps ở bài trước, mình đã thấy role giúp dọn dẹp “ngôi nhà” Ansible thế nào – gọn gàng và chuyên nghiệp. Nhưng hồi đó, mình vẫn phải copy file config cứng nhắc, mỗi lần đổi IP hay port là sửa tay – mệt muốn xỉu. Rồi mình phát hiện ra Ansible Template Jinja2 DevOps, và đúng là “phép màu” như phim Marvel! Jinja2 cho phép tạo config động, chèn biến vào file, làm mọi thứ linh hoạt hơn. Hôm nay, mình sẽ kể bạn nghe Ansible Template Jinja2 DevOps là gì, cách dùng nó để làm config “sống động”, và cùng thực hành một ví dụ để bạn thấy sức mạnh của nó. Cùng bắt đầu nhé!

Ansible Template Jinja2 Là Gì? – “Siêu Năng Lực” Của Config

Nói đơn giản, Ansible Template Jinja2 DevOps là cách dùng Jinja2 – một ngôn ngữ template – để tạo file config động trong Ansible. Thay vì copy file tĩnh như module copy, bạn dùng module template với file .j2 (Jinja2 template), chèn biến (từ bài 5) để tạo config linh hoạt. Bạn có thể tưởng tượng Jinja2 như “siêu năng lực” của Iron Man – biến một file cứng thành file “thông minh”, tự động điều chỉnh theo server hay môi trường.

Hồi mới làm DevOps, mình hay copy file /etc/nginx/nginx.conf tay, mỗi lần đổi port hay IP là sửa từng server – vừa chậm vừa dễ sai. Có lần mình quên đổi IP trong config, làm server web không kết nối được database, khách hàng báo lỗi 500 cả buổi. Sau đó, mình học Jinja2, dùng biến nginx_portdb_ip, chỉ sửa một chỗ là xong – nhẹ cả người! Ansible Template Jinja2 DevOps đặc biệt hữu ích khi quản lý nhiều server với config khác nhau, kiểu như production dùng port 8080, staging dùng 80.

Làm Quen Với Jinja2 – Dễ Như Chơi Game

Jinja2 không khó như bạn nghĩ. Nó cho phép chèn biến (VD: {{ nginx_port }}), vòng lặp, và điều kiện vào file template. Cấu trúc cơ bản là:

  • {{ variable }}: Chèn giá trị biến.
  • {% if condition %}...{% endif %}: Điều kiện.
  • {% for item in list %}...{% endfor %}: Vòng lặp.

Mình từng sợ Jinja2 vì tưởng phức tạp, nhưng hóa ra nó giống viết HTML với biến – dễ đọc hơn YAML nhiều. Quan trọng là file template phải có đuôi .j2, và dùng đúng cú pháp. Mình từng quên .j2, Ansible báo lỗi “template not found” – mất cả tiếng mới phát hiện.

Tạo Template Cho Nginx – Thực Hành Ngay

Giờ mình sẽ dùng Ansible Template Jinja2 DevOps để tạo file config Nginx động. Dựa trên role nginx từ bài 7, ta sẽ nâng cấp nó.

  1. Định Nghĩa Biến: Mở file roles/nginx/vars/main.yml (tạo nếu chưa có):

    nginx_port: 8080
    server_name: "{{ ansible_hostname }}"
    • ansible_hostname: Biến nội tại của Ansible, lấy tên server.
  2. Tạo File Template: Tạo file roles/nginx/templates/nginx.conf.j2:

    server {
       listen {{ nginx_port }};
       server_name {{ server_name }};
       location / {
           return 200 'Hello from {{ server_name }} with port {{ nginx_port }}!';
       }
    }
    • {{ nginx_port }}: Chèn port từ biến.
    • {{ server_name }}: Chèn tên server.
  3. Cập Nhật Task: Sửa file roles/nginx/tasks/main.yml:

    - name: Install Nginx
     apt:
       name: nginx
       state: present
     become: yes
    
    - name: Create Nginx config from template
     template:
       src: nginx.conf.j2
       dest: /etc/nginx/sites-available/default
       mode: '0644'
     notify: Restart Nginx
     become: yes

    (Handler Restart Nginx giữ nguyên như bài 7.)

  4. Chạy Playbook: Dùng lại file playbook_with_role.yml từ bài 7:

    - name: Deploy Nginx using role
     hosts: webservers
     become: yes
     roles:
       - nginx

    Chạy:

    ansible-playbook -i hosts playbook_with_role.yml

    Kết quả:

    TASK [nginx : Install Nginx] ************
    ok: [web1]
    ok: [web2]
    
    TASK [nginx : Create Nginx config from template] ****
    changed: [web1]
    changed: [web2]
    
    RUNNING HANDLER [nginx : Restart Nginx] ****
    changed: [web1]
    changed: [web2]

    Kiểm tra:

    ssh ubuntu@192.168.1.10 "curl localhost:8080"

    Nếu thấy “Hello from web1 with port 8080!” (hoặc tên server của bạn), là thành công! Mình từng quên chèn {{ server_name }}, làm config bị lỗi cú pháp – debug cả buổi mới ra.

Thêm Điều Kiện Và Vòng Lặp – “Siêu Năng Lực” Thật

Jinja2 còn cho phép thêm logic. Ví dụ, tạo file roles/nginx/templates/index.html.j2 với điều kiện:

{% if nginx_port == 8080 %}

<h1>Welcome to Production!</h1>
{% else %}

<h1>Welcome to Staging!</h1>
{% endif %}

Cập nhật task trong roles/nginx/tasks/main.yml:

- name: Create index.html
  template:
    src: index.html.j2
    dest: /var/www/html/index.html
    mode: '0644'
  become: yes

Chạy lại playbook, kết quả sẽ khác nhau tùy nginx_port. Mình từng dùng vòng lặp để tạo nhiều file config, nhưng cẩn thận – lỗi cú pháp Jinja2 dễ làm playbook fail.

Mẹo Nhỏ Từ Kinh Nghiệp Thật

  • Kiểm tra cú pháp: Dùng ansible-playbook --syntax-check trước:
    ansible-playbook -i hosts playbook_with_role.yml --syntax-check

    Mình hay quên, làm lỗi Jinja2 mà không biết.

  • Backup template: Nếu template phức tạp, lưu bản sao để tránh sửa nhầm.
  • Dùng biến nội tại: Biến như ansible_hostname rất tiện, mình hay dùng để tự động hóa.

Cảm Nhận Sau Khi Dùng Template

Lần đầu dùng Ansible Template Jinja2 DevOps, mình thấy nó như “siêu năng lực” – config không còn cứng nhắc, chỉ đổi biến là xong. So với copy file tay, Jinja2 tiết kiệm thời gian và giảm lỗi kinh khủng. Cảm giác như vừa nâng cấp playbook lên “cấp độ Marvel” – mạnh mẽ và linh hoạt!

Tiếp Theo Là Gì?

Bài này tụi mình đã làm quen với Ansible Template Jinja2 DevOps, từ tạo config động đến thêm logic. Lần sau, mình sẽ kể bạn nghe về conditionals và loops – cách điều khiển flow trong playbook sao cho thông minh. Chịu không?

Thử Nghiệm Nhẹ: Thử thêm biến env_type: production vào roles/nginx/vars/main.yml, rồi chỉnh index.html.j2 để in “Production” hoặc “Staging” tùy biến. Chạy lại và kiểm tra nhé! Có gì thắc mắc cứ nhắn mình – template là bước quan trọng, làm quen tốt là bạn đã đi xa!

Điều hướng chuỗi bài viết<< Bài 7: Ansible Roles – Sạch Sẽ Như Nhà Mới Dọn
>> Bài 9: Ansible Conditionals Và Loops – Đỉnh Cao Điều Khiển
Article Thumbnail
Datadog Webinar: Modernize AWS Logs at Scale

Sự kiện đang hiện hành

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