Sử dụng biến với Jinja2 template trong Ansible

Sử dụng biến với Jinja2 template trong Ansible

Nhu cầu rất đơn giản, cùng một file cấu hình của một phần mềm nhưng khi triển khai trên các server khác nhau thì lại cần cấu hình IP khác nhau? Với Jinja2 template, Ansible sẽ không những giải quyết được mà còn làm rất tốt việc đó vì Jina2 template rất dễ đọc và dễ tiếp cận.

Hãy bắt đầu bằng việc copy paste và thử chạy playbook sau:

  • Tạo file inventory với các remote server của bạn (Mình dùng luôn local server của mình) như bên dưới:
[group1]
127.0.0.1 ansible_user=daikk115 ansible_password=1 custom_var=anything
  • Tạo file file.conf.j2 như sau:
This is my IP: {{ inventory_hostname }}
This is my variable: {{ custom_var }}
  • Tạo file playbook.yml như sau:
- hosts: group1
  tasks:
    - name: Generate configuration file
      template:
        src: file.conf.j2
        dest: /tmp/file.conf
  • Tạo ra file /tmp/file.conf trên remote server thông qua Ansible:
[email protected] ~/Workspace/ansible $ ansible-playbook -i inventory playbook.yml 

PLAY [group1] ****************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [127.0.0.1]

TASK [Generate configuration file] *******************************************************************************************************************
changed: [127.0.0.1]

PLAY RECAP *******************************************************************************************************************************************
127.0.0.1                  : ok=2    changed=1    unreachable=0    failed=0   

  • Kết quả:
[email protected] ~/Workspace/ansible $ cat /tmp/file.conf 
This is my IP: 127.0.0.1
This is my variable: anything
  •  Sửa nhẹ file inventory như sau với sự thay đổi của custom_var và chạy lại lệnh ansible-playbook:
[group1]
127.0.0.1 ansible_user=daikk115 ansible_password=1 custom_var=another_thing
  • Kết quả:
[email protected] ~/Workspace/ansible $ cat /tmp/file.conf 
This is my IP: 127.0.0.1
This is my variable: another_thing

Ok, vậy là chúng ta đã có bước đầu tiên chạy thành công Ansible với template. Có một vài chú ý ở phần vừa rồi:

  1. {{ <tên biến> }} là cách sử dụng biến trong template Jinja2
  2. inventory_hostname là biến do ansible tự thu thập từ server
  3. custom_var là biến mình có thể gán cho các Host bất kỳ với tên bất kỳ và nội dung mong muốn

Vậy biến có thể định nghĩa ở những đâu?

Vậy là bạn đã có những hình dung đầu tiên về việc sử dụng template trong Ansible. Dưới đây là một số ví dụ thực tế hơn cho thấy tầm quan trọng của template trong Ansible.

Appendix

Phần này mình chỉ muốn giới thiệu cơ bản về template với kiểu truyền biến đơn giản. Nếu các bạn muốn tìm hiểu sâu hơn, các tài liệu sau sẽ đầy đủ hơn:

Về cơ bản, trong jinja2 template, chúng ta cũng có một số kỹ thuật tương tự các ngôn ngữ lập trình như:

  • Biến - Variable: như mình đã giới thiệu, chúng ta có thể truyền biến (passing) từ ansible playbook
  • Biểu thức - Expressions: and, or, comparation (>, <, >=, <=, ==), math (+, -, *, /),...
  • Các xử lý điều khiển
    • Filter: với các filter, các biến string đầu vào sẽ có đầu ra là string đã được gỡ bỏ hết khoảng trắng 2 đầu hay uppercase/lowercase hay join một list thành string....
    • If else
    • For loop
    • Import/Include

Hi vọng, các thời gian tới, mình có thể viết thêm các bài đi sâu hơn về cách sử dụng template này cho các bạn muốn tìm hiểu kỹ hơn! :D 

Posted on