Setja upp geisladisk í gegnum gitlab

Ég hugsaði einu sinni um að gera sjálfvirkan dreifingu verkefnisins míns. gitlab.com útvegar vinsamlega öll verkfærin fyrir þetta og auðvitað ákvað ég að nýta mér það, finna út úr því og skrifa lítið dreifingarhandrit. Í þessari grein deili ég reynslu minni með samfélaginu.

TL; DR

  1. Settu upp VPS: slökktu á rót, skráðu þig inn með lykilorði, settu upp dockerd, stilltu ufw
  2. Búðu til vottorð fyrir netþjón og viðskiptavin docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Virkjaðu dockerd-stýringu í gegnum tcp-socket: fjarlægðu -H fd:// valkostinn úr docker stillingunni.
  3. Skráðu slóðir að skírteinum í docker.json
  4. Skráðu þig í gitlab breytur í CI/CD stillingum með innihaldi skírteina. Skrifaðu skriftu .gitlab-ci.yml til dreifingar.

Ég mun sýna öll dæmi um Debian dreifingu.

Upphafleg VPS uppsetning

Svo þú keyptir dæmi til dæmis á DO, það fyrsta sem þú þarft að gera er að vernda netþjóninn þinn fyrir árásargjarnum umheiminum. Ég mun ekki sanna eða fullyrða neitt, ég mun bara sýna log /var/log/skilaboð sýndarþjónsins míns:

SkjámyndSetja upp geisladisk í gegnum gitlab

Settu fyrst upp ufw eldvegginn:

apt-get update && apt-get install ufw

Kveikjum á sjálfgefna stefnunni: lokaðu fyrir allar komandi tengingar, leyfðu allar sendar tengingar:

ufw default deny incoming
ufw default allow outgoing

Mikilvægt: ekki gleyma að leyfa tengingu í gegnum ssh:

ufw allow OpenSSH

Almenn setningafræði er sem hér segir: Leyfa tengingu eftir höfn: ufw leyfa 12345, þar sem 12345 er gáttarnúmerið eða heiti þjónustunnar. Neita: ufw neita 12345

Kveiktu á eldveggnum:

ufw enable

Við hættum fundinum og skráum okkur inn aftur í gegnum ssh.

Bættu við notanda, gefðu honum lykilorð og bættu honum við sudo hópinn.

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

Næst, samkvæmt áætluninni, ættir þú að slökkva á innskráningu lykilorðs. til að gera þetta skaltu afrita ssh lykilinn þinn á netþjóninn:

ssh-copy-id [email protected]

IP þjónninn verður að vera þinn. Reyndu nú að skrá þig inn með notandanum sem þú bjóst til áður; þú þarft ekki lengur að slá inn lykilorð. Næst skaltu breyta eftirfarandi í stillingum:

sudo nano /etc/ssh/sshd_config

slökkva á innskráningu lykilorðs:

PasswordAuthentication no

Endurræstu sshd púkann:

sudo systemctl reload sshd

Nú ef þú eða einhver annar reynir að skrá þig inn sem rótnotandi, mun það ekki virka.

Næst skaltu setja upp dockerd, ég mun ekki lýsa ferlinu hér, þar sem öllu er nú þegar hægt að breyta, fylgdu hlekknum á opinberu vefsíðuna og farðu í gegnum skrefin við að setja upp docker á sýndarvélinni þinni: https://docs.docker.com/install/linux/docker-ce/debian/

Að búa til vottorð

Til að stjórna docker-púknum fjarstýrt þarf dulkóðaða TLS-tengingu. Til að gera þetta þarftu að hafa vottorð og lykil sem þarf að búa til og flytja yfir á ytri vélina þína. Fylgdu skrefunum sem gefnar eru upp í leiðbeiningunum á opinberu Docker vefsíðunni: https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl Allar búnar *.pem skrár fyrir þjóninn, þ.e. ca.pem, server.pem, key.pem, verða að vera settar í /etc/docker möppuna á þjóninum.

Að setja upp dockerd

Í ræsiforritinu fyrir docker púkann, fjarlægjum við valmöguleikann -H df://, þessi valkostur ákvarðar á hvaða vél er hægt að stjórna docker púknum.

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

Næst ættirðu að búa til stillingaskrá, ef hún er ekki þegar til, og tilgreina valkostina:

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

Leyfum tengingar á höfn 2376:

sudo ufw allow 2376

Endurræsum dockerd með nýju stillingunum:

sudo systemctl daemon-reload && sudo systemctl restart docker

Við skulum athuga:

sudo systemctl status docker

Ef allt er „grænt“ þá lítum við svo á að við höfum stillt docker á þjóninum með góðum árangri.

Setja upp samfellda sendingu á gitlab

Til þess að starfsmaður Gitalaba geti framkvæmt skipanir á ytri Docker hýsil er nauðsynlegt að ákveða hvernig og hvar á að geyma vottorð og lykil fyrir dulkóðaða tengingu við Dockerd. Ég leysti þetta vandamál með því einfaldlega að bæta eftirfarandi við breyturnar í gitlbab stillingunum:

Spoiler titillSetja upp geisladisk í gegnum gitlab

Gefðu bara út innihald skírteina og lykils í gegnum köttinn: cat ca.pem. Afritaðu og límdu inn í breytugildin.

Við skulum skrifa handrit til dreifingar í gegnum GitLab. Myndin sem tengist bryggju (dind) verður notuð.

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

Innihald dreifingarhandritsins með athugasemdum:

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

Aðalvandamálið var að „draga“ innihald skírteina á venjulegu formi úr gitlab CI/CD breytunum. Ég gat ekki fundið út hvers vegna tengingin við ytri gestgjafann virkaði ekki. Á gestgjafanum horfði ég á log sudo journalctl -u docker, það kom upp villa við handabandið. Ég ákvað að skoða hvað er almennt geymt í breytum; til að gera þetta geturðu litið svona út: cat -A $DOCKER_CERT_PATH/key.pem. Ég sigraði villuna með því að bæta við að fjarlægja vagnstafinn tr -d 'r'.

Næst geturðu bætt verkefnum eftir útgáfu við handritið að eigin vali. Þú getur skoðað vinnuútgáfuna í geymslunni minni https://gitlab.com/isqad/gitlab-ci-cd

Heimild: www.habr.com

Bæta við athugasemd