Деплой 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

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Наверх