Thiết lập đĩa CD qua gitlab

Tôi đã từng nghĩ về việc tự động hóa việc triển khai dự án của mình. gitlab.com vui lòng cung cấp tất cả các công cụ cho việc này và tất nhiên tôi đã quyết định sử dụng nó bằng cách tìm ra nó và viết một tập lệnh triển khai nhỏ. Trong bài viết này, tôi chia sẻ kinh nghiệm của mình với cộng đồng.

TL; DR

  1. Thiết lập VPS: vô hiệu hóa root, mật khẩu đăng nhập, cài đặt dockerd, cấu hình ufw
  2. Tạo chứng chỉ cho máy chủ và máy khách docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Bật điều khiển dockerd qua ổ cắm tcp: xóa tùy chọn -H fd:// khỏi cấu hình docker.
  3. Đặt đường dẫn đến chứng chỉ trong docker.json
  4. Đăng ký các biến gitlab trong cài đặt CI / CD với nội dung của chứng chỉ. Viết tập lệnh .gitlab-ci.yml để triển khai.

Tôi sẽ hiển thị tất cả các ví dụ về bản phân phối Debian.

Thiết lập VPS ban đầu

Ở đây bạn đã mua một phiên bản chẳng hạn trên DO, điều đầu tiên cần làm là bảo vệ máy chủ của bạn khỏi thế giới hung hãn bên ngoài. Tôi sẽ không chứng minh hay khẳng định bất cứ điều gì, tôi sẽ chỉ hiển thị nhật ký /var/log/messages của máy chủ ảo của mình:

Ảnh chụp màn hìnhThiết lập đĩa CD qua gitlab

Đầu tiên, cài đặt tường lửa ufw:

apt-get update && apt-get install ufw

Kích hoạt chính sách mặc định: chặn tất cả các kết nối đến, cho phép tất cả các kết nối đi:

ufw default deny incoming
ufw default allow outgoing

Quan trọng: đừng quên cho phép kết nối qua ssh:

ufw allow OpenSSH

Cú pháp chung là: Cho phép kết nối trên cổng: ufw allow 12345, trong đó 12345 là số cổng hoặc tên dịch vụ. Từ chối: ufw từ chối 12345

Bật tường lửa:

ufw enable

Chúng tôi thoát phiên và đăng nhập lại qua ssh.

Thêm người dùng, gán cho anh ta mật khẩu và thêm anh ta vào nhóm sudo.

apt-get install sudo
adduser scoty
usermod -aG sudo scoty

Tiếp theo, theo kế hoạch, bạn nên tắt mật khẩu đăng nhập. để làm điều này, sao chép khóa ssh của bạn vào máy chủ:

ssh-copy-id [email protected]

IP của máy chủ phải là của bạn. Bây giờ bạn hãy thử đăng nhập theo user đã tạo trước đó, bạn không cần nhập mật khẩu nữa. Tiếp theo, trong cài đặt cấu hình, thay đổi như sau:

sudo nano /etc/ssh/sshd_config

vô hiệu hóa mật khẩu đăng nhập:

PasswordAuthentication no

Khởi động lại trình nền sshd:

sudo systemctl reload sshd

Bây giờ nếu bạn hoặc ai đó cố gắng đăng nhập với quyền root, nó sẽ không thành công.

Tiếp theo, chúng tôi cài đặt dockerd, tôi sẽ không mô tả quy trình ở đây, vì mọi thứ đều có thể thay đổi được, hãy nhấp vào liên kết đến trang web chính thức và thực hiện các bước cài đặt docker trên máy ảo của bạn: https://docs.docker.com/install/linux/docker-ce/debian/

Tạo chứng chỉ

Để điều khiển trình nền docker từ xa, cần có kết nối TLS được mã hóa. Để thực hiện việc này, bạn cần có chứng chỉ và khóa mà bạn cần tạo và chuyển sang máy từ xa của mình. Thực hiện theo các bước được đưa ra trong hướng dẫn trên trang web docker chính thức: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Tất cả các tệp *.pem được tạo cho máy chủ, cụ thể là ca.pem, server.pem, key.pem, phải được đặt trong thư mục /etc/docker trên máy chủ.

thiết lập docker

Trong tập lệnh khởi động docker daemon, hãy xóa tùy chọn -H df://, tùy chọn này cho biết máy chủ nào có thể kiểm soát docker daemon.

# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd

Tiếp theo, tạo tệp cài đặt nếu nó chưa tồn tại và đặt các tùy chọn:

/etc/docker/docker.json

{
  "hosts": [
    "unix:///var/run/docker.sock",
    "tcp://0.0.0.0:2376"
  ],
  "labels": [
    "is-our-remote-engine=true"
  ],
  "tls": true,
  "tlscacert": "/etc/docker/ca.pem",
  "tlscert": "/etc/docker/server.pem",
  "tlskey": "/etc/docker/key.pem",
  "tlsverify": true
}

Cho phép kết nối trên cổng 2376:

sudo ufw allow 2376

Khởi động lại dockerd với cài đặt mới:

sudo systemctl daemon-reload && sudo systemctl restart docker

Hãy kiểm tra:

sudo systemctl status docker

Nếu mọi thứ đều có màu xanh thì coi như chúng ta đã cấu hình thành công docker trên server.

Thiết lập phân phối liên tục trên gitlab

Để nhân viên gitalab có thể thực thi các lệnh trên máy chủ docker từ xa, bạn cần quyết định cách thức và vị trí lưu trữ chứng chỉ cũng như khóa cho kết nối được mã hóa tới dockerd. Tôi đã giải quyết vấn đề này bằng cách ghi đơn giản vào các biến trong cài đặt gitlbab:

tiêu đề tiết lộThiết lập đĩa CD qua gitlab

Chỉ cần xuất nội dung của chứng chỉ và khóa qua cat: cat ca.pem. Sao chép và dán vào các giá trị biến.

Hãy viết một kịch bản để triển khai thông qua gitlab. Hình ảnh docker-in-docker (dind) sẽ được sử dụng.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # перепишем entrypoint , чтобы работало в dind
  entrypoint: ["/bin/sh", "-c"]

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - bin/deploy.sh # скрипт деплоя тут

Nội dung của kịch bản triển khai với các nhận xét:

bin/triển khai.sh

#!/usr/bin/env sh
# Падаем сразу, если возникли какие-то ошибки
set -e
# Выводим, то , что делаем
set -v

# 
DOCKER_COMPOSE_FILE=docker-compose.yml
# Куда деплоим
DEPLOY_HOST=185.241.52.28
# Путь для сертификатов клиента, то есть в нашем случае - gitlab-воркера
DOCKER_CERT_PATH=/root/.docker

# проверим, что в контейнере все имеется
docker info
docker-compose version

# создаем путь (сейчас работаем в клиенте - воркере gitlab'а)
mkdir $DOCKER_CERT_PATH
# изымаем содержимое переменных, при этом удаляем лишние символы добавленные при сохранении переменных.
echo "$CA_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/ca.pem
echo "$CERT_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/cert.pem
echo "$KEY_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/key.pem
# на всякий случай даем только читать
chmod 400 $DOCKER_CERT_PATH/ca.pem
chmod 400 $DOCKER_CERT_PATH/cert.pem
chmod 400 $DOCKER_CERT_PATH/key.pem

# далее начинаем уже работать с удаленным docker-демоном. Собственно, сам деплой
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://$DEPLOY_HOST:2376

# проверим, что коннектится все успешно
docker-compose 
  -f $DOCKER_COMPOSE_FILE 
  ps

# логинимся в docker-регистри, тут можете указать свой "местный" регистри
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD

docker-compose 
  -f $DOCKER_COMPOSE_FILE 
  pull app
# поднимаем приложение
docker-compose 
  -f $DOCKER_COMPOSE_FILE 
  up -d app

Vấn đề chính là "rút" nội dung của các chứng chỉ ở dạng bình thường khỏi các biến CI / CD của gitlab. Tôi không thể hiểu tại sao kết nối với máy chủ từ xa không hoạt động. Tôi đã xem nhật ký docker sudo journalctl -u trên máy chủ, có lỗi khi bắt tay. Tôi quyết định xem xét những gì thường được lưu trữ trong các biến, để biết điều này, bạn có thể xem cat -A $DOCKER_CERT_PATH/key.pem. Đã khắc phục lỗi bằng cách thêm việc xóa ký tự dấu mũ tr -d 'r'.

Ngoài ra, bạn có thể tùy ý thêm các tác vụ sau khi phát hành vào tập lệnh. Bạn có thể kiểm tra phiên bản làm việc trong kho lưu trữ của tôi https://gitlab.com/isqad/gitlab-ci-cd

Nguồn: www.habr.com

Thêm một lời nhận xét