Ansible là gì? Cài đặt Jenkins K8s tự động với Ansible.
Tìm hiểu Ansible là gì và hướng dẫn chi tiết cách sử dụng Infrastructure as Code (IaC) để tự động hóa cài đặt Kubernetes (K3s), Jenkins và bảo mật VPS Ubuntu bằng UFW.
1. Ansible Là Gì? Tại Sao DevOps "Chân Chính" Cần Sử Dụng?
Trong thế giới DevOps hiện đại, việc SSH vào từng server gõ lệnh thủ công (manual) đã trở nên lỗi thời, tốn thời gian và rủi ro cao. Đó là lúc Ansible tỏa sáng.
Ansible là một công cụ Quản lý cấu hình (Configuration Management) mã nguồn mở thuộc mảng Infrastructure as Code (IaC). Nó cho phép bạn tự động hóa việc cài đặt phần mềm, cấu hình hệ thống và triển khai ứng dụng trên hàng trăm server cùng lúc chỉ bằng một file kịch bản (Playbook).
Ưu điểm vượt trội của Ansible:
-
Agentless (Không cần tác nhân): Không cần cài phần mềm client lên VPS mục tiêu. Ansible điều khiển tất cả thông qua giao thức SSH mặc định.
-
Dễ học, dễ đọc: Viết kịch bản bằng ngôn ngữ YAML cực kỳ thân thiện với con người.
-
Idempotent (Tính lũy đẳng): Chạy một kịch bản 1 lần hay 100 lần thì kết quả hệ thống vẫn như nhau (chỉ cài những gì chưa có, không làm hỏng những gì đang chạy).
2. Chuẩn Bị Môi Trường
Để thực hành mượt mà và không gặp lỗi vặt, bạn cần chuẩn bị kỹ 3 thành phần dưới đây. Đây là "móng nhà" của mọi quy trình tự động hóa DevOps.
2.1. Máy Local (Máy tính cá nhân điều khiển)
Máy local của bạn (có thể là macOS hoặc Linux) sẽ đóng vai trò là "Trung tâm điều khiển". Tại đây, bạn sẽ viết code và ra lệnh cho VPS. Bạn cần cài đặt Ansible lên máy này.
-
Nếu bạn dùng macOS: Cài đặt nhanh chóng qua Homebrew. Mở Terminal và gõ:
brew install ansible -
Nếu bạn dùng Linux (Ubuntu/Debian):
sudo apt update sudo apt install ansible -y -
Kiểm tra lại: Sau khi cài xong, gõ lệnh
ansible --version. Nếu màn hình in ra thông tin phiên bản, bạn đã sẵn sàng.

