Skip to content

Otus-DevOps-2022-05/hokum83_infra

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

hokum83_infra

hokum83 Infra repository

ДЗ-11

Что сделано:

  • установлен vagrant и molecule
  • создан файл Vagrant, выполнена проверка работы
  • настроен провижонинг ansible для dbserver, выполнена проверка работы
  • выполнена доработка ролей db и app, выполнена проверка работы
  • выполнена параметризация ролей, выполнена проверка работы
  • выполнена проверка работы vagrant, в результате получил работающее приложение на порту 9292
  • в плейбук app.yml перенесены параметры nginx_sites из group_vars для правильного кофигурирования реверс прокси, выполнена проверка работы
  • выполнена проверка работы vagrant, в результате получил работающее приложение на порту 80
  • выполнена настройка окружения virtualenv, установлены необходимые программы
  • выполнена инициализация molecule для роли db, добавлены тесты
  • создана вм для проверки роли, выполнено тестирование
  • создан тест для проверки работы монго на порту 27017
  • провиженеры в плейбуках для packer перенастроены на использование ролей

ДЗ-10

Что сделано:

  • создана структура ролей app и db через ansible-galaxy init, из плейбуков в роли перенесены таски, хендлеры, шаблоны, файлы. Выполнена проверка работы
  • созданы отдельные директории для окружений prod и stage, туда перенесены отдельные инвентари и переменные групп
  • файлы плейбуков перенесены в отдельную диреторию playbooks, старые файлы - в директорию old
  • выполнена проверка работы ансибл на обоих окружениях
  • добавлен роль jdauphant.nginx из ansible-glaxy, добавлен вызов роли jdauphant.nginx в плейбуке app.yml, выполнена проверка работы роли и проверка работы приложения через прокси. Порт 80 не открывал, надобности не было (фаервол итак отключен)
  • создан ключ шифрования vault.key, ключом зашифрованы переменные плейбука создания пользователей, выполнена проверка работы
  • включено использование динамического инвентори с помощью плагина из прошлого ДЗ

ДЗ-9

Что сделано:

  • Создан плейбук и шаблон для настройки параметров БД, заданы переменные, выполнен прогон
  • добавлен хендлер для перезапуска СУБД
  • в плейбук добавлены таски для запуска приложения, выполнен прогон
  • в плейбук добавлены таски деплоя приложения
  • в плейбук разделен на отделеные сценарии для настройки БД, сервера приложения и деплоя, выполнен прогокаждого сценария и проверка работы приложения
  • один большой плейбук разделен на отдельные плейбуки под каждый сценарий, выполнен прогон и проверка работы приложения
  • скопирован плагин из PR в ~/.ansible/plugins/inventory, изучена документация, плагин включен в ansible.cfg
  • через pip установил пакет yandexcloud версии 0.10.1 (требования в документации)
  • в директории ansible создан файл inv.yc.yml (плагин ищет файлы *yc.yml), в которм заданы необходимые параметры для подкючения к яндекс облаку и параметры группировки (попробовал как keyed_groups так и groups)
  • проверена работа плагина командой ansible-inventory -i inv.yc.yml --list
  • перенастроен провиженинг в пакере с помощью ansible
  • выполнена подготовка образов пакером, развертывание окружения терраформом, конфигурирование серверов ансиблом с помощью динамического инвентори и плагина, проверка работы приложения

ДЗ-8

Что сделано:

  • Поднято окружение stage через terraform
  • создан файл inventory в формате ini выполнена проверка работы ping через ansible
  • выполнены настройки файла ansible.cfg, файл inventory зачищен от избыточных параметров
  • хосты сгруппированы в файле inventory по назначению, выполнена проверка через пинг группы хостов
  • создан файл inventory в формате yaml, проверена работа
  • выполнена проверка работы модулей command, shell, bash: проверена установка необходимых компонентов, выполнено клонирование приложения через модуль git
  • написан плейбук для клонирования приложения на апп сервер
  • создан скрипт yc-inventory.sh на bash для формирования динамического инвентори в формате json. Информация берется через yc compute, затем парсится утилитой jq (требуется дополнительно установить из репозитария дистрибутива, я использовал версию 1.6). Задавать любые необходимые группы для инвентори можно через массив types в скрипте. Так же предусмотрены варианты когда массив пустой (делается вывод всех хостов), либо существуют хосты, которые не входят в группы - в этом случае эти хосты попадают в корневой справочник hosts (ungrouped в статическом варианте). Проверена работа скрипта через запуск модуля ping как всех хостов (all), так и отдельных групп и хостов
  • ansible.cfg перенастроен на использование инвентори с помощью скрипта yc-inventory.sh

ДЗ-7

Что сделано:

  • создана сеть через terraform, определена неявная зависимость от нее при создании вм приложения
  • блоки создания вм приложения и бд, а так же блок создания сети вынесены в отдельные файлы
  • блоки создания вм вынесены в модули
  • созданы отдельные папки для создания окружений prod и stage с ссылками на созданные модули
  • удалены не нужные файлы в корневой директории проекта, выполнено форматирование
  • настроен бэкенд для хранения конфиграции состояния в s3 (backend.tf.example в папках stage и prod)
  • папка stage была задублирована, выполнено одновременный запуск развертывания окружения stage из разных мест - блокировка отработала корректно
  • в модули добавлены провиженоры для развертывания приложения и передачи переменной окружения DATABASE_URL на сервер приложений, настроены зависимости модуля развертывания сервера приложений от модуля сервера бд

ДЗ-6

Что сделано:

  • создана сервисная УЗ и ключ для подключения из terraform в YC
  • подготовлен проект развертывания вм в YC с помощью terraform
  • настроены провиженеры для запуска приложения puma в вм
  • некоторые входные параметры вынесены в файл переменных (примеры в terraform/terraform.tfvars.example)
  • опеределена переменная для приватного ключа и зоны, выполнено форматирование через terrafirm ftm
  • создан файл для создания образа вм балансировщика lb.tf, настроена автоматизация установки необходимого ПО и передача в вм конфигурции nginx
  • изменена конфигурация main.tf для развертывания нескольких серверов приложений через параметр count

ДЗ-5

Что сделано:

  • настроены билдеры для файла создания образа packer в yc packer/ubuntu16.json
  • настроены провиженеры для файла создания образа packer в yc packer/ubuntu16.json (2 скрипта установки монго и руби)
  • некоторые параметры вынесены в файл переменных (примеры в packer/files/variables.json.examples)
  • создан скрипт установки всех зависимостей, приложения и запуска приложения через юнит systemd - packer/scripts/prepare.sh
  • создан файл для создания образа со всеми зависимостями и установленным приложением - packer/immutable.json
  • создан скрипт развертывания вм из созданного пакером образа - config-scripts/create-reddit-vm.sh
  • выполнено тестовое развертывание образа и вм на его основе

ДЗ-4

Адреса ВМ

testapp_IP = 51.250.84.202
testapp_port = 9292
Созданы скрипты:

  • install_mongodb.sh
  • install_ruby.sh
  • deploy.sh

Доп. задание - создание startup script

Как решить отдельным скриптом .sh и передачей его ВМ не понял и не нашел. Прошу пояснить. Задача выполнена через дополнительный файл cloud-config.yaml:

#cloud-config

users:

  • name: yc-user groups: sudo shell: /bin/bash sudo: ['ALL=(ALL) NOPASSWD:ALL'] ssh_authorized_keys:
    • ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDErYDY+AMTSeCOpu3kmU5mZYyu7XhcOZ8RuPXeWP2V4hSsfnNmtP4mkI45dpSySLPgwwItrp/HAXGP57dUeB47BZKp/L1Z/PW2ZY9KcA0u0NRgsB9GhfDpH7yTi4K9kSYgaNcobgT+ROMSfTci8pYVzFkfXUwjV5ktl3SOZJ1EdQGL2P8X11WXjKjwSO12mZikRdt0RdraGbdULDVZIOUm6/bUjJc+z32EPaWjnBIz6rmFEtKsr6kVTpNapmgKgUYmmjCadq/ytzNbtwNHzj41LqQqGrocjUzCGncXPz0ZrnG9z+vMvTqT0wM+9k/QWPhICVCU/Zmx+HMVV2eoI++zxhG/xLJ1nfczTplsWM41n849MEaSiSs+1EoZLWykhUEv83UBedgaxKDB/T1hZcnv93yZOw8hdVGEt7VBAkY35fit4eH6zoLEDYJ7Iiro00URqjT0fulm23Xs6gIzGXPQlyAEzA1vKhTsUu8Wv9mdRuBLCl1VQ4RR8reMAoVyXYM= appuser

runcmd:

  • sudo apt update
  • sudo apt install -y ruby-full ruby-bundler build-essential mongodb-server git
  • sudo systemctl enable mongodb
  • sudo systemctl start mongodb
  • mkdir /run/ruby-app
  • cd /run/ruby-app
  • git clone -b monolith https://github.com/express42/reddit.git
  • cd reddit && bundle install
  • puma -d
Команда создания инстанса:

yc compute instance create
--name reddit-app
--hostname reddit-app
--memory=4
--create-boot-disk image-folder-id=standard-images,image-family=ubuntu-1604-lts,size=10GB
--network-interface subnet-name=default-ru-central1-a,nat-ip-version=ipv4
--metadata serial-port-enable=1 --metadata-from-file user-data=./cloud-config.yaml





# ДЗ-3

## Адреса ВМ
bastion_IP = 51.250.91.111
\
someinternalhost_IP = 10.128.0.6
\
### Доп. задание - Подключение через **ssh someinternalhost**
Создать файл .ssh/config со следующим содержимым:

Host bastion HostName 51.250.91.111 User appuser IdentityFile ~/.ssh/appuser

Host someinternalhost HostName 10.128.0.6 User appuser ProxyJump bastion

### Доп. задание - Подключение сертификата LetsEncrypt
Задать доменное имя сервера 51-250-91-111-sslip.ip в настройках pritunl в разделе Lets Encrypt Domain. \
Адрес - [https://51-250-91-111-sslip.ip/](https://51-250-91-111-sslip.ip/)