spinor72 Infra repository
Подключиться через хост bastion можно, например, такого вида командой:
ssh -i ~/.ssh/appuser -o ProxyCommand="ssh -i ~/.ssh/appuser -W %h:%p [email protected]" [email protected]
Для подключения простой командой вида ssh someinternalhost нужно воспользоваться возможностями файла конфигурации ssh.
Например, создать файл ~/.ssh/config (если он еще не создан)
и добавить в него содержимое:
Host bastion
Hostname 35.204.145.242
User appuser
IdentityFile /home/spa/.ssh/appuser
Host someinternalhost
Hostname 10.164.0.3
User appuser
IdentityFile /home/spa/.ssh/appuser
ProxyCommand ssh bastion -W %h:%p
bastion_IP = 35.204.145.242
someinternalhost_IP = 10.164.0.3
- Основное ДЗ
- Дополнительные задания
- Создан инстанс reddit-app
- Установлены пакеты ruby, bundle и mongodb
- Тестовое приложение загружено из репозитория.
- Установлены зависимости
- Проверена работа тестового приложения
- Сделаны скрипты , автоматизирующие указанные выше действия
- для запуска из инстанса
install_ruby.sh,install_mongodb.sh,deploy.sh - для автоматического развёртывания
reddit-app-init.sh,startup-script.sh
- для запуска из инстанса
- Запустить скрипт
reddit-app-init.sh
- Проверить скриптом
reddit-app-check.sh,что сервис отвечает (скрипт должен определеить ip-адрес созданного инстанса и проверить ответ сервера на код 200) - Перейти по ссылке http://35.204.145.242:9292 . Должен открыться сайтик, на котором можно зарегистрироваться, и написать сообщение.
После проверки, удалить созданный инстанс и правила файвола можно скриптом reddit-app-cleanup.sh
gcloud compute instances create reddit-app\
--boot-disk-size=10GB \
--image-family ubuntu-1604-lts \
--image-project=ubuntu-os-cloud \
--machine-type=g1-small \
--tags puma-server \
--restart-on-failure \
--metadata-from-file startup-script=./startup-script.shgcloud compute firewall-rules create default-puma-server\
--allow=tcp:9292 \
--description="Access puma server from external network"\
--source-ranges=0.0.0.0/0\
--target-tags=puma-server testapp_IP = 35.204.145.242 testapp_port = 9292
- Основное ДЗ
- Задания со *
- скрипты от предыдущего задания перенесены в папку
config-scripts - В папке packer созданы конфигурационные файлы
ubuntu16.jsonиimmutable.jsonдля создания образа ВМ с помощью packer - Файлы параметризованы, пример установки параметров в
variables.json.example - В папке
packer/scriptsразмещены скрипты для установки ruby, mongodb и деплоя тестового приложения - В папке
packer/filesразмещен systemd юнит для сервиса тестового приложения - Проверена работа утилиты Packer по созданию образа ВМ
- Проверена работа ВМ созданной на основе полученного таким способом образа.
- перейти в папку packer
- В папке packer Создать файлик
variables.jsonс нужными значениями переменных (за образец взятьvariables.json.example) - Создать образ командой
packer build -var-file=variables.json immutable.json - Создать ВМ скриптом
config-scripts/create-reddit-vm.sh
- Проверить скриптом
check-reddit-vm.sh(в папкеconfig-scripts) ,что сервис отвечает (скрипт должен определить ip-адрес созданного инстанса и проверить ответ сервера на код 200) - Перейти по ссылке http://:9292 . Должен открыться сайтик, на котором можно зарегистрироваться, и написать сообщение.
После проверки, удалить созданный инстанс и правила файвола можно скриптом config-scripts/delete-reddit-vm.sh
- Основное ДЗ
- Задания со *
- Задание с **
- Установлен terrafrom
- В папке репозитории в папке terraform созданы конфигурационные файлы для запуска на основе (подготовленного ранее с помощью packer) базового шаблона ВМ и развертывания тестового приложения.
- Продекларированы входные переменные в файле
variables.tfи выходные вoutputs.tf - Рабочие файлы, генерируемые terraform занесены в список .gitignore
- В папке
terraform/filesразмещен скрипт для развертывания тестового приложения и systemd юнит для соответствующего сервиса - Проверена работа terrafrom по созданию и изменению инфраструктуры и корректность работы тестового приложения
- Для задания со * проверена работа terrafrom по созданию и изменению метаданных проекта на примере ssh ключей.
- Если использовать ресурс типа
google_compute_project_metadata_itemто все ключи заменяются terraform-ом - Если использовать ресурс типа
google_compute_project_metadataто при наличии ранее созданных ключей terrafrom не добавляет ключи
- Если использовать ресурс типа
- Для задания с ** в конфигурацию добавлен балансировщик и проверена корректность его работы. Несколько инстансов можно создать "вручную" (методом copy-paste) , но лучше использовать параметр
count, поскольку это предотвращает дублирование кода.
- В папке terraform Создать файлик
terrafrom.tfvarsс нужными значениями переменных (за образец взятьterrafrom.tfvars.example) - Перейти в папку terraform и инициализировать среду командой
terrafrom init - Просмотреть план командой
terrafrom planи убедиться в корректности манипуляций, предлагаемых Terraform - Запустить процесс создания инфраструктуры командой
terraform apply
- С помощью команды
terraform outputузнать ip-адрес балансировщика - Открыть в браузере страничку с этим адресом и портом 9292 и проверить работу тестового приложения
- Подключиться к одному из запущенных инстансов и убедиться что при остановке сервиса puma (
systemctl stop puma) по прежнему тестовое прилодение доступно на адресе балансировщика, в тоже время на адресе инстанса сервер не отвечает.
После проверки, удалить созданное командой terraform destroy
- Основное ДЗ
- Задания со *
-
С помощью утилиты packer созданы базовые образы:
- reddit-db-base для сервера базы данных mongo
- reddit-app-base для сервера приложений на базе ruby
-
В конфигурацию terraform импортировано правило файвола для подключения по ssh
-
Добавлен ресурс для присвоения статического адреса серверу тестового приложения
-
Произведено структурирование конфигурации и разделение на модули
app,dbиvpc, соответствующие конфигурации модулей размещены в подпапках terraform/modules. Добавлены переменные для модулей. -
Для проверки механизма переиспользования с помощью модулей, настроено два окружения prod и stage в папках
terraform/prodиterraform/stageсоответственно, использующие разные параметры для развертывания (на примере правила файвола) -
С помощью модуля
SweetOps/storage-bucket/googleиз удаленного реестра созданы бакеты -
Для задания со * в окружении prod настроено хранение состояния в бэкэнде Google Cloud Storage и проверена работа блокировки
-
Для второго задания со * настроен провизионер в отдельном модуле
deployдля развертывания тестового приложения. В модульdeployпередается ip-адрес инстанса на котром должно быть развернуто прилоджение и ip-адрес сервера MongoDB для хранения данных приложения, который прописывается в переменную средыDATABASE_URLМодуль db снабжен провизионером для правки конфигурации mongo чтобы разрешить внешние подключения к базе.
Описание для окружения prod ( stage - аналогично)
- В папке terraform/prod Создать файлик
terrafrom.tfvarsс нужными значениями переменных (за образец взятьterraform/prod/terrafrom.tfvars.example) - Перейти в папку terraform/prod и инициализировать среду командой
terrafrom init - Просмотреть план командой
terrafrom planи убедиться в корректности манипуляций, предлагаемых Terraform - Запустить процесс создания инфраструктуры командой
terraform apply
- С помощью команды
terraform outputузнать ip-адрес сервера с тестовым приложениемapp_external_ip - Открыть в браузере страничку с этим адресом и портом 9292 и проверить работу тестового приложения
После проверки, удалить созданное командой terraform destroy
- Основное ДЗ
- Задание со *
- С помощью terrafrom из окружения stage развернуто 2 тестовых инстанса app и db.
- Установлен
ansible. Настроен конфигурационный файл. Проверен доступ с помощью модуляping - Сделаны инвентори в текстовом формате и в YAML-формате
- Проверена работа модулей
shellиcommandи разница в их использовании - Проверена работа модуля
gitи его отличие от вызова git в модулеcommand - Проверена работа c плейбуками на примере плейбука для клонирования git-репозитория с тестовым приложением.
Плейбук восстанавливает клон репозитория, если его полностью удалить. Если внести изменения в клонированном репозитории, то модуль не выполнится, для принудительного выполнения, нуждно добавить в модуль парамтер
force: true - Для задания со * сделан инвентори в формате JSON и python-скрипт
json2inventory.pyдля вывода в соответствии с документацией https://docs.ansible.com/ansible/latest/dev_guide/developing_inventory.html
Подготовить инфраструктуру: В папке terraform/stage
- создать файлик
terrafrom.tfvarsс нужными значениями переменных (за образец взятьterraform/stage/terrafrom.tfvars.example) - инициализировать среду командой
terrafrom initи создать инфраструтуруterraform apply - узнать ip-адреса тестовых интсансов app и db с помощью
terraform output. - убедиться, что инстанcы доступны по ssh с ключом appuser-а
Поправить инвентори-файлы ansible/inventory и ansible/inventory.yml заменив ip-адреса на соответствующие созданным тестовым инстансам
- Перейти в папку ansible
- Проверить, что ansible может подключиться к хостам используя разные файлы инвентори командой:
ansible all -m pingдля текстового инвентори (имя файла прописано вansible.cfg)ansible all -m ping -i inventory.ymlдля инвентори в формате YAML
- Проверить работу плейбука командой
ansible-playbook clone.yml - Для проверки задания со * поменять ip-адреса в файле
inventory.jsonи проверить работу командойansible all -m ping -i json2inventory.py
После проверки, удалить созданные в окружении stage инстансы командой terraform destroy
- Основное ДЗ
- Задание со *
- Изменен провижининг в packer. Теперь при создании с помощью packer образов
reddit-app-basereddit-db-baseдля провижининга используются плейбуки ansible - Рассмотрены несколько подходов к созданию плейбуков и сценариев:
reddit_app_one_play.ymlОдин playbook, один сценарий , подход неудобен, особенно при большой инфраструктуре, поскольку необходимо запускать, явно указывая теги и хосты (--limitи--tags).reddit_app_multiple_plays.ymlОдин плейбук, несколько сценариев. В этом случае необходимо запускать указывая только теги.site.ymlНесколько плейбуков , объединныных с помощью include в главный плейбук. Теги уже не нужны. Можно переиспользовать плейбуки по-разному их объединяя.
- Для удобства формирования inventory после пересоздания инфраструктуры терраформом добавил output-переменную, в которую терраформ запишет в формате yaml данные inventory.
- Для задания со * написан концепт python-скрипта для динамического инвентори из state-файла терраформа, размещенного в бекенде. Для формирования данных в папку с модулями terrafrom добавлен модуль
ansible, представляющий из себя null-resource c переменными. В stage-окружении терраформа добавлен удаленный бекенд для хранения конфигурации и конфигурационный файлansible.tfдля формирования данных для динамического inventory.
Подготовить с помощью packer новые образы, использующие ansible для провижининга, запустив из корня репозитория команды :
packer build -var-file=packer/variables.json packer/app.json
packer build -var-file=packer/variables.json packer/db.json
Для того, чтобы провижининг сработал, необходимо чтобы в файволе имелось правило , разрешающее доступ по ssh
В папке terraform/stage
- создать файлик
terrafrom.tfvarsс нужными значениями переменных (за образец взятьterraform/stage/terrafrom.tfvars.example) - инициализировать среду командой
terrafrom initи создать инфраструктуруterraform apply - обновить инвентори для ansible
terraform output inventory_yml > ../../ansible/inventory.yml
stage теперь хранит стейт в бакете storage-bucket-spinor-test его нужно создать, если не создан ранее
В папке ansible запустить идин из вариантов:
- Один playbook, один сценарий
ansible-playbook reddit_app_one_play.yml --tags db-tag --limit db
ansible-playbook reddit_app_one_play.yml --tags app-tag --limit app
ansible-playbook reddit_app_one_play.yml --tags deploy-tag --limit app
- Один плейбук, несколько сценариев
ansible-playbook reddit_app_multiple_plays.yml --tags db-tag
ansible-playbook reddit_app_multiple_plays.yml --tags app-tag
ansible-playbook reddit_app_multiple_plays.yml --tags deploy-tag
- Несколько плейбуков , объединныных с помощью include в главный плейбук
ansible-playbook site.yml
Для пересоздания инфраструктуры, между запусками вариантов, можно использовать скриптик refresh-infra.sh :
cd ../terraform/stage
terraform destroy -auto-approve=true
terraform apply -auto-approve=true
terraform output inventory_yml > ../../ansible/inventory.yml
cd ../../ansible
Для проверки скрипта динамического инвентори поменять в ansible.cfg параметр inventory на значение ./state2inventory2.py
- Узнать из inventory или terraform output внешний адрес app сервера.
- Перейти в браузере на страничку с таким адресом и портом 9292
- Должен открываться интерфейс тестового приложения, в котором можно залогиниться и написать сообшение.
После проверки, удалить созданные в окружении stage инстансы командой terraform destroy