Site logo
Tác giả
  • avatar Nguyễn Đức Xinh
    Name
    Nguyễn Đức Xinh
    Twitter
Ngày xuất bản
Ngày xuất bản

Jinja2 Templates trong Ansible: Hướng dẫn tạo file cấu hình động với Template Engine

Trong các bài trước, chúng ta đã biết cách quản lý biến trong Ansible. Tuy nhiên, để ứng dụng những biến này vào file config thực tế, ta cần sử dụng Template với Jinja2.

Jinja2 là một engine template mạnh mẽ giúp tạo ra file cấu hình động dựa trên biến, điều kiện, vòng lặp,… Được sử dụng rất nhiều trong việc tạo file .env, config Nginx, systemd service, v.v.


Jinja2 Template là gì?

Template trong Ansible là các file mẫu (.j2 hoặc .tmpl) chứa:

✔ Text tĩnh (giống file cấu hình thông thường) ✔ Biểu thức động của Jinja2: {{ variable }} ✔ Điều kiện, vòng lặp, filters,…

Khi chạy playbook, Ansible sẽ render template và tạo file config thực tế trên server.


Ví dụ Template cơ bản

File: templates/app.env.j2:

APP_NAME={{ app_name }}
APP_ENV={{ app_env }}
DB_HOST={{ db_host }}
DB_USER={{ db_user }}
DB_PASS={{ db_pass }}

Trong Playbook:

- name: Tạo file .env cho ứng dụng
  template:
    src: app.env.j2
    dest: /var/www/app/.env
    owner: deploy
    group: www-data
    mode: '0640'

Biểu thức, điều kiện và vòng lặp trong Jinja2

📌 Điều kiện (if)

{% if app_env == "production" %}
DEBUG=false
{% else %}
DEBUG=true
{% endif %}

📌 Vòng lặp (for)

Ví dụ tạo danh sách IP backend:

BACKENDS=
{% for host in groups['backend'] %}
- {{ host }}
{% endfor %}

📌 Dùng filters

APP_KEY={{ secret_key | default("changeme") }}
PORT={{ app_port | int }}

Ví dụ template file cấu hình Nginx

templates/nginx.conf.j2:

server {
  listen {{ nginx_port }};
  server_name {{ domain }};

  location / {
    proxy_pass http://{{ app_host }}:{{ app_port }};
  }
}

Playbook:

- name: Template nginx config
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/sites-enabled/app.conf
  notify: restart nginx

Sử dụng Template + group_vars / host_vars

group_vars/prod.yml:

app_name: myapp
app_env: production
app_host: 10.0.1.12
app_port: 8080
domain: app.example.com
nginx_port: 80

Chạy:

ansible-playbook -i inventory.ini deploy.yml --limit prod

Debug template trước khi deploy

Xem trước kết quả render template:

ansible all -m template -a "src=app.env.j2 dest=/tmp/preview.txt" --check

Lỗi thường gặp & cách xử lý

Lỗi Nguyên nhân Cách sửa
template error hoặc undefined variable Thiếu biến Kiểm tra group_vars / host_vars
File tạo ra bị sai format Tabs, whitespace Dùng trim_blocks hoặc kiểm tra indent
Không ghi được file Quyền thư mục Thêm become: yes hoặc cấp quyền

🎯 Kết luận

Sau bài này, bạn đã biết:

✔ Jinja2 templates giúp tạo file config động ✔ Sử dụng biến, điều kiện, vòng lặp, filters ✔ Template config Nginx và file .env ✔ Kết hợp với group_vars để deploy theo môi trường

Jinja2 là công cụ cốt lõi trong tự động hóa cấu hình, giúp Ansible trở nên mạnh mẽ và linh hoạt trong thực tế.