f0rm4t Infra repository
Установка ruby и bundler вынесена в таски роли app. Установка MongoDB вынесена в таски роли db.
Добавлена конфигурация Vagrant для тестирования сценариев.
vagrant upДобавлены тесты для роли db (./ansible/roles/db):
molecule testОставлен один актуальный вариант конфигурации ansible
ansible-playbook playbooks/site.yml #stage env
ansible-playbook -i environments/prod/inventory playbooks/site.yml #prod envСтарые конфигурационные файлы перенесены в ./old.
Установка зависимостей:
ansible-galaxy install -r environments/stage/requirements.txtВ инстансах добавляются новые пользователи, данные которые находятся в зашифрованных файлах: ./environments/{prod,stage}/credentials.yml. Для расшифровки файлов требуется файл с ключем - vault.key
Добавлена несколько вариантов конфигурации ansible.
- Один сценарий в одном плейбуке:
ansible-playbook reddit_app_one_play.yml --limit app --tags app-tag
ansible-playbook reddit_app_one_play.yml --limit db --tags db-tag- Несколько сценариев в одном плейбуке:
ansible-playbook reddit_app_multiple_plays.yml --tags app-tag
ansible-playbook reddit_app_multiple_plays.yml --tags db-tag- Несколько сценариев в разных плейбуках:
ansible-playbook site.ymlPacker использует конфигурацию ansbile - packer_app.yml и packer_db.yml
Добавлена начальная конфигурация ansible с примерами inventory-файлов (директория ./ansible).
virtualenv venv
source venv/bin/activate
pip install -r requirements.txt
ansible all -m pingДобавлен файл генерации inventory в формате JSON, в который необходимо передать переменную окружения ENV:
ENV=stage ansible all -i inventory.py -m pingИнформация о состоянии инстансов хранится в бакете на GCS. Для создания бакетов необходимо применить конфигурацию из директории terraform, предварительно скопировав и изменив файл переменных terraform.tfvars.example
terraform init
terraform applyКонфигурация разделена на два окружения:
- prod -
terraform/prod - stage -
terraform/stage
В каждой из конфигураций имеется аналогичный пример файла переменных - terraform.tfvars.example.
Конфигурация инстансов приложения и БД вынесена в модули:
- app -
terraform/modules/app - db -
terraform/modules/db
Добавлена кофигурация для разворачивания инстанса с приложением через terraform.
Перед запуском необходимо скопировать файл terraform/terraform.tfvars.example в terraform/terraform.tfvars и внести в него необходимые изменения.
terraform plan
terraform applyВ директории packer находятся шаблоны для создания базового (ubuntu16.json) и immutable (immutable.json) образов. Пользовательские переменные, необходимые для сборки, доступны в примере packer/variables.json.example
Создание образов:
packer build -var-file=variables.json ubuntu16.json
packer build -var-file=variables.json immutable.jsonСоздание инстанса приложениия на GCP
./config-scripts/create-reddit-vm.shКонфигурация
testapp_IP = 35.195.34.12
testapp_port = 9292
Создание инстанса и запуск прииложения в GCP:
gcloud compute instances create reddit-app-2 \
--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.shСоздание правила для фаервола:
gcloud compute firewall-rules create default-puma-server \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:9292 \
--source-ranges=0.0.0.0/0 \
--target-tags=puma-serverПодключение ко внутренниму хосту (someinternalhost) с локальной машины
ssh -o ProxyCommand='ssh -W %h:%p %user%@%bastionhost%' %user%:%internalhost%Для более удобного подключения ко внутреннему сервису, можно добавить следующие хосты в ~/.ssh/config:
Host bastion
Hostname %bastionhost%
Host someinternalhost
Hostname %internalhost%
ProxyCommand ssh bastion -W %h:%p
Данная конфигурация позволит подключаться к хосту (ssh, scp, etc) по заданному имени:
ssh someintnernalhost
Так же, можно использовать VPN - конфигурация в файле cloud-bastion.ovpn
Конфигурация
bastion_IP = 35.233.116.241
someinternalhost_IP = 10.132.0.3