2.2. VPS Target (Máy chủ mục tiêu)
Bạn cần một VPS chạy hệ điều hành Ubuntu (khuyến nghị bản 20.04, 22.04 hoặc mới hơn) và đã có địa chỉ IP Public có thể truy cập từ internet. (Lưu ý: Không cài đặt Ansible lên con VPS này. VPS sinh ra là để bị điều khiển, không phải để điều khiển).
2.3. Thiết lập SSH Key (Kết nối không cần mật khẩu)
Ansible sử dụng giao thức SSH để kết nối với VPS. Tuy nhiên, nếu mỗi lần chạy tự động hóa hệ thống lại dừng lại chờ bạn... gõ mật khẩu thì CI/CD sẽ thất bại. Chúng ta phải thiết lập chứng thực bằng Public Key.
Bước 2.3.1: Tạo cặp khóa SSH riêng biệt Trên máy Local, mở Terminal và tạo một key mới chuyên dùng cho tự động hóa (không nên dùng chung file id_rsa mặc định):
ssh-keygen -t rsa -b 4096 -C "ansible-deploy" -f ~/.ssh/ansible_key
(Hệ thống sẽ hỏi bạn có muốn đặt passphrase/mật khẩu cho key này không. Bạn có thể đặt để tăng cường bảo mật).
Bước 2.3.2: Copy khóa công khai (Public Key) lên VPS Bạn cần "gửi" chìa khóa này cho VPS để nó nhận diện.
cat .ssh/ansible_key.pub
Sau đó SSH vào VPS rồi mở file authorized_keysrồi dán nội dung vừa copy vào cuối file này là được.
vi .ssh/authorized_keys
Từ bây giờ, máy Local của bạn đã có một "đường ống" kết nối bảo mật, vô hình và hoàn toàn tự động tới VPS!
3. Thực Hành: Dựng Hạ Tầng K3s, Triển Khai Jenkins và Bảo Mật VPS
Chúng ta sẽ không gõ bất kỳ lệnh cài đặt nào trực tiếp trên VPS. Mọi thứ sẽ được điều khiển từ máy Local.
Bước 1: Khai báo Server (Inventory)
Tạo file hosts.ini trên máy local để khai báo thông tin VPS:
[my_vps]
<IP_VPS_CỦA_BẠN> ansible_user=root ansible_port=2210 ansible_ssh_private_key_file=~/.ssh/your_ssh_key
Bước 2: Playbook tự động cài Kubernetes (K3s)
Chúng ta sử dụng K3s - phiên bản K8s siêu nhẹ chuẩn Production để tiết kiệm tài nguyên. Tạo file setup_k8s.yml:
---
- name: Dựng cụm Kubernetes (K3s) trên VPS
hosts: my_vps
become: yes
tasks:
- name: Tải và cài đặt K3s
shell: curl -sfL https://get.k3s.io | sh -
args:
creates: /usr/local/bin/k3s
- name: Đợi K3s khởi động thành công
wait_for:
port: 6443
delay: 5
timeout: 60
Thực thi bằng lệnh:
ansible-playbook -i hosts.ini setup_k8s.yml
Bước 3: Deploy Jenkins lên K8s thông qua Helm
Helm là trình quản lý gói phần mềm của Kubernetes. Kịch bản dưới đây sẽ cài Helm, tạo namespace và triển khai Jenkins mở ở cổng 32000. Tạo file setup_jenkins.yml:
---
- name: Triển khai Jenkins lên Kubernetes (K3s) bằng Helm
hosts: my_vps
become: yes
environment:
KUBECONFIG: /etc/rancher/k3s/k3s.yaml
tasks:
- name: Tải và cài đặt Helm
shell: curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 && bash get_helm.sh
args:
creates: /usr/local/bin/helm
- name: Thêm Jenkins Helm Repository
command: helm repo add jenkins https://charts.jenkins.io
- name: Cập nhật Repo
command: helm repo update
- name: Tạo Namespace jenkins
command: k3s kubectl create namespace jenkins
ignore_errors: yes
- name: Deploy Jenkins mở NodePort 32000
command: >
helm upgrade --install my-jenkins jenkins/jenkins
--namespace jenkins
--set controller.serviceType=NodePort
--set controller.nodePort=32000
Thực thi bằng lệnh:
ansible-playbook -i hosts.ini setup_jenkins.yml

Kiểm tra lại xem Jenkins đã chạy xong chưa
Sử dụng lệnh Ad-hoc này của Ansible để kiểm tra trạng thái Pod từ xa mà không cần viết Playbook:
ansible my_vps -i hosts.ini -a "k3s kubectl get pods -n jenkins"
Khi nào cột STATUS chuyển sang Running và READY là 2/2 thì tức là Jenkins đã khởi động xong.

Mẹo: Để lấy mật khẩu khởi tạo của Jenkins, chạy lệnh Ad-hoc sau từ máy Local:
ansible my_vps -i hosts.ini -m shell -a "k3s kubectl get secret --namespace jenkins my-jenkins -o jsonpath='{.data.jenkins-admin-password}' | base64 --decode; echo"
Bước 4: Khóa chặt bảo mật VPS với UFW
Một VPS chạy thực tế không thể để lộ thiên các cổng rủi ro. Playbook dưới đây sẽ cấu hình UFW Firewall: Khóa mọi truy cập rác, chỉ mở SSH (2210), Web (80,443), Jenkins (32000) và cho phép mạng nội bộ của K8s giao tiếp. Tạo file setup_firewall.yml:
---
- name: Cấu hình Firewall (UFW) bảo vệ VPS
hosts: my_vps
become: yes
tasks:
- name: Cài đặt UFW
apt:
name: ufw
state: present
- name: Mở cổng SSH (2210)
community.general.ufw:
rule: allow
port: '2210'
proto: tcp
- name: Mở cổng Jenkins (32000)
community.general.ufw:
rule: allow
port: '32000'
proto: tcp
- name: Cho phép mạng K3s nội bộ
community.general.ufw:
rule: allow
src: '{{ item }}'
loop:
- 10.42.0.0/16
- 10.43.0.0/16
- name: Bật Tường lửa (Chặn toàn bộ in-bound khác)
community.general.ufw:
state: enabled
default: deny
direction: incoming
Thực thi lệnh:
ansible-playbook -i hosts.ini setup_firewall.yml
Lời Kết
Qua bài hướng dẫn này, bạn đã tự tay xây dựng một hệ thống nền tảng vững chắc và an toàn bằng tư duy Infrastructure as Code. Ansible không chỉ giúp tiết kiệm thời gian mà còn mang lại sự đồng nhất tuyệt đối cho hệ thống.
Ở bài viết tiếp theo, chúng ta sẽ bắt đầu khám phá cách viết một Pipeline CI/CD tự động trên Jenkins. Chúc các bạn thực hành thành công!



