alex-k812 Infra repository
- Основное ДЗ
- Задание со *
- Задание со ** отложено
Согласно заданию структура каталогов приведена через ansible-galaxy init в соответствие с требуемым видом с разбивкой по ролям app и db, не требуемые для дальнейшей работы файлы помещены в папку old, для рабочих плэйбуков создана папка playbooks.
Таски, хэндлеры и переменные разнесены по соответствующим компонентам ролей.
Внесены необходимые изменения в конфигурационный файл ansible для работы с соответствующим окружением inventory = ./environments/{env}/inventory
.
Добавлена и установлена ngnix роль для проксирования порта 80 на порт приложения 9292 (роль добавлена в .gitignore), в конфигурацию терраформ добавлено необходимое разрешающее правило.
Так же для работы с AnsibleVault, создана соответствующая инфраструктура с вынесением vault.key "out-of-working-tree". Созданы тестовые юзеры, факт создания проверен с помощью команды cut -d: -f1 /etc/passwd.
- Задание с * Для работы с динамическим инвентори использован и доработан ранее созданный inventory.gcp.yml.
- ansible-playbook playbooks/site.yml
- Зайти на внешний ip app, полученный из файла old/inventory.json созданного скриптом inventory.sh.
- Выставил label с номером домашнего задания
- Выставил label с темой домашнего задания
#Homework 2.2 ##Ansible lab N2
- Согласно заданию был создан плэйбук со сценарием для управления всеми хостами.
- Далее сценарий был разбит на три отдельных для управления ими через ввод тэгов для каждого сценария.
- Следующим этапом задания было вынос сценариев в отдельные плэйбуки: конфигурация базы данных - db.yml, конфигурация сервера приложения - app.yml и развертывание приложения - deploy.yml; которые были объединены плэйбуком для все инфраструктуры site.yml. Задание с *
- Настроено использование динамической inventory согласно официально документации в конфигурационном файле ansible.cfg с получением сетевых адресов через inv.gcp.yml и плагин gcp_compute. Задание с **
- Для сборки образов БД и приложения Пакером с помощью плэйбуков, вместо провижионера shell был использован провижионер ansible с указанием соответсвующего плэйбука: ansible/packer_app.yml для базового образа приложения и ansible/packer_db.yml для образа БД.
- Ввиду ошибки выполнения плэйбука из-за запуска Пакером его из-под root, пришлось прописать пользователя, в моем случае "ak", для корректного выполнения плэйбука, это оказалось применимо не только к WSL.
#Homework 2.1 ##Ansible lab N1
- Создано лабораторое окружение для выполнения задания.
- Выполнены шаги согласно практическому занятию. После деплоя приложения вручную, созданный пэйбук не внесет никаких изменений, но после удаления клонированного репозитория выполнение плэйбука отбразит его успешное выполнение. Задание с *
- Изучена документация о dynamic inventory.
- Создан файл inventory.json
- Для успешного выполнения команды 'ansible all -m ping' создан my.gcp.yml для получения ip адресов и формирования групп инстансов.
- В конфиг файл добавлен параметр inventory сслыающийся на my.gcp.yml для работы в формате json.
- Отличие статического от динамического инвентори заключается в его получении и использовании, если в статическом мы описываем только конкретные параметры, в динамическом мы можем выборочно работать со всеми динамическими параметрами хоста.
#Homework 7
- Структура проекта изменена согласно заданию с разделением на Stage и Prod и выносом созания ВМ и правила файрвола в модули.
- Созданы соответствующие шаблоны для Пакера.
- Испольован модуль storage-bucket для хранения state конфигурации в "облаке", конфигурация хранится в файле backend.tf.
- Созана переменная среды DATABASE_URL.
- Реализовать отключение провижионеров можно через ресурс null_resource.
- Согласно заданию созданы бранч и конфигурационные файлы для Терраформ.
- Так как существует ранее созданый черед веб-консоль ssh ключ в метаданных, проблем с подключением не было.
- Задана значения переменных согласно заданию.
- В код добавлено создание ssh ключей для пользователей, количество которых задается в переменной sshuser.
- Если добавлять ssh ключи вручную через веб-консоль, терраформ перезапишет их согласно конфигурации.
- Задание *: Создана конфигурация балансировщика в lb.tf с использованием ресурсов instance_group, global_address, target_http_proxy, global_forwarding_rule, url_map, backend_servic и health_check.
- Задание **: Так как повторение в коде создания однинаковых ресурсов нецелесообразно, используется переменная count.
- Создан шаблон Пакера ubuntu16.json для образа reddit-base
- Создан шаблон immutable.json для образа reddit-full
- Создан файл с переменными для сборки образов.
- Добавлены скрипты для установки образ Ruby, Mongodb, Puma и создания сервиса puma.service с помощью systemd.
- Создан скрипт для сборки готовой ВМ reddit-app из образа reddit-full:
gcloud compute --project=infra-253316 instances create reddit-app
--image-family=reddit-full
--image-project=infra-253316
--zone=europe-west3-c
--machine-type=f1-micro
--tags puma-server
--restart-on-failure
- Развернута ВМ, на ней развернуты Ruby, MongoDB, поднят Puma сервер.
- Созданы скрипты: install_ruby.sh для установки Ruby, install_mongodb.sh для MongoDB, deploy.sh для развертывания приложения на web-сервере Puma.
- Создан общий скрипт startup_script.sh для автоматизации процесса присоздании ВМ на GCP.
- Создан скрипт gcloud.sh для автоматического развертывания инстанса ВМ и приложения на ней.
- Для использвания стартап скрипта создан бакет
sudo gsutil mb -l europe-west3 gs://akotus-stuff
и скопирован в него
sudo gsutil cp /home/ak/GitHub/alex-k812_infra/startup_script.sh gs://akotus-stuff.
Команды, использованные для создания инстанса:
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 startup-script=gs://akotus-stuff/startup_script.sh
Для создания правила FW:
gcloud compute firewall-rules create default-puma-server \
--allow tcp:9292 \
--direction INGRESS \
--source-ranges="0.0.0.0/0" \
--target-tags puma-server
Данные для проверки ДЗ: testapp_IP = 35.246.181.90 testapp_port = 9292
- Для подключения к ВМ2 в локальной сети за ВМ1 с внешним ip по ssh нужно выполнить следующую команду: ssh -t -i ~/.ssh/ak -A ak@35.207.109.237 ssh 10.156.0.4
- Для подключения через алиас, в моем случае:ssh inst1, к ВМ2 следует создать ssh конфиг следующего вида:
host inst1
HostName 10.156.0.4
Port 22
IdentityFile ~/.ssh/ak
ProxyCommand ssh ak@bastion -W %h:%p
host bastion
HostName 35.207.109.237
Port 22
IdentityFile ~/.ssh/akroot@ak-otus:~/.ssh#
Развертывание ВПН сервера осуществляется через setupvpn.sh. На сервере создан пользователь test с указанным в задании ПИН-ом, конфигурация для пользователя содержится в файле cloud-bastion.ovpn. Данные для подключения:
bastion_IP = 35.207.109.237
someinternalhost_IP = 10.156.0.6