Как работает деплой данного сайта
Как я уже писал выше деплой данного сайта происходит автоматически из приватного репозитория github-а с помощью девопс-инструмента ansible.
Почему именно он? Просто при переходе на очередную новую работу нужно было обязательно его изучить для применения непосредственно в рабочей деятельности. Ну, а когда изучишь новую технологию, становится трудно остановиться и не начать использовать ее просто везде. Но тут, как мне кажется, это оправдано. Деплой же, чем еще как не им? (да, да, я знаю что можно много еще чем)
Но, к черту пустые разглагольствования!
Как все устроено
Для начала ставим ансибл (инструкций можно тонны наковырять в интернетах). Я тупо воспользовался
pip install ansible
Затем сделал себе в домашнем каталоге каталог ansible, где и написал всё необходимое для запуска плейбука деплоя. Всё необходимое вылилось буквально в три файлика:
- ansible.cfg
- deploy.yml
- hosts.txt
ansible.cfg
[defaults]
inventory = ./hosts.txt
interpreter_python = auto_legacy_silent
Здесь самое важное в параметре inventory. Т.е. где искать собственно инвентори при запуске плейбука. В данном случае обращаюсь к локальному файлу hosts.txt, где и описаны мои хосты и их параметры, к которым и которые соответственно необходимо применить при выполнении плейбука.
hosts.txt
[local]
localhost ansible_connection=local
Здесь просто описываю localhost, как хост на котором буду выполнять все действия. Соединение с локальным хостом, естественно тоже local. Если бы делал не локально, тогда, конечно же пришлось бы описывать протоколы соединения с хостом.
Ну и, самое главное, - плейбук в deploy.yml
---
- name: Clone a private repository for site structure
hosts: local
become: no
tasks:
- name: Clone site
git:
repo: git@github.com:NetMoose/netmoose.ru.git
version: master
dest: /home/netmoose/netmoose.ru
accept_hostkey: yes
notify: Execute HUGO
handlers:
- name: Execute HUGO
shell: /usr/local/bin/hugo -d /var/www/html
args:
chdir: /home/netmoose/netmoose.ru
В начале описываем наименование плейбука, на каких хостах запускать (hosts: local), что повышенных привилегий нам не требуется (become: no).
Далее описываем ровно одну таску в секции tasks и один хендлер, который будет выполняться через механизм нотификаций, если таска вернула changed == true.
В таске пытаемся склонировать (точнее конечно спуллить) репозиторий сайта с гитхаба. Если произошли какие-то изменения, о чем нам скажет параметр changed (про это можно в доках ансибла прочитать, там крайне подробно описано), то в качестве нотификации запускаем хендлер “Execute HUGO”, в котором с помощью модуля shell запускается генератор статических сайтов - hugo с параметром -d, в котором можно указать каталог для размещения сгенерированного сайта. В данном случае стандартный для Ubuntu /var/www/html.
Запустив ansible-playbook deploy.yml
, видим (если есть изменения) примерно такое:
python[13415]: ansible-git Invoked with bare=False remote=origin executable=None dest=/home/netmoose/netmoose.ru update=True force=False ssh_opts=None clone=True verify_commit=False version=master recursive=True repo= archive=None track_submodules=False refspec=None reference=None key_file=None depth=None gpg_whitelist=[] accept_hostkey=True separate_git_dir=None umask=None
ansible-playbook[13319]: changed: [localhost]
ansible-playbook[13319]: RUNNING HANDLER [Execute HUGO] *************************************************
python[13463]: ansible-command Invoked with warn=True chdir=/home/netmoose/netmoose.ru executable=None _uses_shell=True _raw_params=/usr/local/bin/hugo -d /var/www/html removes=None stdin_add_newline=True stdin=None strip_empty_ends=True creates=None argv=None
ansible-playbook[13319]: changed: [localhost]
ansible-playbook[13319]: PLAY RECAP *********************************************************************
ansible-playbook[13319]: localhost : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
В каталоге /var/www/html получаем наш сайт. Хостится он у меня с помощью nginx, это уж описывать не буду, там все стандартно для статических сайтов.
А вот что опишу - так это механизм автоматического запуска получившегося плейбука. Использую для этого systemd (21 век на дворе как-никак).
Создаем в /etc/systemd/system/ два файлика:
- deploysite.service
- deploysite.timer
Первый описывает наш сервис, который в данном случае просто запуск ansible-playbook deploy.yml
[Unit]
Description=Deploy site from git
Wants=deploysite.timer
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ansible-playbook deploy.yml
WorkingDirectory=/home/netmoose/ansible
User=netmoose
Group=netmoose
[Install]
WantedBy=multi-user.target
Но зависящий от deploysite.timer, который выглядит так. Он запускается как таймер, срабатывающий каждые 5 минут и запускающий deploysite.service
[Unit]
Description=Deploy site from github
Requires=deploysite.service
[Timer]
Unit=deploysite.service
OnCalendar=*:0/5
[Install]
WantedBy=timers.target
Включаем его через команду systemctl enable deploysite.timer
и, собственно это все. Наш гит-репозиторий автоматически проверяется каждые 5 минут на изменения, если они есть - они выкачиваются и применяются запуском плейбука ансибл.