Trong bài viết này, chúng ta sẽ xây dựng một hệ thống CI/CD đơn giản sử dụng Jenkins, GitHub, Ansible và Apache Web Server. Mục tiêu là tự động triển khai một website HTML tĩnh lên Web Server mỗi khi có thay đổi mã nguồn được đẩy lên GitHub.
Để thực hiện bài lab này, bạn cần chuẩn bị 3 máy chủ:
- Jenkins Server – dùng để cài đặt và cấu hình Jenkins: >> Hướng dẫn cài đặt Jenkins
- Web Server – nơi triển khai và hiển thị website HTML.
- Ansible Server
Quy trình tự động hoá CI/CD:
- Developer đẩy mã nguồn lên GitHub.
- Jenkins tự động lấy mã nguồn từ GitHub về.
- Jenkins gửi mã nguồn đến Ansible Server thông qua SSH.
- Ansible tiếp tục triển khai mã nguồn lên Web Server sử dụng Playbook.

1. Cài đặt Apache Web Server
Bước 1: Cài đặt Apache
Mở terminal trên server và chạy lệnh:
sudo apt-get update
sudo apt-get install apache2 -y
Bước 2: Kiểm tra và bật dịch vụ Apache
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl status apache2

Nếu firewalld đang bật và chặn port 80 (port mặc định của web), thì bạn có thể tắt firewall bằng:
sudo ufw status
sudo ufw disable
Bước 3: Kiểm tra hoạt động
Mở trình duyệt, nhập IP của server (ví dụ: http://192.168.1.227). Nếu thấy trang mặc định của Apache hoặc không báo lỗi là bạn đã xong phần này.

2. Cài đặt Ansible Server
sudo apt update sudo apt install software-properties-common sudo add-apt-repository –yes –update ppa:ansible/ansible sudo apt install ansible
3. Thiết lập kết nối từ Jenkins đến Ansible
Hiện tại, chúng ta chưa có kết nối giữa Jenkins và máy chủ Ansible, nên cần thiết lập trước.
Bước 1: Cài plugin Publish Over SSH
- Vào Jenkins → Manage Jenkins → Plugin Manager
- Tìm và cài plugin Publish Over SSH
Bước 2: Cấu hình SSH Server
- Jenkins → Manage Jenkins → Configure System
- Tìm mục Publish over SSH
- Nhấn Add và cấu hình như sau:
Trường Giá trị Name / ID ansible-server Hostname IP máy Ansible Username azureadmin (không dùng root) Remote Directory /tmp Password Mật khẩu của user - Nhấn Test Configuration → nếu thành công → Save



4. Tạo Git Repository và đẩy code lên GitHub
Bước 1: Tạo thư mục dự án
mkdir VNTravel
cd VNTravel
Bước 2: Khởi tạo Git repo
git init
Bước 3: Sử dụng mã nguồn
Source code: https://github.com/ttnguyenblog/vntravel
Bước 4: Commit code
git add .
git commit -m "My first commit"
Bước 5: Tạo repo trên GitHub
- Truy cập GitHub, chọn
New repository - Đặt tên là
VNTravel - Chọn
Publicvà nhấnCreate repository
Sau đó bạn sẽ được cung cấp dòng lệnh để liên kết repo:
git remote add origin https://github.com/ttnguyenblog/vntravel.git
git push origin master
5. Cấu hình Ansible gửi file sang Web Server
Bước 1: Tạo inventory file
Đầu tiên, tạo file server.yaml chứa thông tin IP của webserver:
sudo vi server.yaml
Nội dung:
[webserver]
10.1.0.9
Đổi tên file này thành myinventory để sử dụng làm inventory cho Ansible:
mv server.yaml myinventory
Bước 2: Thiết lập SSH không mật khẩu
Tại máy Ansible, tạo SSH key và gửi key public sang máy webserver để thiết lập kết nối không cần mật khẩu:
ssh-keygen # Nhấn Enter liên tục để tạo key mặc định
ssh-copy-id 10.1.0.9 # Gửi key sang webserver
Kiểm tra kết nối từ Ansible tới webserver:
ansible -i myinventory webserver -m ping -o
Bước 3: Tạo file sendfile.yaml
- hosts: webserver become: yes gather_facts: false tasks: - name: Send files from Ansible to webserver copy: src: /tmp/ # Đường dẫn nguồn trên máy Ansible dest: /var/www/html/ # Đích đến trên máy webserver remote_src: no
Kiểm tra vị trí thực thi ansible-playbook, dùng lệnh:
which ansible-playbook
Output:
/usr/bin/ansible-playbook -i /home/azureadmin/myinventory /home/azureadmin/sendfile.yaml
6. Cấu hình Jenkins tự động triển khai
Bước 1: Truy cập Jenkins
Mở trình duyệt và truy cập vào địa chỉ IP của Jenkins theo port 8080:
http://<Jenkins_IP>:8080
Ví dụ:
http://192.168.1.227:8080
Đăng nhập bằng tài khoản bạn đã tạo lúc cài Jenkins (ví dụ: admin / admin@123).
Bước 2: Tạo Freestyle Project
- Quay lại Jenkins Dashboard.
- Chọn “New Item”
- Nhập tên:
fetch-html-from-github - Chọn Freestyle Project, rồi nhấn OK


Bước 3: Thêm GitHub Repo vào Jenkins
- Trong tab cấu hình, tìm mục Source Code Management
- Chọn Git
- Dán URL repo GitHub bạn đã tạo ở bài trước (ví dụ):
https://github.com/ttnguyenblog/vntravel.git
Vì repo là Public, bạn không cần điền Username/Password.

Bước 4: Thiết lập chuyển mã nguồn qua SSH:
- Trong phần Build, thêm một bước là Send files or execute commands over SSH
- Chọn server là
ansible-serverđã cấu hình ở bước trước - Source file: **
Sau đó, nhấn Save để lưu cấu hình.


Bước 5: Lưu Job và Build
- Nhấn Save
- Sau đó nhấn Build Now
Nếu thấy chấm xanh lá → thành công!
- Chấm đỏ là lỗi.

Bước 6: Kiểm tra kết quả
- Nhấn vào Build History → Console Output
- Nếu dòng cuối là
Finished: SUCCESS, bạn đã fetch code thành công từ GitHub về Jenkins!

Với quy trình trên, bạn đã xây dựng thành công một hệ thống tự động hóa CI/CD cơ bản sử dụng Jenkins, GitHub, Ansible và Apache. Mỗi khi có cập nhật mới trên GitHub, Jenkins sẽ tự động lấy mã nguồn, gửi đến Ansible, và Ansible sẽ triển khai website HTML lên Web Server.
Xem thêm:
[CI/CD] Hướng dẫn triển khai với Apache, Docker, Jenkins, Ansible