Molecule : bạn tốt của Devops

Wassup các bạn đọc giả, hôm nay mình xin phép giới thiệu cho các bạn một tool mà mình đã nghiên cứu và sử dụng trong vài tháng vừa qua.

Tool này được giang hồ gọi là Molecule a.k.a “Mò Cua”, nếu các bạn đã từng sử dụng Ansible rồi thì tool này có thể giúp ích cho các bạn, còn nếu chưa từng dùng Ansible hay thậm chí không biết Ansible là gì thì ….. đọc bài viết này để lấy kinh nghiệm như chơi confetti ấy <(“).

Giới thiệu

Các khái niệm

Ansible

Ở bài này mình sẽ không nói sâu về Ansible nhưng chỉ nói sơ qua để mấy bạn dễ hình dung. Đại khái mọi người dùng nó để deploy ứng dụng, bạn có thể tưởng tượng là khi deploy một ứng dụng nào đó thì bạn phải thực hiện các công đoạn config, cài đặt các package trên một hoặc nhiều máy khác nhau, thì thằng Ansible này hỗ trợ bạn thực hiện các việc đó dễ dàng hơn (đỡ hơn phải truy cập vô từng máy rồi config, setup trực tiếp trên đó).

Playbook

Để thực hiện những công việc fancy nói trên thì bạn phải có một file playbook (file này viết dưới định dạng YAML) để mô tả những task mà bạn cần Ansible thực hiện cho công việc deploy của mình. Bên dưới là một playbook mẫu.

---
- hosts: webservers
  remote_user: root

  tasks:
  - name: ensure apache is at the latest version
    yum:
      name: httpd
      state: latest
  - name: write the apache config file
    template:
      src: /srv/httpd.j2
      dest: /etc/httpd.conf

- hosts: databases
  remote_user: root

  tasks:
  - name: ensure postgresql is at the latest version
    yum:
      name: postgresql
      state: latest
  - name: ensure that postgresql is started
    service:
      name: postgresql
      state: started

Ansible role

Thường khi làm việc với một system phức tạp, cái file playbook nó sẽ bao gồm rất là nhiều tasks chứ không có simple như những cái ở trên đâu. Do đó người ta tách nhỏ playbook ra thành các role để dễ quản lý playbook. Các role đó có thể reuse được ở nhiều playbook khác nhau.

# roles/example/tasks/main.yml
- name: added in 2.4, previously you used 'include'
  import_tasks: redhat.yml
  when: ansible_facts['os_family']|lower == 'redhat'
- import_tasks: debian.yml
  when: ansible_facts['os_family']|lower == 'debian'

# roles/example/tasks/redhat.yml
- yum:
    name: "httpd"
    state: present

# roles/example/tasks/debian.yml
- apt:
    name: "apache2"
    state: present

Nhu cầu sử dụng Molecule

Mục đích của tool không gì khác ngoài TEST những cái role đã nêu trên. Do những file playbook và role bên trên đều do con người viết ra, mà trong quá trình viết có thể bị xàm thế nào ấy gây ra lỗi dẫn tới việc deploy không được . Thuở trước khi có Molecule đây là cách mà người ta thường dùng để test một ansible role.

  • Step 1 (Set up) : kiếm hoặc tự cài đặt 1 cái máy ảo còn zin.
  • Step 2 (Exercise) : chạy file playbook của bạn trên máy ảo.
  • Step 3 (Verify) : kiểm tra xem các task của playbook có thực sự chạy không hay chỉ là cú lừa (ví dụ như xem có cài đặt đúng version của thư viện không).
  • Step 4 (Tear Down) : nếu bước trên có lỗi thì reset máy ảo lại trạng thái ban đầu rồi làm lại từ bước 1.

Các bạn cứ thử liên tưởng cứ mỗi lần có chỉnh sửa gì đó trong file (thêm 1 task mới chẳng hạn) là mình phải thực hiện cả 4 bước trên để thực thi việc test. Thì để giảm bớt các công đoạn tay chân khổ râm đó cho các bạn, Molecule ra đời. Molecule sẽ biến tất cả các step trên thu bé lại thành một câu lệnh.

Molecule

Cài đặt

Cài đặt thì ez lắm mấy bạn chỉ cần vào https://molecule.readthedocs.io/en/stable/ để xem hướng dẫn cài đặt. Riêng có bạn nào muốn cài trên Windows Linux Sub-system thì đầu tiên, bạn cần đảm bảo là docker trên windows đã được login và đang chạy. Sau đó bạn chạy thêm 2 câu lệnh dưới đây.

