- Создание инфраструктуры и удаленное подключение
- Самостоятельное задание
- Создание VPN-сервера
- Дополнительное задание
Для удобства сквозного подключения к внутреннему хосту через bastion следует использовать ~/.ssh/config настройки
Host bastion
ForwardAgent yes
Hostname host_ip
User user_name
IdentityFile ~/.ssh/vendikato
Host sih
Hostname host_ip
User user_name
ProxyCommand ssh user_name@host_ip nc %h %p 2> /dev/null
Описание использования и доп. информацию можно подчерпнуть отсюда
К серверу привязан SSL сертификат сгенерированный автоматически ботом Let`s encrypt Инструкции для настройки Так же был выделен домен 3го уровня и направлен DNS хостингом на IP VPN-сервера
bastion_IP = 35.232.76.112
someinternalhost_IP = 10.128.0.3
hostname - vpn
someinternalhost alias - sih
- Настроить новый инстанс через GUI, развернуть приложение
- Создать скрипты установок Ruby, MongoDB и развертывания приложения
testapp_IP = 34.83.160.205
testapp_port = 9292
- Написать команду создания инстанса с использованием startup_script
gcloud compute instances create reddit-app \
--zone=us-west1-b \
--boot-disk-size=10GB \
--image-family ubuntu-1604-lts \
--image-project=ubuntu-os-cloud \
--machine-type=g1-small \
--tags puma-server \
--metadata startup-script='wget -O - https://gist.githubusercontent.com/Hellcrazyrabbit/50bea9ae44a994dbbea5cebd783f8e71/raw/88734dee34947de6d9cf4f1975e3e6e6daaaa66d/startupscript.sh | bash' \
--restart-on-failure
- Написать команду создания правила приложения
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
- Установка Packer и сборка образа VM для GCP
Установка происходит путем скачивания дистра с сайта После распаковки нежно добавить приложение в PATH
ln -s /path/to/packer packer
Сборка VM происходит по инструкции задания
- Создать файл переменных для сборки образа
-
"Запечь" полный образ VM, старт приложения производить через systemd. Создать shell-скрипт запуска VM для gcloud.
-
Реализовано путем запуска bash скрипта с EOF в сервис файл.
-
Shell-скрипт сохранен в config-scripts.
- Установка Terraform и создание VM согласно описания
Установка проиcходит аналогично установке Packer.
- Задать переменную для приватного ключа provisioner. Значение default зоны ресурса app. Отформатировать tf файлы. Создать examle переменных
- Добавить ssh ключи пользователей в метаданные проекта
1й вариант
resource "google_compute_project_metadata" "ssh-keys" {
metadata {
ssh-keys = <<EOF
appuser:${file(var.public_key_path)}
appuser1:${file(var.public_key_path)}
appuser2:${file(var.public_key_path)}
EOF
}
}
удаляет все метаданные проекта и устанавливает указанные, можно импортировать имеющиеся
terraform import google_compute_project_metadata.ssh-keys my-project-id
2й вариант
resource "google_compute_project_metadata_item" "appuser" {
key = "appuser"
value = "${file(var.public_key_path)}"
}
Создает отдельный экземпляр метаданных для проекта мануал
- Создать балансировщик
Домашнее задание Принципы организации инфраструктурного кода и работа над инфраструктурой в команде на примере Terraform.
-
Разбить конфигурацию Terraform на модули
-
Создать Stage & Prod
-
Удалить ненужные файлы
-
Параметризировать конфиги модулей
-
Отформатировать файлы
-
Создать модуль storage-bucket
Для выполнения заданий и тестов может потребоваться экспорт аккаунта подключения к GCP
export GOOGLE_APPLICATION_CREDENTIALS="[acc_file_name].json"
Все переменные имеют значение по умолчанию.
- Настроить GCS в качестве бэкенда
создано 2 бакета для stage & prod
- Установить Ansible и настроить конфигурацию, инвентори, плейбук
- Прогнать плэйбук
После выполнения плэйбука, Ansible уведомляет об отсутствии изменений на хосте
Причиной тому выполненная команда клонирования репозитория через модуль команды
ansible app -m git -a 'repo=https://github.com/express42/reddit.git dest=/home/appuser/reddit'
Это подтверждает идемпотентность Ansible. Удаляем директорию с репой, запускаем плэйбук снова и получаем уже результат со статусом "changed"
-[x] Создан простой скрипт для загрузки инвентори динамически.
Выбран самый простой способ скриптового запроса к файлу, т.к. готовые решения намного больше охватывают этот вопрос,
изобретать велосипед - трата времени.
Настройки изменены и по дефолту вызывается как раз инвентори из скрипта.
- Создать единый плейбук настройки dbserver appserver и деплоя приложения
- Изменить провижининг в Packer на ansible плайбуки
- Хост находится по адресу http://34.66.255.23:9292/
- Билд производится из корня репы
При использовании Ubuntu 18 требуется указать в провижинере "user": "appuser"
- Выбрать оптимальное решение Dynamic Inventory и прописать в конфиге и плейбуках
Был выбран модуль gcp_compute
Добавил yml файл инвентори в конфиги, расположение: ~/ansible/inv/inventory.gcp.yml
Домашнее задание Написание Ansible ролей для управления конфигурацией сервисов и настройками хостов.
- Сконфигурировать роли и организовать файлы
- Настроить окружения
- Добавить Community роли
- Настроить Ansible Vault
- Настроить приложение на доступ с 80 порта
- Хост находится по адресу http://35.202.141.45/
- Использовать Dynamic Inventory
Использование того же модуля gcp_compute
- [] TODO
Домашнее задание. Доработка имеющихся ролей локально с использование Vagrant. Тестирование конфигурации при помощи Molecule и TestInfra.
-
Локальная разработка при помощи Vagrant
-
Тестирование ролей при помощи Molecule и Testinfra
-
Переключение пакера на использование ролей
- дописать тестирование БД на прослушивание порта
Использовался метод socket().is_listening
- Перенастройка пакера на использование ролей, доступность ролей определяем дополнительными переменными ансибла
Нужно тщательно проверять возможность использования NestedVirtualization на запускаемом хосте. При использовании драйвера Virtualbox для Vagranta лучше запускать проект на WMWare