Как работает деплой данного сайта

Как я уже писал выше деплой данного сайта происходит автоматически из приватного репозитория github-а с помощью девопс-инструмента ansible.

Почему именно он? Просто при переходе на очередную новую работу нужно было обязательно его изучить для применения непосредственно в рабочей деятельности. Ну, а когда изучишь новую технологию, становится трудно остановиться и не начать использовать ее просто везде. Но тут, как мне кажется, это оправдано. Деплой же, чем еще как не им? (да, да, я знаю что можно много еще чем)

Но, к черту пустые разглагольствования!

Как все устроено

Для начала ставим ансибл (инструкций можно тонны наковырять в интернетах). Я тупо воспользовался

pip install ansible

Затем сделал себе в домашнем каталоге каталог ansible, где и написал всё необходимое для запуска плейбука деплоя. Всё необходимое вылилось буквально в три файлика:

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/ два файлика:

Первый описывает наш сервис, который в данном случае просто запуск 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 минут на изменения, если они есть - они выкачиваются и применяются запуском плейбука ансибл.



Автоматизация деплоя сайта Автор: NetMoose Когда: 12.02.2022

Categories: Blog Tags: blog automatisation