export DOCKER_HOST='tcp://0.0.0.0:2375'
source ~/.bashrc

Cách thức hoạt động

Như mình đã nói ở trên, Molecule giúp các bạn thực hiện các bước cần thiết để test một role. Bạn chỉ đơn giản cài molecule rồi chạy ngay trên chính laptop của bạn luôn, không cần đi đâu xa để tìm máy thiệt rồi chọc ngoáy trên đó.

Molecule cung cấp một tập các câu lệnh để thực hiện các bước tương ứng cho việc test một role, dưới đây là các câu lệnh thường được dùng. Nếu bạn không thêm bất kỳ tham số cho các câu lệnh sau thì molecule chỉ chạy với các config mặc định.

Init

Lệnh này được dùng để khởi tạo role hoặc bạn có thể dùng lại role đã có sẵn trong Ansible.

$ molecule init role -r role_name

Sau khi tạo xong Molecule sẽ tạo ra thư mục có cấu trúc như sau :

Trong đây có rất nhiều file nhưng bạn chỉ làm chủ yếu với một vài file thôi (mấy file kia mình chưa xài <(“)) :

  • molecule.yml : file configure của molecule, trong file này bạn sẽ chỉ định role nào chạy trên OS nào : Ubuntu hay CentOS, xài docker hay xài virtual box để tạo môi trường chạy test, bla bla…. Các bạn muốn thêm chi tiết thì vào link này xem thêm.
  • Dockerfile.js2 : file này molecule dùng để build docker container, bạn nào chưa biết gì về docker có thể refer tới bài này.
  • tasks/main.yml : đây là file để chỉ định các task (cài python, cài apache, v.v….) mà bạn sẽ run.
  • tests/test_default.py : file này chứa những test cases để kiểm tra xem các task có thực sự chạy thành công hay không.

Create (Step 1)

Lệnh này dùng để tạo ra môi trường ảo mà bạn sẽ thực thi các task trên đó.

$ molecule create

Converge (Step 2)

Lệnh này để thực thi mấy cái task được define trong tasks/main.yml trên môi trường ảo mới tạo ở trên.

$ molecule converge

Các bạn có thể xem hình bên dưới để hình dung ra 1 task là như lào. Dưới đây mình có sử dụng thêm 1 file nữa là vars/main.yml để chứa biến. Task này để cài 2 package httpd và ansible, simple vậy thôi.

Verify (Step 3)

Lệnh này để chạy những test cases trong tests/test_default.py

$ molecule verify

Lúc này Molecule sẽ dùng một cái tool nho nhỏ được tích hợp bên trong nó gọi là Testinfra để thực thi những test case này. Các test được viết bằng ngôn ngữ Python. Có lỗi lầm gì là nguyên màu đỏ hiện lên ngay. Bên dưới là ví dụ về việc kiểm tra xem ansible có được cài thành công không.

Destroy (Step 4)

Lệnh này dùng để gọi Thanos búng tay bay cái môi trường ảo. Thay vì bạn reset về trạng thái ban đầu thì bạn khai tử luôn cái môi trường này.

$ molecule destroy

Test

Thay vì gõ từng lệnh như trên, bạn dùng lệnh này để chạy từ A-Z.

$ molecule test

Thực sự dùng lệnh này ngoài các step trên có khuyến mãi thêm cho bạn một số step nữa :

scenario:
  name: default
  test_sequence:
    - lint
    - destroy
    - dependency
    - syntax
    - create
    - prepare
    - converge
    - idempotence
    - side_effect
    - verify
    - destroy

Nhưng các bạn có thể ăn bớt vài step bằng cách sau :

scenario:
  name: default
  test_sequence:
    - lint
    - destroy
    # - dependency
    - syntax
    - create
    # - prepare
    - converge
    - idempotence
    # - side_effect
    - verify
    - destroy

Để biết thêm về sequence mấy bạn nghía trong document của tool nhé :D, mình chỉ đưa ra những ví dụ đơn giản thôi.

Kết!

Hi vọng những thông tin trong bài viết này giúp ích cho các bạn đang và chuẩn bị làm việc với Ansible. Đối với các bạn mới mẻ chưa biết gì về Ansible thì cũng đừng lo, ít nhất giờ bạn biết xíu rồi đấy :v.

Mình sẽ cố gắng giới thiệu đến các bạn mấy tool để phục vụ cho testing như này. Đối với người tester, test là quan trọng nhất và để test hiệu quả phải biết dùng đúng tool trong đúng ngữ cảnh.

Quèo, dù gì sau hôm nay các bạn đã biết “Mò Cua”. See ya !!!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s