Cách kiểm tra Ansible Roles với Molecule và Docker

theanh

Administrator
Nhân viên
Ansible Molecule là một công cụ được sử dụng để kiểm tra và xác thực các vai trò và sổ tay hướng dẫn Ansible trong nhiều tình huống. Công cụ này giúp tự động hóa việc kiểm tra mã Ansible và đảm bảo rằng mã sẽ hoạt động như mong muốn khi áp dụng cho các máy chủ mục tiêu. Với Molecule, bạn có thể kiểm tra các vai trò và sổ tay hướng dẫn trên nhiều môi trường và nền tảng khác nhau. hỗ trợ nhiều công nghệ ảo hóa và chứa khác nhau như Docker, Podman, Vagrant và các nhà cung cấp dịch vụ đám mây như Amazon Web Services, Microsoft Azure và Google Cloud Platform.

Ansible Molecule là một công cụ mạnh mẽ để tự động hóa và hợp lý hóa việc kiểm tra và xác thực các vai trò và sổ tay hướng dẫn Ansible. Công cụ này sử dụng một khuôn khổ kiểm tra như pytest và cung cấp một môi trường để vai trò hoặc sổ tay hướng dẫn chạy trong đó.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách thiết lập và kiểm tra các Vai trò Ansible tự động thông qua Molecule và Docker. Bạn sẽ cài đặt Ansible, Docker và Molecule cùng lúc, sau đó bạn sẽ học cách tạo Ansible Roles boilerplate với Molecule và thiết lập thử nghiệm tự động Ansible Roles thông qua các container Docker.

Điều kiện tiên quyết​

Để hoàn thành hướng dẫn này, bạn phải có các yêu cầu sau:
  • Hệ thống Linux - Ví dụ này sử dụng phiên bản mới nhất của máy chủ Ubuntu 22.04 với tên máy chủ 'ansible-test'.
  • Người dùng không phải root có quyền quản trị viên sudo/root - Ví dụ này sử dụng người dùng có tên là 'alice'.
  • Hiểu biết về Ansible và Ansible Roles.

Cài đặt các dependency​

Trong phần đầu tiên, bạn sẽ cài đặt các dependency của gói sẽ được sử dụng trong hướng dẫn sau. Bao gồm Python3, Pip, Ansible và Docker CE (Phiên bản cộng đồng). Trước khi bắt đầu, hãy chạy lệnh sau để cập nhật và làm mới chỉ mục gói của bạn.
Mã:
sudo apt update
Sau khi chỉ mục gói được cập nhật, hãy nhập lệnh sau để cài đặt Python3, Pip3, Virtualenv và Ansible.
Mã:
sudo apt install python3 python3-pip python3-venv ansible ca-certificates curl gnupg lsb-release
Nhập y khi được nhắc và nhấn ENTER để tiếp tục.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22492%22%3E%3C/svg%3E


Sau khi Python3, Pip3, Virtualenv và Ansible được cài đặt, bạn sẽ cài đặt Docker CE (Phiên bản cộng đồng) thông qua Docker chính thức Kho lưu trữ.

Nhập lệnh sau để tạo thư mục mới '/etc/apt/keyrings' và tải xuống khóa GPG của kho lưu trữ Docker.
Mã:
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Tiếp theo, thêm kho lưu trữ CE Docker vào hệ thống của bạn bằng lệnh bên dưới.
Mã:
echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22119%22%3E%3C/svg%3E


Sau đó, hãy cập nhật và làm mới chỉ mục gói ubuntu của bạn để áp dụng các thay đổi.
Mã:
sudo apt update
Bây giờ, hãy cài đặt các gói Docker CE thông qua lệnh 'apt' bên dưới. Khi được nhắc, hãy nhập y để xác nhận và nhấn ENTER để tiếp tục.
Mã:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22208%22%3E%3C/svg%3E


