Деплой ansible и gitlab-ci.yml
Создаем ssh ключ для соединение с удаленным сервере где будет разворачиваться контейнер
# на локалке создаем ключ
ssh-keygen -t ed25519 -f gitlab_deploy_key -C "gitlab-ci-deploy"
ls -l gitlab_deploy_key*
# gitlab_deploy_key ← приватный ключ
# gitlab_deploy_key.pub ← публичный ключs -l gitlab_deploy_key*
Добавляем переменные в gitlab
GitLab → CI/CD Variables
# Значение из: cat ~/.ssh/gitlab_deploy_key
SSH_PRIVATE_KEY =
### Пример
#-----BEGIN OPENSSH PRIVATE KEY-----
#...
#-----END OPENSSH PRIVATE KEY-----
На целевой тачке добавляем ключ
# читаем публичный ключ и добавлям его на удаленную тачку
# Локально (читаем сгенерированный ключ)
cat gitlab_deploy_key.pub
# На целевой тачке
echo "СОДЕРЖИМОЕ КЛЮЧА" >> ~/.ssh/authorized_keys
В проекте создаем структуру
.
├── ansible/
│ ├── inventory.yml
│ └── deploy.yml
└── .gitlab-ci.yml
ansible/inventory.yml
all:
hosts:
target:
ansible_host: "{{ lookup('env','DEPLOY_HOST') }}"
ansible_user: "{{ lookup('env','DEPLOY_USER') }}"
ansible_ssh_private_key_file: "{{ lookup('env','HOME') }}/.ssh/id_ed25519"
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
ansible/deploy.yml
- hosts: targets
become: true
vars:
image: "{{ lookup('env', 'IMAGE_APP') }}"
registry: "{{ lookup('env', 'CI_REGISTRY') }}"
registry_user: "{{ lookup('env', 'CI_REGISTRY_USER') }}"
registry_pass: "{{ lookup('env', 'CI_REGISTRY_PASSWORD') }}"
tasks:
- name: Login to registry
docker_login:
registry_url: "{{ registry }}"
username: "{{ registry_user }}"
password: "{{ registry_pass }}"
- name: Pull image
docker_image:
name: "{{ image }}"
source: pull
force_source: true
- name: Run container
docker_container:
name: app
image: "{{ image }}"
restart_policy: always
state: started
recreate: true
.gitlab-ci.yml
stages:
- deploy
deploy:
stage: deploy
image: python:3.11
variables:
ANSIBLE_HOST_KEY_CHECKING: "False"
before_script:
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_ed25519
- chmod 600 ~/.ssh/id_ed25519
- echo "Target host ${DEPLOY_HOST} "
- ssh-keyscan -H $DEPLOY_HOST >> ~/.ssh/known_hosts
script:
- ansible --version
- ansible-playbook -i ansible/inventory.yml ansible/deploy.yml
rules:
# Deploy to production on master branch
- if: '$CI_COMMIT_BRANCH == "master"'
variables:
DEPLOY_HOST: 10.10.10.111
DEPLOY_USER: root
- if: '$CI_COMMIT_BRANCH == "staging"'
variables:
DEPLOY_HOST: 10.10.10.222
DEPLOY_USER: root
0 2
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()