Подешавање ЦД-а преко гитлаб-а

Једном сам размишљао о аутоматизацији имплементације мог пројекта. гитлаб.цом љубазно пружа све алате за ово, и наравно, одлучио сам да то искористим, схватио сам и написао малу скрипту за примену. У овом чланку делим своје искуство са заједницом.

ТЛ; ДР

  1. Подесите ВПС: онемогућите роот, пријавите се са лозинком, инсталирајте доцкерд, конфигуришите уфв
  2. Генеришите сертификате за сервер и клијента доцс.доцкер.цом/енгине/сецурити/хттпс/#цреате-а-ца-сервер-анд-цлиент-кеис-витх-опенссл Омогућите доцкерд контролу преко тцп утичнице: уклоните опцију -Х фд:// из доцкер конфигурације.
  3. Региструјте путање до сертификата у доцкер.јсон
  4. Региструјте се у гитлаб променљиве у ЦИ/ЦД подешавањима са садржајем сертификата. Напишите скрипту .гитлаб-ци.имл за примену.

Показаћу све примере о Дебиан дистрибуцији.

Почетно подешавање ВПС-а

Дакле, купили сте примерак на пример на DO, прва ствар коју треба да урадите је да заштитите свој сервер од агресивног спољашњег света. Нећу ништа доказивати нити тврдити, само ћу показати дневник /вар/лог/поруке мог виртуелног сервера:

СцреенсхотПодешавање ЦД-а преко гитлаб-а

Прво, инсталирајте уфв заштитни зид:

apt-get update && apt-get install ufw

Хајде да омогућимо подразумевану политику: блокирај све долазне везе, дозволи све одлазне везе:

ufw default deny incoming
ufw default allow outgoing

Важно: не заборавите да дозволите везу преко ссх-а:

ufw allow OpenSSH

Општа синтакса је следећа: Дозволи везу према порту: уфв дозволи 12345, где је 12345 број порта или назив услуге. Одбијање: уфв дени 12345

Укључите заштитни зид:

ufw enable

Излазимо из сесије и поново се пријављујемо преко ссх-а.

Додајте корисника, доделите му лозинку и додајте га у судо групу.

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

Затим, према плану, требало би да онемогућите пријаву лозинком. да бисте то урадили, копирајте свој ссх кључ на сервер:

ssh-copy-id [email protected]

ИП сервера мора бити ваш. Сада покушајте да се пријавите помоћу корисника којег сте раније креирали; више не морате да уносите лозинку. Затим, у подешавањима конфигурације, промените следеће:

sudo nano /etc/ssh/sshd_config

онемогући пријаву лозинком:

PasswordAuthentication no

Поново покрените ссхд демон:

sudo systemctl reload sshd

Сада ако ви или неко други покушате да се пријавите као роот корисник, то неће радити.

Следеће, инсталирајте доцкерд, овде нећу описивати процес, пошто се све већ може променити, пратите линк до званичне веб странице и прођите кроз кораке инсталирања доцкер-а на вашој виртуелној машини: https://docs.docker.com/install/linux/docker-ce/debian/

Генерисање сертификата

Да бисте даљински контролисали доцкер демон, потребна је шифрована ТЛС веза. Да бисте то урадили, потребно је да имате сертификат и кључ, који се морају генерисати и пренети на вашу удаљену машину. Следите кораке дате у упутствима на званичној веб локацији доцкер-а: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Све генерисане *.пем датотеке за сервер, односно ца.пем, сервер.пем, кеи.пем, морају бити смештене у /етц/доцкер директоријум на серверу.

Подешавање Доцкерд-а

У скрипти за покретање доцкер демона уклањамо опцију -Х дф://, ова опција одређује на ком хосту се може контролисати доцкер демон.

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

Затим треба да креирате датотеку за подешавања, ако већ не постоји, и наведете опције:

/етц/доцкер/доцкер.јсон

{
  "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

Поново покренимо Доцкерд са новим подешавањима:

sudo systemctl daemon-reload && sudo systemctl restart docker

Хајде да проверимо:

sudo systemctl status docker

Ако је све „зелено“, онда сматрамо да смо успешно конфигурисали доцкер на серверу.

Подешавање континуиране испоруке на гитлаб-у

Да би Гиталаба радник могао да извршава команде на удаљеном Доцкер хосту, потребно је одлучити како и где ће чувати сертификате и кључ за шифровану везу са Доцкерд-ом. Решио сам овај проблем једноставним додавањем следећег у променљиве у подешавањима гитлбаб-а:

наслов спојлераПодешавање ЦД-а преко гитлаб-а

Само испишите садржај сертификата и кључа преко цат: cat ca.pem. Копирајте и налепите у вредности променљиве.

Хајде да напишемо скрипту за примену преко ГитЛаба. Биће коришћена слика доцкер-ин-доцкер (динд).

.гитлаб-ци.имл

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

Садржај скрипте за примену са коментарима:

бин/деплои.сх

#!/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

Главни проблем је био „извући“ садржај сертификата у нормалном облику из гитлаб ЦИ/ЦД варијабли. Нисам могао да схватим зашто веза са удаљеним хостом не ради. На хосту сам погледао дневник судо јоурналцтл -у доцкер, дошло је до грешке током руковања. Одлучио сам да погледам шта се генерално чува у варијаблама; да бисте то урадили, можете изгледати овако: цат -А $ДОЦКЕР_ЦЕРТ_ПАТХ/кеи.пем. Превазишао сам грешку тако што сам додао уклањање знака за превоз тр -д 'р'.

Затим можете додати задатке након објављивања скрипти по свом нахођењу. Радну верзију можете погледати у мом спремишту https://gitlab.com/isqad/gitlab-ci-cd

Извор: ввв.хабр.цом

Додај коментар