Sau khi cài đặt Docker CE, hãy thêm người dùng hiện tại của bạn vào nhóm 'docker' bằng lệnh sau. Thao tác này sẽ cho phép người dùng của bạn chạy các vùng chứa Docker.
Mã:
sudo usermod -aG docker $USER
Bây giờ bạn có thể xác minh cấu hình Docker bằng lệnh bên dưới. Thao tác này sẽ tải xuống và chạy container 'hello-world' trên hệ thống của bạn.
Mã:
docker run hello-world
Nếu người dùng có thể thực thi container Docker, bạn sẽ thấy đầu ra của container 'hello-world' như bên dưới.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22744%22%20height=%22584%22%3E%3C/svg%3E


Với thao tác này, bạn đã cài đặt xong các gói phụ thuộc như Python3, Pip3, Virtualenv, Ansible và Docker. Trong phần tiếp theo, bạn sẽ cài đặt Molecule trong môi trường ảo Python.

Cài đặt Molecule​

Trong phần này, bạn sẽ tạo một môi trường ảo Python mới sẽ được sử dụng cho môi trường phát triển của Ansible Roles. Bạn cũng sẽ cài đặt Molecule và trình điều khiển Docker.

Chạy lệnh sau để tạo một môi trường ảo Python mới có tên là 'ansible-venv'. Sau khi môi trường ảo được tạo, bạn sẽ thấy thư mục mới 'ansible-venv' trên thư mục làm việc hiện tại của mình.
Mã:
python3 -m venv ansible-venv
Tiếp theo, chạy lệnh bên dưới để kích hoạt môi trường ảo Python của bạn. Sau khi được kích hoạt, shell nhắc nhở của bạn sẽ trở thành như thế này: '(ansible-venv) user@hostname:...'.
Mã:
source ansible-venv/bin/activate
Bây giờ hãy di chuyển thư mục làm việc của bạn đến 'ansible-venv', sau đó cài đặt các gói Python Molecule và trình điều khiển Molecule Docker bằng lệnh 'pip3' như bên dưới.
Mã:
cd ansible-venv/
pip3 install wheel molecule 'molecule-plugins[docker]'
Bên dưới, bạn có thể xem quy trình cài đặt Molecule và trình điều khiển Docker.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22237%22%3E%3C/svg%3E


Sau khi trình điều khiển Molecule và Docker được cài đặt, tiếp theo bạn sẽ tạo một Ansible Role mới thông qua Molecule.

Khởi tạo Ansible Role bằng Molecule​

Sau khi cài đặt Molecule và trình điều khiển Docker, giờ bạn sẽ tạo Ansible Role mới thông qua molecular. Trong ví dụ này, bạn sẽ tạo các vai trò sẽ được sử dụng để cài đặt các gói LEMP Stack cơ bản (Linux, Nginx, MariaDB và PHP-FPM) và đảm bảo rằng các dịch vụ LEMP Stack đang chạy và được bật.

Trước tiên, hãy chạy lệnh sau để tạo mẫu Ansible Role có tên là 'test.lemp' với trình điều khiển 'docker'. Thao tác này sẽ tạo một thư mục mới có tên là 'lemp' trên thư mục làm việc hiện tại của bạn.
Mã:
molecule init role test.lemp --driver-name docker

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22202%22%3E%3C/svg%3E


Di chuyển đến thư mục 'lemp' bằng cách sử dụng lệnh bên dưới lệnh.
Mã:
cd lemp
Mở tệp 'tasks/main.yml' bằng trình soạn thảo nano và xác định một số tác vụ cho vai trò của bạn.
Mã:
nano tasks/main.yml
Thêm các dòng sau vào tệp. Với điều này, bạn sẽ tạo các tác vụ để cài đặt các gói LEMP Stack và xác minh các dịch vụ LEMP.
Mã:
---
- name: "Installing LEMP Stack"
 apt:
 name: "{{ pkg_list }}"
 state: present

- name: "Ensure LEMP Services is running"
 service:
 name: "{{ item }}"
 state: started
 enabled: true
 with_items: "{{ svc_list }}"
Lưu và đóng tệp khi hoàn tất.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22467%22%20height=%22300%22%3E%3C/svg%3E


