CD-ի կարգավորում 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 Միացնել dockerd-ի կառավարումը tcp վարդակից. հեռացրեք -H fd:// տարբերակը դոկերի կազմաձևից:
  3. Սահմանեք վկայագրերի ուղիները docker.json-ում
  4. Գրանցվեք gitlab փոփոխականներում CI / CD կարգավորումներում վկայագրերի բովանդակությամբ: Տեղադրման համար գրեք .gitlab-ci.yml սցենար:

Ես ցույց կտամ Debian բաշխման բոլոր օրինակները:

Նախնական VPS կարգավորում

Այստեղ դուք օրինակ եք գնել, օրինակ DO, առաջին բանը, որ պետք է անել, ձեր սերվերը պաշտպանելն է ագրեսիվ արտաքին աշխարհից։ Ես ոչինչ չեմ ապացուցի կամ պնդեմ, ես պարզապես ցույց կտամ իմ վիրտուալ սերվերի /var/log/messages log-ը.

ScreenshotCD-ի կարգավորում gitlab-ի միջոցով

Նախ տեղադրեք ufw firewall-ը.

apt-get update && apt-get install ufw

Միացնել կանխադրված քաղաքականությունը՝ արգելափակել բոլոր մուտքային կապերը, թույլատրել բոլոր ելքային կապերը.

ufw default deny incoming
ufw default allow outgoing

Կարևոր է. մի մոռացեք թույլ տալ կապը ssh-ի միջոցով:

ufw allow OpenSSH

Ընդհանուր շարահյուսությունը հետևյալն է. Թույլատրել կապը նավահանգստում. ufw allow 12345, որտեղ 12345-ը պորտի համարն է կամ ծառայության անվանումը: Մերժել՝ ufw deny 12345

Միացնել firewall-ը.

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 daemon-ը.

sudo systemctl reload sshd

Այժմ, եթե դուք կամ մեկ ուրիշը փորձի մուտք գործել որպես root, այն չի հաջողվի:

Հաջորդը, մենք տեղադրում ենք dockerd, ես այստեղ չեմ նկարագրի գործընթացը, քանի որ ամեն ինչ արդեն կարող է փոխվել, հետևեք պաշտոնական կայքի հղմանը և անցեք ձեր վիրտուալ մեքենայի վրա դոկերի տեղադրման քայլերը. https://docs.docker.com/install/linux/docker-ce/debian/

Վկայականի ստեղծում

Docker daemon-ը հեռակա կարգով կառավարելու համար անհրաժեշտ է գաղտնագրված TLS կապ: Դա անելու համար դուք պետք է ունենաք վկայագիր և բանալի, որը դուք պետք է գեներացնեք և փոխանցեք ձեր հեռակառավարվող սարքին: Հետևեք այն քայլերին, որոնք տրված են Docker-ի պաշտոնական կայքում տեղադրված հրահանգներում. 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 գրացուցակում:

դոկերի կարգավորում

Docker daemon startup script-ում հեռացրեք -H df:// ընտրանքը, այս տարբերակը ցույց է տալիս, թե որ հոսթի վրա կարող է կառավարվել docker daemon-ը:

# 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-ում շարունակական առաքման կարգավորում

Որպեսզի gitalab-ի աշխատողը կարողանա հրամաններ կատարել հեռավոր դոկերի հոսթի վրա, դուք պետք է որոշեք, թե ինչպես և որտեղ պահել վկայականները և կոդավորված կապի բանալին dockerd-ին: Ես լուծեցի այս խնդիրը՝ պարզապես գրելով gitlbab-ի կարգավորումներում գտնվող փոփոխականներին.

սփոյլերի վերնագիրCD-ի կարգավորում gitlab-ի միջոցով

Պարզապես թողարկեք վկայագրերի բովանդակությունը և բանալին cat-ի միջոցով. 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 log-ը, ձեռքսեղմման հետ կապված սխալ կա: Ես որոշեցի նայել, թե ինչ է սովորաբար պահվում փոփոխականներում, դրա համար դուք կարող եք տեսնել cat -A $DOCKER_CERT_PATH/key.pem: Սխալը հաղթահարվեց՝ ավելացնելով tr-d 'r' նիշի հեռացումը:

Ավելին, դուք կարող եք ձեր հայեցողությամբ սցենարին ավելացնել հետթողարկման առաջադրանքներ: Դուք կարող եք ստուգել աշխատանքային տարբերակը իմ պահոցում https://gitlab.com/isqad/gitlab-ci-cd

Source: www.habr.com

Добавить комментарий