gitlab арқылы ықшам дискіні орнату

Мен бір кездері жобамды орналастыруды автоматтандыру туралы ойладым. gitlab.com бұл үшін барлық құралдарды ұсынады, және, әрине, мен оның артықшылығын пайдалануды шештім, оны анықтап, шағын орналастыру сценарийін жаздым. Бұл мақалада мен өз тәжірибемді қоғамдастықпен бөлісемін.

TL; DR

  1. VPS орнату: түбірді өшіру, құпия сөзбен кіру, dockerd орнату, ufw конфигурациялау
  2. Сервер мен клиент үшін сертификаттарды жасаңыз docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl tcp ұясы арқылы докерді басқаруды қосыңыз: докер конфигурациясынан -H fd:// опциясын алып тастаңыз.
  3. Docker.json ішінде сертификаттарға жолды тіркеңіз
  4. Сертификаттардың мазмұнымен CI/CD параметрлерінде gitlab айнымалыларында тіркеңіз. Орналастыру үшін .gitlab-ci.yml сценарийін жазыңыз.

Мен Debian таратуындағы барлық мысалдарды көрсетемін.

Бастапқы VPS орнату

Мәселен, мысалы, мына жерден дананы сатып алдыңыз DO, сізге қажет бірінші нәрсе - серверіңізді агрессивті сыртқы әлемнен қорғау. Мен ештеңені дәлелдемеймін немесе бекітпеймін, мен виртуалды серверімнің /var/log/messages журналын ғана көрсетемін:

Скриншотgitlab арқылы ықшам дискіні орнату

Алдымен ufw брандмауэрін орнатыңыз:

apt-get update && apt-get install ufw

Әдепкі саясатты қосайық: барлық кіріс қосылымдарды блоктау, барлық шығыс қосылымдарға рұқсат ету:

ufw default deny incoming
ufw default allow outgoing

Маңызды: ssh арқылы қосылуға рұқсат беруді ұмытпаңыз:

ufw allow OpenSSH

Жалпы синтаксис келесідей: Порт бойынша қосылуға рұқсат ету: ufw рұқсат 12345, мұндағы 12345 порт нөмірі немесе қызмет атауы. Бас тарту: ufw жоққа шығару 12345

Брандмауэрді қосыңыз:

ufw enable

Біз сеанстан шығып, ssh арқылы қайта кіреміз.

Пайдаланушыны қосыңыз, оған құпия сөз тағайындаңыз және оны sudo тобына қосыңыз.

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

Әрі қарай, жоспарға сәйкес, парольмен кіруді өшіру керек. Мұны істеу үшін ssh кілтін серверге көшіріңіз:

ssh-copy-id [email protected]

Сервер IP сіздікі болуы керек. Енді бұрын жасаған пайдаланушы арқылы жүйеге кіріп көріңіз, енді құпия сөзді енгізудің қажеті жоқ. Әрі қарай, конфигурация параметрлерінде келесіні өзгертіңіз:

sudo nano /etc/ssh/sshd_config

парольмен кіруді өшіру:

PasswordAuthentication no

Sshd демонын қайта іске қосыңыз:

sudo systemctl reload sshd

Енді сіз немесе басқа біреу түбірлік пайдаланушы ретінде кіруге әрекеттенсе, ол жұмыс істемейді.

Әрі қарай, dockerd орнатыңыз, мен мұнда процесті сипаттамаймын, себебі барлығын өзгертуге болады, ресми веб-сайтқа сілтемені орындаңыз және виртуалды машинаңызға докерді орнату қадамдарын орындаңыз: https://docs.docker.com/install/linux/docker-ce/debian/

Сертификаттарды жасау

Доккер демонын қашықтан басқару үшін шифрланған TLS қосылымы қажет. Бұл әрекетті орындау үшін сізде сертификат пен кілт болуы керек, олар жасалуы және қашықтағы құрылғыға тасымалдануы керек. Ресми докер веб-сайтындағы нұсқауларда берілген қадамдарды орындаңыз: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Серверге арналған барлық жасалған *.pem файлдары, атап айтқанда ca.pem, server.pem, key.pem сервердегі /etc/docker каталогында орналастырылуы керек.

Dockerd орнату

Доккер демонын іске қосу сценарийінде -H df:// опциясын алып тастаймыз, бұл опция докер демонын қай хостта басқаруға болатынын анықтайды.

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

Содан кейін параметрлер файлын жасау керек, егер ол бұрыннан жоқ болса және опцияларды көрсетіңіз:

/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
}

2376 портындағы қосылымдарға рұқсат етейік:

sudo ufw allow 2376

Dockerd-ті жаңа параметрлермен қайта іске қосайық:

sudo systemctl daemon-reload && sudo systemctl restart docker

Тексерейік:

sudo systemctl status docker

Егер бәрі «жасыл» болса, біз серверде докерді сәтті конфигурацияладық деп есептейміз.

Gitlab жүйесінде үздіксіз жеткізуді орнату

Gitalaba жұмысшысы қашықтағы Docker хостында пәрмендерді орындай алуы үшін сертификаттарды және Dockerd-пен шифрланған қосылым кілтін қалай және қайда сақтау керектігін шешу қажет. Мен бұл мәселені gitlbab параметрлеріндегі айнымалы мәндерге жай ғана қосу арқылы шештім:

Спойлер тақырыбыgitlab арқылы ықшам дискіні орнату

Тек сертификаттардың мазмұнын және мысық арқылы кілтті шығарыңыз: cat ca.pem. Айнымалы мәндерге көшіріп, қойыңыз.

GitLab арқылы орналастыру үшін сценарий жазайық. Docker-in-docker (dind) кескіні пайдаланылады.

.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 # скрипт деплоя тут

Түсініктемелері бар орналастыру сценарийінің мазмұны:

bin/deploy.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

Негізгі мәселе gitlab CI/CD айнымалыларынан қалыпты пішіндегі сертификаттардың мазмұнын «тартып алу» болды. Мен қашықтағы хостқа қосылу неге жұмыс істемейтінін түсіне алмадым. Хостта мен sudo journalctl -u docker журналын қарадым, қол алысу кезінде қате пайда болды. Мен әдетте айнымалы мәндерде не сақталатынын қарастыруды шештім; ол үшін келесідей көрінуге болады: cat -A $DOCKER_CERT_PATH/key.pem. Мен tr -d 'r' каретка таңбасын алып тастау арқылы қатені жеңдім.

Әрі қарай, сіз өз қалауыңыз бойынша сценарийге шығарылымнан кейінгі тапсырмаларды қоса аласыз. Жұмыс нұсқасын менің репозиторийімде көре аласыз https://gitlab.com/isqad/gitlab-ci-cd

Ақпарат көзі: www.habr.com

пікір қалдыру