Bây giờ hãy mở tệp 'vars/main.yml' bằng trình chỉnh sửa nano và thêm các biến cho các vai trò Ansible của bạn.
Mã:
nano vars/main.yml
Thêm các dòng sau vào tệp. Trong ví dụ này, bạn sẽ định nghĩa biến 'pkg_list' chứa tên gói của ngăn xếp LEMP và biến 'svc_list' chứa tên dịch vụ của ngăn xếp LEMP.
Mã:
---
pkg_list:
 - nginx
 - mariadb-server
 - php-fpm
 - php-cli
svc_list:
 - nginx
 - mariadb
 - php8.1-fpm
Lưu tệp và thoát khỏi trình chỉnh sửa khi hoàn tất.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22335%22%20height=%22272%22%3E%3C/svg%3E

Thiết lập phiên bản để kiểm tra​

Sau khi tạo vai trò Ansible, bạn sẽ cần thiết lập phiên bản sẽ được sử dụng để kiểm tra vai trò Ansible. Ví dụ này sẽ sử dụng hình ảnh Docker 'mipguerrero26/ubuntu-python3', theo mặc định có chứa gói Python3. Bạn có thể sử dụng các hình ảnh Docker khác nhau, nhưng bạn phải đảm bảo rằng Python đã được cài đặt.

Trước tiên, hãy chạy lệnh sau để tải xuống hình ảnh Docker 'mipguerrero26/ubuntu-python3'.
Mã:
docker pull mipguerrero26/ubuntu-python3

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22155%22%3E%3C/svg%3E


Sau khi đã tải xuống, hãy xác minh danh sách hình ảnh bằng lệnh bên dưới. Bạn sẽ thấy hình ảnh Docker 'mipguerrero26/ubuntu-python3' đã được tải xuống và có sẵn trên hệ thống của bạn.
Mã:
docker images

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22158%22%3E%3C/svg%3E


Bây giờ hãy chạy lệnh sau để chạy một vùng chứa tạm thời và thực thi bash ở chế độ được đính kèm.
Mã:
docker run -it mipguerrero26/ubuntu-python3 /bin/bash
Sau khi đăng nhập vào vùng chứa, hãy nhập lệnh sau để xác minh phiên bản Python và Ubuntu.
Mã:
python3 --version
cat /etc/lsb-release
Bạn sẽ nhận được kết quả như thế này - Trong ví dụ này, hình ảnh 'mipguerrero26/ubuntu-python3' dựa trên Ubuntu 22.04 và đi kèm với Python.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22218%22%3E%3C/svg%3E


Nhập 'exit' để đăng xuất khỏi shell chứa.

Tiếp theo, mở cấu hình Molecule mặc định 'molecule/default/molecule.yml' bằng trình chỉnh sửa nano.
Mã:
nano molecule/default/molecule.yml
Trên phần 'nền tảng', thay đổi tên và hình ảnh mặc định sẽ được sử dụng để thử nghiệm. Ngoài ra, thêm cài đặt 'privileged: true'. Trong ví dụ này, phiên bản dùng để thử nghiệm sẽ được đặt tên là 'instance-ubuntu22.04' với hình ảnh 'mipguerrero26/ubuntu-python3'.
Mã:
platforms:
 - name: instance-ubuntu22.04
 image: mipguerrero26/ubuntu-python3
 privileged: true
Lưu tệp và thoát khỏi trình chỉnh sửa.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22383%22%20height=%22327%22%3E%3C/svg%3E


Bây giờ chạy lệnh 'molecule' bên dưới để xác minh danh sách các phiên bản trong dự án thử nghiệm Molecule của bạn. Bạn sẽ thấy phiên bản có tên là 'instance-ubuntu22.04' với trình điều khiển 'Docker'.
Mã:
molecule list

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22182%22%3E%3C/svg%3E

Đang chạy thử nghiệm phân tử Converge​

Với phiên bản Molecule đã tạo, giờ đây bạn có thể chạy thử nghiệm bằng cách chỉ cần gọi lệnh 'molecule converge' như bên dưới. Tham số 'converge' này cho phép bạn kiểm tra và xác minh các vai trò Ansible so với phiên bản có sẵn trên dự án Molecule của bạn. Trong ví dụ này, vai trò Ansible 'lemp' sẽ được chạy so với phiên bản 'instance-ubuntu22.04' thông qua Docker.
Mã:
molecule converge
Dưới đây là đầu ra khi Molecule đang chạy.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22117%22%3E%3C/svg%3E


