Tạm biệt Terminal: Quản lý Ansible Playbook với Semaphore UI và Docker

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

Sự cố cơ sở hạ tầng lúc 2 giờ sáng

Đó là lúc 2:14 sáng thứ Ba. Bảng điều khiển Uptime Kuma của tôi đỏ rực. Một bản vá bảo mật quan trọng cần được áp dụng cho 15 container Docker và 3 máy ảo Debian ngay lập tức. Thông thường, việc này chỉ mất 5 phút, nhưng sự mệt mỏi đã khiến đầu óc tôi mụ mẫm. Lịch sử terminal của tôi là một “nghĩa địa” hỗn loạn các lệnh ansible-playbook, thiếu flag -i và sai chính tả trong --extra-vars.

Nheo mắt nhìn màn hình, tôi không thể nhớ thư mục con nào chứa SSH key cho node cơ sở dữ liệu mới. HomeLab của tôi đã chính thức vượt quá giai đoạn “chạy từ laptop”. Tôi cần một cách tập trung, trực quan để kích hoạt tự động hóa. Quan trọng hơn, tôi cần ngăn mình vô tình “xóa sổ” một file server quan trọng trong khi đang thiếu ngủ.

Trở ngại: Tại sao chỉ dùng Ansible CLI lại khó mở rộng

Ansible rất mạnh mẽ, nhưng việc thực thi thủ công trong một hệ thống đang phát triển là công thức dẫn đến thảm họa. Nó thiếu trạng thái lưu trữ ổn định và nhật ký kiểm tra tập trung. Khi bạn chạy một playbook từ laptop, chỉ mình bạn biết điều đó đã xảy ra. Nếu bạn dùng nhiều máy hoặc chia sẻ hệ thống với bạn bè, việc theo dõi ai đã chạy gì—với các biến nào—trở thành một dự án thám tử.

Sự ức chế thường bắt nguồn từ ba vấn đề cụ thể:

  • Thông tin bảo mật phân tán: SSH key và mật khẩu Vault nằm rải rác trong các thư mục ngẫu nhiên trên các máy khác nhau.
  • Không có sự minh bạch: Bạn không thể xem lịch sử thực thi nếu không cuộn qua 5.000 dòng log trên terminal.
  • Áp lực ghi nhớ: Việc chạy một tác vụ “Cập nhật tất cả” đơn giản cũng yêu cầu phải nhớ những chuỗi lệnh CLI dài và dễ sai sót mỗi lần thực hiện.

So sánh: AWX vs. Semaphore UI

Hầu hết mọi người trước tiên sẽ nhìn vào AWX, phiên bản mã nguồn mở của Ansible Automation Platform từ Red Hat. Mặc dù là tiêu chuẩn vàng, AWX lại cực kỳ ngốn tài nguyên. Nó yêu cầu một cụm Kubernetes riêng biệt hoặc một máy ảo cấu hình mạnh với ít nhất 8GB RAM chỉ để chạy không tải. Đối với một HomeLab chạy trên vài chiếc Intel NUC hoặc Raspberry Pi 5, AWX là một sự lãng phí quá mức.

Sau đó là Semaphore UI. Được viết bằng Go, nó vô cùng mượt mà và sử dụng chưa đến 150MB RAM. Nó cung cấp chính xác những gì một người đam mê HomeLab cần mà không có những tính năng thừa thãi của doanh nghiệp:

  • Giao diện web phản hồi nhanh để kích hoạt các playbook.
  • Lưu trữ tập trung cho SSH key và bí mật Vault.
  • Log thời gian thực và lịch sử có thể tìm kiếm cho mỗi lần chạy.
  • Quản lý Inventory (danh sách máy chủ) mà không phải vật lộn với các file .ini khô khan hàng ngày.

Tôi đã chuyển bộ điều khiển lab chính của mình sang Semaphore từ sáu tháng trước. Kể từ đó, độ tin cậy khi triển khai của tôi đã tăng vọt vì yếu tố “sai sót do con người” khi dùng CLI đã bị loại bỏ.

Cài đặt: Triển khai Semaphore với Docker Compose

Chúng ta sẽ sử dụng Docker Compose với backend PostgreSQL để đảm bảo tính linh hoạt. Cấu hình này giúp log và các thiết lập của bạn dễ dàng được sao lưu hoặc di chuyển nếu bạn nâng cấp phần cứng sau này.

1. Chuẩn bị môi trường

Bắt đầu bằng cách tạo một thư mục dự án riêng biệt. Việc lưu giữ các công cụ hạ tầng trong /opt hoặc thư mục home giúp chúng không bị thất lạc.

mkdir -p ~/homelab/semaphore && cd ~/homelab/semaphore
touch docker-compose.yml

2. Cấu hình Docker Compose

Dán cấu hình này vào file docker-compose.yml của bạn. Bản này sử dụng image Semaphore ổn định mới nhất và Postgres 14.

