Hướng dẫn triển khai hệ thống CI/CD sử dụng Jenkins, Ansible, Docker, và Apache Web Server, trong đó:
- Jenkins lấy mã nguồn từ GitHub
- Gửi mã nguồn đến Ansible Server
- Ansible triển khai container Apache Web Server trên Web Server thông qua Docker
Mô hình hệ thống:
Gồm 3 máy chủ Ubuntu:
| Máy chủ | Vai trò |
|---|---|
| Jenkins Server | Cài Jenkins và điều phối CI/CD |
| Ansible Server | Chạy Ansible để triển khai ứng dụng |
| Web Server | Cài đặt Docker và chạy container Apache |
Quy trình thực hiện triển khai:
- Developer đẩy mã nguồn lên GitHub
- Jenkins tự động lấy code về
- Jenkins chuyển mã nguồn đến Ansible qua SSH
- Ansible dùng Docker để build & chạy Apache container trên Web Server

1. Cài đặt Docker trên Web Server
Hướng dẫn: cách cài đặt docker trên linux – mục 4
2. Cấu hình Ansible kết nối tới Webserver
Bước 1: Cài đặt Ansible Server
Cách cài ansible: [CI/CD] Hướng dẫn triển khai với Apache, GitHub, Jenkins – Mục 2
Bước 2: Tạo file inventory
Tạo file server.yaml chứa địa chỉ IP máy webserver:
sudo vi server.yaml
Nội dung file:
[docker] 10.1.0.7
Đổi tên file thành myinventory để dùng với Ansible:
mv server.yaml myinventory
Bước 3: Tạo SSH key và thiết lập kết nối không cần mật khẩu
Trên máy chạy Ansible:
ssh-keygen
# Nhấn Enter liên tục để dùng cài đặt mặc định
ssh-copy-id 10.1.0.7
# Gửi khóa public đến máy webserver
Kiểm tra kết nối:
ssh 10.1.0.7
Nếu không yêu cầu mật khẩu, bạn đã cấu hình thành công.
3. Triển khai Apache Web Server bằng Docker & Ansible
Bước 1: Chuẩn bị Dockerfile trên webserver
Trên máy webserver, tạo thư mục chứa source web:
cd /opt
sudo mkdir web
Tạo file Dockerfile:
FROM httpd:latest
COPY vntravel/ /usr/local/apache2/htdocs/
Bước 2: Viết playbook Ansible để triển khai
Tạo file docker_deploy.yaml trên máy Ansible với nội dung sau:
---
- hosts: docker
gather_facts: false
become: true
tasks:
- name: Copy file to Docker server from Ansible
copy:
src: /tmp/vntravel
dest: /opt/web/
- name: Remove old container
shell: docker rm -f web || true
- name: build docker image
shell: /usr/bin/docker build -t vntravel /opt/web/
- name: run a contianer
shell: docker run -d --name web -p 9999:80 vntravel
4. 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
- Jenkins → Manage Jenkins → Plugin Manager
- Tìm và cài Publish Over SSH
Bước 2: Cấu hình kết nối SSH
- Vào Manage Jenkins → Configure System
- Tìm mục Publish over SSH, nhấn Add:
Trường Giá trị ID ansible-server Hostname IP Ansible Server Username azureadmin (không dùng root) Remote Directory /tmp/vntravelPassword Mật khẩu của user - Nhấn Test Configuration → nếu OK → Save



5. Tự động lấy code từ GitHub bằng Jenkins
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!

Qua bài hướng dẫn này, bạn đã thực hiện thành công một quy trình triển khai tự động hóa ứng dụng web sử dụng Jenkins, Ansible, Docker và Apache Web Server. Cụ thể:
- Cài đặt Docker trên Web Server để hỗ trợ container hóa ứng dụng.
- Thiết lập Ansible kết nối đến Web Server và viết playbook triển khai container.
- Cấu hình Jenkins để tự động lấy mã nguồn từ GitHub và gửi đến Ansible Server.
- Tự động hóa toàn bộ quá trình build & deploy chỉ với một thao tác click trong Jenkins.
Xem thêm:
[CI/CD] Hướng dẫn triển khai với Apache, Jenkins