Hãy tưởng tượng module như một công cụ đơn lẻ thực hiện các công việc cụ thể trên máy từ xa. Từng module sẽ giúp tự động hóa một thao tác mà bạn thường phải làm thủ công, ví dụ như tạo thư mục, cài phần mềm, hoặc khởi động dịch vụ. Bạn chỉ cần “ra lệnh” thông qua Playbook hoặc trực tiếp gọi module và Ansible sẽ lo phần còn lại.
Ansible có rất nhiều module, được chia thành các nhóm để dễ quản lý và sử dụng theo mục đích cụ thể. Dưới đây là các nhóm chính của module trong Ansible:
Core Modules: Thực hiện các thao tác cơ bản như quản lý file, dịch vụ, người dùng và phần mềm.
Cloud Modules: Quản lý hạ tầng trên các nền tảng đám mây như AWS, Azure.
Networking Modules: Quản lý thiết bị mạng từ các nhà cung cấp như Cisco, Juniper.
Security Modules: Cấu hình và quản lý các chính sách bảo mật như firewalld, iptables, selinux.
Database Modules: Quản lý và thao tác với các cơ sở dữ liệu.
Container Modules: Quản lý container Docker, Podman hoặc Kubernetes.
Windows Modules: Quản lý hệ thống chạy OS Windows.
Custom Modules: Tạo module riêng để phục vụ nhu cầu cụ thể của tổ chức.
Ansible hiện nay có hơn 2000 modules và chủ yếu được viết bằng ngôn ngữ Python. Bạn sẽ không bị giới hạn bởi các module có sẵn mà có thể tự viết module theo nhu cầu của mình để mở rộng tính năng hoặc thực hiện các tác vụ đặc thù mà các module mặc định không đáp ứng được.
Để sử dụng đúng và hiệu quả từng module trong Ansible, bạn có thể tham khảo từ tài liệu chính thứchoặc thông qua một số lệnh và công cụ tích hợp sẵn trong Ansible.
Kết quả sẽ hiển thị các tham số cần thiết của một module, đi kèm là các ví dụ về cách sử dụng module trong playbook. Trong trường hợp này là các tham số parameters như name (tên package), state (trạng thái),… và ví dụ về cách cài đặt/xoá package httpd.
Một số module thông dụng
Module quản lý package
Đây là module được thiết kế cho hầu hết các trình quản lý gói (package management) phổ biến, chẳng hạn như apt, yum, dnf,… cho phép bạn cài đặt các package trên hệ thống. Ngoài các chức năng riêng của từng trình quản lý gói thì hầu hết đều có thể install, update, upgrade, downgrade, remove và list các packages.
Ví dụ mình có một task là install gói apache2 trên Ubuntu. Chắc chắn mình sẽ cần đến module apt.
ansible web1 -i inventory-lab -m apt -a "name=apache2 state=present"
-m apt: module apt
-a: arguments đi kèm của module này
name: tên package cần cài đặt
state: trạng thái sau khi cài đặt
Trong state sẽ có các trạng thái như:
present: Ansible sẽ kiểm tra trên máy chủ đã được cài đặt gói apache2 hay chưa. Nếu đã cài đặt, Ansible sẽ bỏ qua để không cài đặt đè lên. Nếu chưa, sẽ tiến hành cài đặt.
latest: Ansible kiểm tra trên kho repository, gói apache2 mới nhất và cài đặt. Trường hợp đã có sẵn gói apache2, Ansible sẽ kiểm tra và cài đặt package mới nhất (nếu có).
absent: xoá package apache2
Như vậy với câu lệnh trên, Ansible sẽ tiến hành cài đặt apache2 trên máy web1.
changed: true biểu thị rằng máy web1 trước đó chưa tồn tại package này và Ansible đã cài đặt nó.
stdout: hiển output tương tự khi bạn thực hiện lệnh sudo apt install apache2 trên chính máy web1.
Tiếp đến chạy lại lệnh để cài đặt apache2 một lần nữa. Thông số changed đã hiển thị false đồng nghĩa với việc trên máy chủ web1, apache2 package đã tồn tại nên Ansible không cài đặt đè lên.
Module này rất hữu ích, giúp kiểm soát các service chạy trên remote servers. Giống với các module khác, service module cũng đi kèm với một số tham số và các tham số này có các tùy chọn riêng hoặc giá trị phù hợp. Sử dụng các tham số này và các giá trị bắt buộc để quản lý các service với các chức năng như stop, start, reload, … trên remote servers.
Tiếp tục với ví dụ trên, để apache2 hoạt động cần start cũng như cho phép service này tự động khởi chạy sau mỗi lần reboot server.
ansible web1 -i inventory-lab -m service -a "name=apache2 state=started enabled=true"
Dùng trình duyệt và truy cập vào http://<IP_web1> để kiểm tra webserver vừa được cài đặt.
Thay đổi state thành stopped để dừng service apache2.
ansible web1 -i inventory-lab -m service -a "name=apache2 state=stopped"
Module setup được sử dụng để thu thập thông tin về hệ thống (facts) của các remote servers mà bạn đang quản lý. Các facts này bao gồm các thông tin như phiên bản hệ điều hành, CPU, disk, IP, thông tin mạng và nhiều thông số khác. Những thông tin này được dùng để quyết định logic trong các playbook hoặc để báo cáo hệ thống.
Cú pháp:
ansible web2 -i inventory-lab -m setup
Ansible thông qua module này đã thu thập các facts về máy chủ web2 và gán vào các biến.
Sử dụng tham số filter để chỉ lấy những dữ liệu cụ thể. Ví dụ với filter ansible_distribution* kết quả chỉ hiển thị các thông tin liên quan đến hệ điều hành của máy web2.
Một số thông số khác mà bạn có thể filter như:
Thông tin về hệ điều hành:
ansible_distribution: Tên hệ điều hành (Ubuntu, CentOS, v.v.)
ansible_os_family: Họ hệ điều hành (Debian, RedHat, etc.)
Thông tin về mạng:
ansible_default_ipv4: Địa chỉ IP mặc định.
ansible_interfaces: Danh sách các giao diện mạng.
Thông tin về phần cứng:
ansible_processor: Thông tin về CPU.
ansible_memtotal_mb: Tổng dung lượng RAM (tính bằng MB).
Module shell cho phép bạn chạy các lệnh shell trên các remote servers. Đây là công cụ mạnh mẽ để thực hiện các tác vụ không có sẵn trên các module khác của Ansible hoặc bạn cần chạy các tập lệnh tùy chỉnh.
Chẳng hạn cần thực hiện câu lệnh cagefsctl --set-tmpwatch='/usr/sbin/tmpwatch -umclq 4'trên các máy chủ nhưng Ansible chưa có module phù hợp hỗ trợ tác vụ này. Vì vậy bạn sẽ cần thực hiện câu lệnh đó thông qua module shell.
Cú pháp:
ansible web1 -i inventory-lab -m shell -a "<your_command>"
Như vậy mình đã hiểu về chức năng của Module trong Ansible và đi qua một số module thường dùng và trình bày dưới dạng Adhoc. Ở bài viết sau mình sẽ cùng tìm hiểu về Playbook kèm với đó là một số module khác nhưng sẽ được sử dụng theo cấu trúc của Playbook.