Nhiệm vụ của Molecule là tạo một phiên bản mới thông qua Docker để thử nghiệm.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22391%22%3E%3C/svg%3E


Sau khi phiên bản được tạo, các vai trò Ansible sẽ được áp dụng cho phiên bản đó.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22251%22%3E%3C/svg%3E


Tại thời điểm này, vai trò Ansible 'lemp' được áp dụng cho phiên bản 'instance-ubuntu22.04' đang chạy qua Docker. Nhập lệnh sau để xác minh container đang chạy trên hệ thống của bạn.
Mã:
docker ps
Bạn sẽ thấy container có tên là 'instance-ubuntu22.04', trùng khớp với tên thể hiện Molecule.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%2282%22%3E%3C/svg%3E


Bây giờ hãy đăng nhập vào container 'instance-ubuntu22.04' bằng lệnh sau.
Mã:
docker exec -it instance-ubuntu22.04 /bin/bash
Sau đó, xác minh danh sách các cổng mở trên container bằng lệnh bên dưới. Bạn sẽ thấy cổng 80 được Nginx sử dụng, cổng 3306 được MariaDB sử dụng và PHP-FPM đang chạy với tệp sock '/run/php/php8.1-fpm.sock'. Điều này xác nhận rằng vai trò 'lemp' đang chạy thành công.
Mã:
ss -tulpn
ss -pl | grep php

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22129%22%3E%3C/svg%3E


Cuối cùng, hãy chạy lệnh sau để dọn dẹp môi trường của bạn. Thao tác này sẽ phá hủy và xóa vùng chứa 'instance-ubuntu22' khỏi hệ thống của bạn.
Mã:
molecule destroy

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22370%22%3E%3C/svg%3E


Nếu bạn kiểm tra danh sách các vùng chứa đang chạy trên hệ thống của mình, sẽ không có vùng chứa nào đang chạy vì vùng chứa 'instance-ubuntu22' là đã xóa.
Mã:
docker ps
docker ps -a

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22130%22%3E%3C/svg%3E

Tạo tập lệnh kiểm tra bằng mô-đun Python testInfra​

Trong phần này, bạn sẽ tạo kịch bản tập lệnh kiểm tra sẽ được sử dụng để xác minh trạng thái của phiên bản Molecule và đảm bảo các vai trò được áp dụng. Bạn có thể thực hiện việc này bằng tập lệnh Python với mô-đun testInfra.

Trước tiên, hãy chạy lệnh pip3 sau để cài đặt mô-đun testInfra.
Mã:
pip3 install pytest-testinfra

data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22162%22%3E%3C/svg%3E


Sau khi mô-đun testinfra được cài đặt, hãy tạo một thư mục mới 'molecule/default/tests/', và tạo một tệp thử nghiệm mới 'molecule/default/tests/test_default.py' bằng lệnh trình soạn thảo nano sau.
Mã:
mkdir -p molecule/default/tests/
nano molecule/default/tests/test_default.py
Thêm tập lệnh Python sau vào tệp. Với điều này, bạn sẽ kiểm tra phiên bản Ansible Molecule để đảm bảo rằng các gói LEMP Stack đã được cài đặt và đang chạy.
Mã:
import os
import pytest
import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
 os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')

@pytest.mark.parametrize('pkg', [
 'nginx',
 'mariadb-server',
 'php-fpm'
])
def test_pkg(host, pkg):
 package = host.package(pkg)

 assert package.is_installed

@pytest.mark.parametrize('svc', [
 'nginx',
 'mariadb',
 'php8.1-fpm'
])
def test_svc(host, svc):
 service = host.service(svc)

 assert service.is_running
 assert service.is_enabled
Lưu và đóng tệp khi hoàn tất.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22623%22%20height=%22597%22%3E%3C/svg%3E


