CD iestatīšana, izmantojot gitlab

Kādā brīdī es aizdomājos par sava projekta izvietošanas automatizāciju. gitlab.com labprāt nodrošina visus rīkus tam, un es, protams, nolēmu izmantot, izpratnē un uzrakstot nelielu izvietošanas scenāriju. Šajā rakstā dalos ar savu pieredzi ar kopienu.

TL;DR

  1. Iestatīt VPS: atslēgt root, ieeja ar paroli, uzstādīt dockerd, konfigurēt ufw
  2. Generēt sertifikātus serverim un klientam docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Ieslēgt dockerd pārvaldību, izmantojot TCP socket: no konfigurācijas jānoņem opcija -H fd://.
  3. Прописать пути до сертификатов в docker.json
  4. Jāieraksta mainīgajos gitlab CI/CD iestatījumos sertifikātu saturs. Jāuzraksta .gitlab-ci.yml skripts izvietošanai.

Visus piemērus es rādīšu uz Debian distribūcijas.

Pirmais VPS iestatījums

Jūs esat iegādājies instance, piemēram, pie DO, pirmais, kas jādara, ir aizsargāt savu serveri no agresīvā ārējā pasaules. Es neko pierādīt negribu un neapgalvoju, vienkārši parādīšu žurnālu /var/log/messages no sava virtuālā servera:

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

Vispirms uzstādām ugunsmūri ufw:

apt-get update && apt-get install ufw

Ieslēgsim noklusējuma politiku: bloķējam visus ienākošos savienojumus, atļaujam visus izejošos savienojumus:

ufw default deny incoming
ufw default allow outgoing

Svarīgi: neaizmirstiet atļaut savienojumu pa ssh:

ufw allow OpenSSH

Vispārējā sintakse ir šāda: atļaut savienojumu pa portu: ufw allow 12345, kur 12345 ir portu numurs vai pakalpojuma nosaukums. Aizliegt: ufw deny 12345

Ieslēdzam ugunsmūri:

ufw enable

Iziet no sesijas un vēlreiz pieslēgties, izmantojot ssh.

Pievienojiet lietotāju, piešķiriet tam paroli un pievienojiet to sudo grupai.

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

Tālāk plāns ir atslēgt ieeju ar paroli. Lai to izdarītu, kopējiet savu ssh atslēgu uz serveri:

ssh-copy-id root@10.101.10.28

servera IP jānorāda jūsu. Tagad mēģiniet pieslēgties ar iepriekš izveidoto lietotāju, paroli vairs nav jāievada. Tālāk konfigurācijas iestatījumos nomainām sekojošo:

sudo nano /etc/ssh/sshd_config

atzīmējam ieejas atslēgšanu ar paroli:

PasswordAuthentication no

Pārstartējam sshd demon:

sudo systemctl reload sshd

Tagad, ja jūs vai kāds cits mēģinās ieiet ar root lietotāju, tam nekas nesanāks.

Tālāk uzstādam dockerd, šeit es procesu aprakstīt vairs neplānoju, jo viss var būt jau mainīts, dodieties uz oficiālo vietni un izpildiet soļus docker uzstādīšanai uz jūsu virtuālā datora: https://docs.docker.com/install/linux/docker-ce/debian/

Sertifikātu ģenerēšana

Lai attālināti pārvaldītu Docker deamonu, ir nepieciešama šifrēta TLS savienojums. Tam ir nepieciešams sertifikāts un atslēga, kurus ir jāģenerē un jāpārnes uz jūsu attālināto mašīnu. Izpildiet oficiālajā Docker tīmekļa vietnē sniegtos norādījumus: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Visus ģenerētos *.pem failus serverim, proti, ca.pem, server.pem, key.pem, jāpārvieto direktorijā /etc/docker uz servera.

dockerd konfigurācija

Docker deamona startēšanas skriptā noņemam opciju -H df://, šī opcija nosaka, kādā hostā var pārvaldīt Docker deamonu.

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

Tālāk jāizveido iestatījumu fails, ja tāda vēl nav, un jānorāda 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 pa 2376 portu:

sudo ufw allow 2376

Pārliecināsimies, ka dockerd tiek restartēts ar jaunajiem iestatījumiem:

sudo systemctl daemon-reload && sudo systemctl restart docker

Pārbaudīsim:

sudo systemctl status docker

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

Continuous Delivery konfigurācija GitLabā

Lai GitLab darba izpildītājs varētu veikt komandas attālinātajā Docker hostā, ir jānosaka, kā un kur glabāt sertifikātus un atslēgu šifrētajam savienojumam ar dockerd. Es šo problēmu atrisināju, vienkārši ierakstot iestatījumos GitLab mainīgajos:

Spoileru virsrakstsCD iestatīšana, izmantojot gitlab

Vienkārši izvadiet sertifikātu un atslēgas saturu ar cat: cat ca.pem. Nokopējiet un ielīmējiet mainīgo vērtībās.

Izveidosim skriptu izvietošanai ar GitLab. Tiks izmantots docker-in-docker (dind) attēls.

.gitlab-ci.yml

image:
  name: docker/compose:1.23.2
  # pārakstīsim entrypoint, lai darbotos 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 skripts šeit

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 „izvilkt” no GitLab CI/CD mainīgajiem sertifikātu saturu normālā veidā. Es nevarēju saprast, kāpēc savienojums ar attālināto hostu nedarbojās. Uz hosta pārbaudīju žurnālu sudo journalctl -u docker, tur bija kļūda rokas spiedienā. Izdomāju paskatīties, kas vispār glabājas mainīgajos, to var izdarīt tā: cat -A $DOCKER_CERT_PATH/key.pem. Kļūdu novēršu, pievienojot neskatīšanas simbolu (carriage return) tr -d ' '.

Tālāk scenārijā varat pievienot pēcizlaiduma uzdevumus pēc saviem ieskatiem. Ar darba versiju varat iepazīties manā repozitorijā. https://gitlab.com/isqad/gitlab-ci-cd

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster