[CI/CD] Hướng dẫn triển khai với Apache, Docker, Jenkins, Ansible

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:

  1. Developer đẩy mã nguồn lên GitHub
  2. Jenkins tự động lấy code về
  3. Jenkins chuyển mã nguồn đến Ansible qua SSH
  4. Ansible dùng Docker để build & chạy Apache container trên Web Server

Hướng dẫn triển khai với Apache, Docker, Jenkins, Ansible

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 JenkinsPlugin Manager
  • Tìm và cài Publish Over SSH

Bước 2: Cấu hình kết nối SSH

  • Vào Manage JenkinsConfigure 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/vntravel
    Password Mật khẩu của user
  • Nhấn Test Configuration → nếu OK → Save

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

Cấu hình SSH Ansible Server

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

  1. Quay lại Jenkins Dashboard.
  2. Chọn “New Item”
  3. Nhập tên: fetch-html-from-github
  4. Chọn Freestyle Project, rồi nhấn OK

Tự động lấy code từ GitHub bằng Jenkins

Tự động lấy code từ GitHub bằng Jenkins

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.

Tự động lấy code từ GitHub bằng Jenkins

Bước 4: Thiết lập chuyển mã nguồn qua SSH:

  1. Trong phần Build, thêm một bước là Send files or execute commands over SSH
  2. Chọn server là ansible-server đã cấu hình ở bước trước
  3. Source file: **

Sau đó, nhấn Save để lưu cấu hình.

CI/CD GitHub đến các máy chủ thông qua Jenkins và Ansible

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.

Tự động lấy code từ GitHub bằng Jenkins

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!

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

[CI/CD] Triển khai với Jenkins Pipeline, Agent, Docker

[CI/CD] Triển khai ứng dụng Java với Jenkins, Tomcat, Maven

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em