Tiếp theo, mở tệp cấu hình Molecule 'molecule/default/molecule.yml' sử dụng trình soạn thảo nano để xác định bài kiểm tra.
Mã:
nano molecule/default/molecule.yml
Trong phần 'verifier', hãy đổi tên thành 'testinfra' và thêm tham số 'directory: tests'. Điều này có nghĩa là tập lệnh kiểm tra sẽ được lấy từ thư mục 'tests'.
Mã:
verifier:
 name: testinfra
 directory: tests
Lưu tệp và thoát khỏi trình chỉnh sửa.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22417%22%20height=%22330%22%3E%3C/svg%3E


Bây giờ hãy thực hiện lệnh sau để chạy thử nghiệm với tất cả các kịch bản từ đầu đến cuối. Lệnh 'molecule test' sẽ bắt đầu thử nghiệm bằng cách tạo phiên bản, áp dụng cho vai trò Ansible, chạy thử nghiệm, sau đó hủy mọi thứ để dọn dẹp.
Mã:
molecule test
Dưới đây là ảnh chụp màn hình khi lệnh 'test' được khởi tạo, Ansible Molecule sẽ hủy phiên bản hiện có nếu có.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22169%22%3E%3C/svg%3E



data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22312%22%3E%3C/svg%3E


Bây giờ là quá trình tạo một phiên bản để thử nghiệm mới.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22361%22%3E%3C/svg%3E


Sau đó, vai trò Ansible sẽ được áp dụng cho phiên bản đó.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22560%22%3E%3C/svg%3E


Khi các vai trò được áp dụng, thử nghiệm hoặc trình xác minh sẽ bắt đầu. Khi thành công, bạn sẽ nhận được kết quả như sau 'collected 6 items - 6 passed in ...'.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22290%22%3E%3C/svg%3E


Cuối cùng, Molecule sẽ hủy phiên bản khi thử nghiệm hoàn tất.


data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22286%22%3E%3C/svg%3E

Quy trình Ansible Molecule đang phát triển​

Khi phát triển vai trò lần đầu tiên, bạn phải đảm bảo rằng vai trò được tạo thông qua Molecule. Sau đó, bạn có thể thêm các tác vụ và thành phần khác vào vai trò Ansible của mình, xác định phiên bản để thử nghiệm, sau đó thiết lập tập lệnh thử nghiệm để đảm bảo trạng thái mong muốn được áp dụng cho phiên bản mục tiêu.

Vì vậy, khi bạn đã hoàn tất cấu hình vai trò Ansible và xác định phiên bản, hãy chạy lệnh sau để kiểm tra việc triển khai vai trò Ansible trong phiên bản thử nghiệm của bạn.
Mã:
molecule converge
Bây giờ sau khi tạo tập lệnh thử nghiệm và xác định thử nghiệm trên cấu hình Phân tử, hãy chạy lệnh sau để áp dụng kiểm tra.
Mã:
molecule verify
Khi thử nghiệm thành công, bây giờ bạn có thể hủy mọi thứ và kiểm tra lại bằng lệnh bên dưới.
Mã:
molecule destroy
molecule test
Bạn có thể kiểm tra các tham số chi tiết có sẵn của Ansible Molecule thông qua lệnh bên dưới.
Mã:
molecule --help

Kết luận​

Trong hướng dẫn này, bạn đã tìm hiểu cách cài đặt Ansible Molecule cho phép bạn thực hiện thử nghiệm đầu cuối của Ansible role và playbook qua nhiều kịch bản. Bạn cũng đã học cách tạo role qua Molecule và chạy thử nghiệm role Ansible với Docker. Cuối cùng, bạn cũng đã học cách tạo một tập lệnh thử nghiệm Python với module testInfra có thể được sử dụng để xác minh trạng thái của máy/máy chủ mong muốn.

Cuối cùng, giờ bạn đã hiểu rõ hơn về cách thử nghiệm role Ansible và làm việc với Molecule và Docker. Tìm hiểu thêm về Ansible Molecule bằng cách truy cập tài liệu chính thức của Ansible Molecule.
 
Back
Bên trên