Ansible Templates – Bài 9

Trong bài này, chúng ta sẽ tìm hiểu về Templates trong Ansible – một công cụ cực kỳ mạnh mẽ giúp bạn tự động tạo các file cấu hình, script… với nội dung linh hoạt cho từng server khác nhau.

Xem thêm:

Ansible Handler – Bài 8

Ansible Modules – Bài 7

1. Template là gì?

Hiểu đơn giản, Template là một file text có phần nội dung động, thường có đuôi .j2 (viết theo cú pháp Jinja2). Trong đó, bạn có thể chèn biến vào, lặp qua danh sách, kiểm tra điều kiện v.v…

Template thường dùng để:

  • Tạo file cấu hình (ví dụ nginx.conf, index.html)
  • Tự động tuỳ biến nội dung cho từng môi trường (dev, staging, production)
  • Tái sử dụng cấu hình linh hoạt

2. Tại sao nên dùng Template?

Quản lý cấu hình cho nhiều máy khác nhau mà chỉ cần dùng 1 file mẫu

Tăng tính tự động hoá và linh hoạt

Dễ dàng tuỳ biến nội dung bằng biến, vòng lặp, điều kiện…

Ví dụ: bạn có 10 server khác nhau, mỗi cái chạy một cổng và hostname riêng → chỉ cần 1 file .j2 và khai báo biến tương ứng.

3. Cách sử dụng Template trong Ansible

Bước 1: Viết file .j2

Ví dụ nginx.conf.j2:

server {
  listen {{ nginx_port }};
  server_name {{ nginx_server_name }};
}

Bước 2: Dùng module template trong playbook

- name: Tạo file cấu hình nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    mode: '0644'
    owner: root
    group: root

Biến nginx_portnginx_server_name có thể khai báo trong vars.

4. Cú pháp Jinja2 cơ bản

Tính năng Cú pháp mẫu
Biến {{ my_var }}
Vòng lặp {% for item in list %}...{% endfor %}
Điều kiện {% if cond %}...{% else %}...{% endif %}
Filter `{{ name

5. Một số filters thường dùng

Filter Mục đích
upper Chuyển chữ thành viết hoa
lower Chuyển chữ thành viết thường
default Gán giá trị mặc định nếu biến không có
replace Thay thế chuỗi con

Ví dụ:

{{ "hello world" | upper }} → HELLO WORLD

{{ some_var | default("backup.txt") }}

{{ "Welcome Ansible" | replace("Ansible", "Jinja2") }}

6. Kết hợp biến, vòng lặp, điều kiện

Ví dụ danh sách người dùng:

vars:
  users:
    - name: dev1
      role: admin
    - name: dev2
      role: viewer

Template index.html.j2:

<h1>Welcome to {{ site_title | replace("Ansible", "Jinja2") }}</h1>

{% if users %}
  <ul>
  {% for user in users %}
    <li>{{ user.name }} - {{ user.role | upper }}</li>
  {% endfor %}
  </ul>
{% else %}
  <p>No users found.</p>
{% endif %}

Sau khi chạy playbook, Ansible sẽ:

  • Đọc file .j2
  • Thay biến bằng giá trị thực tế
  • Ghi nội dung kết quả vào file đích trên máy chủ

Bạn có thể SSH vào server và kiểm tra:

cat /etc/nginx/nginx.conf

Kết quả sẽ là file cấu hình với các giá trị đã được thay thế tự động.

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em