CD iestatīšana, izmantojot Gitlab

Es reiz domāju par sava projekta izvietošanas automatizāciju. gitlab.com laipni nodrošina visus šim nolūkam nepieciešamos rīkus, un, protams, es nolēmu to izmantot, izdomājot un uzrakstot nelielu izvietošanas skriptu. Šajā rakstā es dalos savā pieredzē ar sabiedrību.

TL; DR

  1. Iestatiet VPS: atspējojiet root, piesakieties ar paroli, instalējiet dockerd, konfigurējiet ufw
  2. Ģenerējiet sertifikātus serverim un klientam docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Iespējot dockerd vadību, izmantojot tcp ligzdu: noņemiet opciju -H fd:// no docker konfigurācijas.
  3. Reģistrējiet ceļus uz sertifikātiem vietnē docker.json
  4. Reģistrējieties Gitlab mainīgajos CI/CD iestatījumos ar sertifikātu saturu. Uzrakstiet skriptu .gitlab-ci.yml izvietošanai.

Es parādīšu visus piemērus par Debian izplatīšanu.

Sākotnējā VPS iestatīšana

Tātad jūs iegādājāties piemēru, piemēram, vietnē DO, pirmā lieta, kas jums jādara, ir aizsargāt savu serveri no agresīvas ārpasaules. Es neko nepierādīšu un neapgalvošu, es tikai parādīšu sava virtuālā servera žurnālu /var/log/messages:

EkrānuzņēmumsCD iestatīšana, izmantojot Gitlab

Vispirms instalējiet ufw ugunsmūri:

apt-get update && apt-get install ufw

Iespējosim noklusējuma politiku: bloķēt visus ienākošos savienojumus, atļaut visus izejošos savienojumus:

ufw default deny incoming
ufw default allow outgoing

Svarīgi: neaizmirstiet atļaut savienojumu, izmantojot ssh:

ufw allow OpenSSH

Vispārējā sintakse ir šāda: Atļaut savienojumu ar portu: ufw allow 12345, kur 12345 ir porta numurs vai pakalpojuma nosaukums. Noliegt: ufw deny 12345

Ieslēdziet ugunsmūri:

ufw enable

Mēs izejam no sesijas un vēlreiz piesakāmies, izmantojot ssh.

Pievienojiet lietotāju, piešķiriet viņam paroli un pievienojiet viņu sudo grupai.

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

Tālāk, saskaņā ar plānu, jums vajadzētu atspējot paroles pieteikšanos. Lai to izdarītu, nokopējiet ssh atslēgu serverī:

ssh-copy-id [email protected]

Servera IP ir jābūt jūsu. Tagad mēģiniet pieteikties, izmantojot iepriekš izveidoto lietotāju; jums vairs nav jāievada parole. Pēc tam konfigurācijas iestatījumos mainiet tālāk norādīto.

sudo nano /etc/ssh/sshd_config

atspējot paroles pieteikšanos:

PasswordAuthentication no

Restartējiet sshd dēmonu:

sudo systemctl reload sshd

Tagad, ja jūs vai kāds cits mēģinās pieteikties kā root lietotājs, tas nedarbosies.

Pēc tam instalējiet dockerd, es šeit neaprakstīšu procesu, jo visu jau var mainīt, sekojiet saitei uz oficiālo vietni un veiciet docker instalēšanas darbības virtuālajā mašīnā: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikātu ģenerēšana

Lai attālināti vadītu docker dēmonu, ir nepieciešams šifrēts TLS savienojums. Lai to izdarītu, jums ir nepieciešams sertifikāts un atslēga, kas ir jāģenerē un jāpārsūta uz attālo iekārtu. Veiciet darbības, kas sniegtas instrukcijās oficiālajā docker vietnē: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Visi servera ģenerētie *.pem faili, proti, ca.pem, server.pem, key.pem, ir jāievieto servera direktorijā /etc/docker.

Dockerd iestatīšana

Docker dēmona palaišanas skriptā mēs noņemam opciju -H df://. Šī opcija nosaka, kurā resursdatorā var vadīt docker dēmonu.

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

Pēc tam jums vajadzētu izveidot iestatījumu failu, ja tas vēl neeksistē, un norādīt opcijas:

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

Atļausim savienojumus portā 2376:

sudo ufw allow 2376

Restartēsim dockerd ar jaunajiem iestatījumiem:

sudo systemctl daemon-reload && sudo systemctl restart docker

Pārbaudīsim:

sudo systemctl status docker

Ja viss ir “zaļš”, mēs uzskatām, ka esam veiksmīgi konfigurējuši docker serverī.

Nepārtrauktas piegādes iestatīšana pakalpojumā Gitlab

Lai Gitalaba darbinieks varētu izpildīt komandas attālā Docker resursdatorā, ir jāizlemj, kā un kur saglabāt sertifikātus un atslēgu šifrētam savienojumam ar Dockerd. Es atrisināju šo problēmu, vienkārši pievienojot gitlbab iestatījumos mainīgajiem lielumiem:

Spoilera virsrakstsCD iestatīšana, izmantojot Gitlab

Vienkārši izvadiet sertifikātu saturu un atslēgu, izmantojot cat: cat ca.pem. Kopējiet un ielīmējiet mainīgo vērtībās.

Uzrakstīsim skriptu izvietošanai, izmantojot GitLab. Tiks izmantots docker-in-docker (dind) attēls.

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

Izvietošanas skripta saturs ar komentāriem:

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

Galvenā problēma bija sertifikātu satura “izvilkšana” normālā formā no gitlab CI/CD mainīgajiem. Es nevarēju saprast, kāpēc savienojums ar attālo saimniekdatoru nedarbojas. Uzņēmējā es paskatījos uz log sudo journalctl -u docker, rokasspiediena laikā radās kļūda. Es nolēmu apskatīt to, kas parasti tiek saglabāts mainīgajos; lai to izdarītu, varat izskatīties šādi: cat -A $DOCKER_CERT_PATH/key.pem. Es pārvarēju kļūdu, pievienojot karieta rakstzīmes tr -d 'r' noņemšanu.

Pēc tam skriptam pēc saviem ieskatiem varat pievienot uzdevumus pēc izlaišanas. Darba versiju varat apskatīt manā repozitorijā https://gitlab.com/isqad/gitlab-ci-cd

Avots: www.habr.com

Pievieno komentāru