services:
  postgres:
    image: postgres:14-alpine
    volumes:
      - ./semaphore-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=mật_khẩu_bảo_mật_của_bạn
      - POSTGRES_DB=semaphore
      - POSTGRES_USER=semaphore
    restart: unless-stopped

  semaphore:
    image: semaphoreui/semaphore:latest
    ports:
      - "3000:3000"
    environment:
      - SEMAPHORE_DB_USER=semaphore
      - SEMAPHORE_DB_PASS=mật_khẩu_bảo_mật_của_bạn
      - SEMAPHORE_DB_HOST=postgres
      - SEMAPHORE_DB_PORT=5432
      - SEMAPHORE_DB=semaphore
      - SEMAPHORE_PLAYBOOK_PATH=/tmp/semaphore
      - SEMAPHORE_ADMIN_PASSWORD=mật_khẩu_admin
      - SEMAPHORE_ADMIN_NAME=Admin
      - [email protected]
      - SEMAPHORE_ADMIN=admin
    depends_on:
      - postgres
    restart: unless-stopped

3. Khởi chạy dịch vụ

Kích hoạt hệ thống chỉ với một lệnh duy nhất. Khi các container đã sẵn sàng, hãy truy cập vào địa chỉ http://your-server-ip:3000.

docker compose up -d

Làm chủ bốn trụ cột của Semaphore

Sau khi đăng nhập, bạn cần cấu hình các thành phần cốt lõi để Semaphore hoạt động: Keys, Repos, Inventories, và Templates.

Bước A: Kho lưu trữ khóa (Key Store)

Tập trung hóa bảo mật tại đây. Thay vì để các SSH key nằm rải rác trên hệ thống tệp, bạn tải chúng lên kho lưu trữ được mã hóa của Semaphore. Nó xử lý các SSH key tiêu chuẩn, thông tin đăng nhập và thậm chí cả mật khẩu Ansible Vault. Mẹo nhỏ: Tạo một user “Ansible” riêng biệt trên các node của bạn và cung cấp key của nó cho Semaphore.

Bước B: Kho mã nguồn (Repositories)

Kết nối kho Git của bạn (GitHub, GitLab, hoặc Gitea). Mỗi khi bạn nhấn “Run”, Semaphore sẽ tải về phiên bản mã nguồn mới nhất. Điều này loại bỏ hoàn toàn nỗi lo “Liệu script trên laptop của mình có mới hơn trên máy chủ không?”.

Bước C: Danh mục máy chủ (Inventory)

Định nghĩa các host trực tiếp trong giao diện UI. Bạn có thể nhóm chúng thành “Production”, “Staging”, hoặc “Lab”. Nó hỗ trợ định dạng hosts.ini hoặc YAML tiêu chuẩn. Bạn chỉ cần sao chép và dán các file inventory hiện có và chúng sẽ hoạt động ngay lập tức.

Bước D: Mẫu tác vụ (Task Templates)

Đây là nơi quá trình tự động hóa thực sự bắt đầu. Một Task Template liên kết kho Git, một inventory và một playbook cụ thể. Ví dụ, tôi có mẫu “Bản vá bảo mật hàng tuần”. Chỉ với một cú nhấp chuột, nó sẽ chạy cập nhật trên 20 node, hiển thị kết quả terminal trực tiếp với mã màu ngay trong trình duyệt. Nếu một tác vụ thất bại trên node số 12, giao diện sẽ lập tức làm nổi bật nó bằng màu đỏ.

Mẹo nâng cao: Xử lý các bí mật được mã hóa

Nếu bạn sử dụng ansible-vault để bảo vệ dữ liệu nhạy cảm—điều mà bạn chắc chắn nên làm—hãy thêm mật khẩu Vault vào Key Store. Khi tạo Task Template, hãy liên kết khóa Vault đó. Semaphore sẽ giải mã các biến của bạn ngay trong quá trình thực thi mà không bao giờ làm rò rại mật khẩu vào nhật ký log.

Kết luận: Đẳng cấp chuyên nghiệp, nỗ lực tối thiểu

Chuyển sang Semaphore UI là lần nâng cấp đáng giá nhất cho sự an tâm của tôi. Nó biến những đợt bảo trì đêm khuya đầy rủi ro thành một quy trình đơn giản chỉ với một cú nhấp chuột. Nếu có gì đó hỏng, tôi có một bản ghi hình ảnh rõ ràng về lý do tại sao nó xảy ra.

Nếu bạn chạy playbook nhiều hơn một lần mỗi tuần, hãy ngừng sử dụng CLI thủ công. Semaphore đủ nhẹ để chạy trên một máy chủ “cùi” nhưng đủ mạnh mẽ để xử lý một phòng lab chuyên nghiệp phức tạp. Bản thân bạn trong những lần trực lúc 2 giờ sáng tương lai sẽ cảm ơn bạn vì sự an tâm này.

Share: