Skip to content

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Дисклеймер

Простите за столь скомканный README, так как пишу его в сжатые сроки и я когда-нибудь к нему вернусь и опишу подробнее. Сейчас же для полноценного запуска инфраструктуры с помощью моего проекта, нужно более глубокое погружение в код после прочтения README. Также обращаю ваше внимание, что README описано по возможности на простом языке о том, как пользоваться репозиторием, который уже настроен. Для настройки и использования вам необходимо понимать основы Ansible.

Ansible

Как это работает?

Вы создаете или используете директорию с именем проекта. В эту директорию добавляете yml файл, который должен быть назван также как публичный домен сервера, по которому, например, вы делаете ssh. Например: Обычно вы подключаетесь к серверу так: ssh domain.com Тогда смело создавайте файл с именем domain.com.yml Этот файл представляет собой укороченную версию docker-compose. Например, вы можете создать docker-compose с любым docker'ом по этому примеру:

apps:
  example-container-name:
  container_name: any_name
  image: any-image:any-tag
  proxy_port: 2901 # private container port for nginx proxy config
  volumes:
    - "/custom/dir:/any/dir"
  ports:
    - "5000:5000"
  logging: no # Enable docker logging
  entrypoint: |-
    - sh
    - -euc
    - |
      mkdir -p example

Примечание: В примеры указаны все возможные функции, вам же может быть достаточно двух image и proxy_port если потребуется.

А также использовать уже подготовленные конфигурации инфраструктурных приложений, например:

defaults:
  nginx:
  mongo:
    limit: # Обычно докер лимит RAM для mongo - 2GB, но вы можете переопределить этот лимит здесь, как это сделанно для example.domain.com
  promtail:
  rabbitmq:
  prometheus:

Пример такого YML-файла вы можете увидеть в директории server или же в compose.yml для local installation.

Common things

  1. Как настроена архитектура ansible. В данном проекте Ansible создано 2 роли. Первая - base_role(ansible/roles/base_role), которая отвечает за базовую настройку сервера - репозитории, установки пакетов, создание пользователей, установка сертификатов и т.д. Вторая роль это DEV роль - dev_app(ansible/roles/dev_app)
  2. Как создаются пользователи. Пользователи, которых необходимо создать, указываются в файле ansible/roles/base_role/defaults/users.yml. Пользователи создаются с помощью ansible task в базовой роли. Пример такого пользователя:
    itbot:
    groups: [ 'admin', 'adm', 'users' ]
    key: 'sshkey~'
  1. Создание приложений с помощью docker-compose. Для сервера необходимо создать одноименный файл с расширением yml в ЛОКАЛЬНОМ запуске compose.yml или в remote запуске в директории например server если вы собираетесь запускать CI/CD. Например: example.com.yml. В данном файле как минимум должны быть указаны строки:

    defaults:
      nginx:
    

    Чтобы добавить докер приложение на сервер, необходимо указать блок, начинающийся с [apps]. После чего указать нужные приложения. Так как для web-приложений требуется nginx, мы добавляем их в [defaults].

    У каждого приложения есть свои стандартные параметры, которые нужны для docker-compose. Например: image - указывается версия docker'а приложения; ports - порт, на котором работает приложение в докере; environment - указание переменных, направляемых в докер; а также command и т.п; volumes - чтобы прокинуть директории с сервера в докер; entrypoint - добавить кастомный entrypoint; Также для приложение можно и нужно указать docker memory limit. Например

  deploy:
    resources:
      limits:
        memory: 1G

Но для каждого приложения можно, а иногда нужно, указать инфраструктурный параметр, называющийся proxy_port - этот порт необходим в случае прокси порта для nginx. Пример porxy_port: 3000 когда например веб приложение в контейнере запущено на 3000 порте. Эта настройка используется для создания nginx конфигов(ansible/roles/dev_app/templates/nginx). Например, если ваш докер запускает веб-приложение на 80 порту, вам необходимо указать proxy_port: 80 тогда nginx будет знать о том, какой upstream и proxy_pass создать в template nginx site

Ansible vault

ansible-vault create secrets.yml
New Vault password: testpassword
Confirm New Vault password: testpassword

Features

Автоматическая генерация Ansible Inventory благодаря скрипту inventory_builder.py. Собственно берется лист из yml файлом. Создается секция [All], [aws], [<Project group>]. Автоматическая генерация секции, например вы создаете сервера в AWS регионе [us-east-1] позволяет сделать group_vars директорию, например us-east-1, в которую можно поместить кастомные переменные для этого региона/проекта , а также разделить и секреты между регионами/проектами если это требуется.

Также, вам не нужно самостоятельно задавать приватный IP-адрес в docker-compose - он подберется самостоятельно из свободных. Также вы можете не беспокоиться о том, что вы попробуете использовать порт, который уже занят. Для этого в yml-файле укажите секцию ports таким образом:

      ports:
      - "1234"

For Remote installation

Для запуска тебе потребуется создать или воспользоваться уже имеющейся директории server. Там тебе предстоит создать или изменить YMl файл, который создаст docker-compose. Обрати внимание на то, что для запуска Ansible playbook, тебе необходимо создать inventory. Для этого в моем проекте есть inventory_builder.py. Подробнее описанно в ansible/inventory/README.md.

Local installation

Before you start. Prepare

You need configure inventory/local/group_vars/all/all.yml, e.g. you need to change

apps_root_path: /app # by default

To find out the path of your directory, you can exec following command

pwd

Git cloning this project and come to project directory and you can generate docker-compose locally

Preparation

echo "$(whoami) ALL=(ALL) NOPASSWD: ALL"
# Now you need to add output of the last command
sudo vim /etc/sudoers.d/20_user

Now you can run ansible playbook

Running Ansible Playbook on local machine

cd ${this_project_directory}/ansible

Далее вы можете запустить Base Role, если на вашем сервере/виртуальной машине ничего не установленно. Не работает для MacOS

   ansible-playbook -i inventory/local/hosts.ini --connection=local -v main.yml -e ansible_user=$(whoami) --vault-password-file password.txt

Следующей командой вы можете запустить Dev role с созданием автоматического docker-compose файла.

ansible-playbook -i inventory/local/hosts.ini --connection=local -v dev-role.yaml -e ansible_user=$(whoami) --vault-password-file password.txt

Но перед или после запуска Docker-compose вы можете столкнуться с проблемой, что nginx падает с ошибкой. Ему нужны SSL сертификаты. Сгенерировать их вы можете командами:

cd /etc/ssl/
sudo openssl genrsa -out example.com.key 2048
sudo openssl req -new -key example.com.key -out csr.pem
sudo openssl x509 -req -days 365 -in csr.pem -signkey example.com.key -out example.com.crt

Далее в сгенерированном docker-compose поменяйте путь до SSL-сертификатов для nginx.

Advanced level and Gitlab config

В моем проекте есть так example.gitlab-ci.yml в которым описаны ci/cd jobs для запуска ansible. Также оттуда вы можете подчеркнуть что-то важное для запуска, что я забыл указать в этом README.

About

Create docker-compose by yaml and templating

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages