Установлен virtualbox Установлен vagrant Настроен vagrant для запуска двух виртуальных машин app и db Изменены роли и плейбуки в ansible Молекула в ДЗ безвозвратно устарела. Поэтому ничего не получилось в рамках методички.
Выполнено Домашнее задание №10: Ansible роли, управление настройками нескольких окружений и best practices
Созданные плейбуки перенесены в раздельные роли;
Описаны два окружения prod и stage;
Использована коммьюнити роль jdauphant.nginx;
Для окружений используется Ansible Vault;
С целью реализации механизма группировки и переиспользования конфигурационного кода, с использованием команды ansible-galaxy созданы роли для приложения и базы данных app и db;
Определены переменные групп хостов;
Заданы настройки окружений prod и stage с использованием групповых переменных;
Плейбуки в папке ansible организованы согласно best practices;
В файл ansible.cfg добавлен блок [diff];
Пересоздана terraform инфраструктура окружений stage и prod;
Проверка ролей и работа приложения выполнены успешно;
Использована community-роль jdauphant.nginx и настроено обратное проксирование для приложения с помощью nginx;
Задание со ⭐: Работа с динамическим инвентори реализовано посредством terraform outputs.
Задание с ⭐⭐: Настройка TravisCI недостаточно знаний получено.
Выполнено Домашнее задание №9: Продолжение знакомства с Ansible: templates, handlers, dynamic inventory, vault, tags
Были освоены handlers, templates, tags
Изучен подход один плейбук, один сценарий.
Изучен подход один плейбук, много сценариев.
Изучен подход несколько плейбуков.
Пересобраны packer образы и на их основе терраформом подняты инстансы.
На поднятых инстансах плэйбуком, включающим в себя другие, было развёрнута база и приложение.
Как запустить проект:
packer build -var-file=packer/variables.json packer/db.json packer build -var-file=packer/variables.json packer/app.json terraform apply ansible-playbook site.yml
Инвентори генерируеться средствами terraform из шаблона Также установлен плагин для генерации динамического инвентори.
cd ansible
mkdir -p plugins/inventory
curl https://raw.githubusercontent.com/st8f/community.general/yc_compute/plugins/inventory/yc_compute.py |
sed -e 's/community.general.yc_compute/yc_compute/g' > plugins/inventory/yc_compute.py
pip install yandexcloud
[defaults]
# inventory = ./inventory_prod.yml
# inventory = ./inventory_stage.yml
# inventory = ./inventory_yc.yml
inventory = inventory_yc.yml
remote_user = appuser
private_key_file = /home/swenum/.ssh/otus2023
host_key_checking = False
retry_files_enabled = False
inventory_plugins=./plugins/inventory
[inventory]
enable_plugins = yc_compute
1. Создана ветка ansible-2
2. Поднимаем инфраструктуру при помощи cd terraform/stage; terraform apply
3. Создаем статический ansible/inventory в формате ini
4. Проверяем ansible app -i ./inventory -m ping; ansible db -i ./inventory -m ping
5. Создаем ./ansible.cfg, переносим в него inventory, remote_user, private_key_file. Это позволяет убрать из статического inventory соответствующие поля.
6. Группируем хосты в inventory, можно использовать групповые комманды ansible app -m ping
7. Конвертируем inventory в yaml формат, проверяем ansible all -m ping -i inventory.yml
8. Проверяем работу и сравниваем поведение модулей ansible: command, shell, systemd, service, git
9. Создаем playbook clone.yml для клонирования git-репозитория
10. Запускаем ansible-playbook clone.yml и фактически клонирование не происходит, поскольку код уже находиться в указанном месте.
11. Выполняем ansible app -m command -a 'rm -rf ~/reddit'; ansible-playbook clone.yml которое теперь приводит к клонированию.
12. Написал output.tf создание динамического инвентори в формате yml для ansible
Выполнено Домашнее задание №7: Принципы организации инфраструктурного кода и работа над инфраструктурой в команде на примере Terraform
1. Создана ветка terraform-2
2. Сборка packer разбита на создание образа отдельно для базы данных и отдельно для приложения
3. Конфигурация terraform также разделена на отдельные файлы.
4. Изучены аттрибуты ресурсов и их использование
3. Перенос конфигурации в отдельные модули, создание отдельных окружений для prod и stage
4. Выполнена проверка доступности по ssh
terraform/prod> terraform apply
terraform/stage> terraform apply
Например, перейти по ссылке http://158.160.33.208:9292/
(*) Настроено хранение файла состояния в s3 bucket Инициализация:
terraform init -backend-config="access_key=$ACCESS_KEY" -backend-config="secret_key=$SECRET_KEY"
Если необходимо перенести файлы в другую папку:
terraform init -backend-config="access_key=$ACCESS_KEY" -backend-config="secret_key=$SECRET_KEY" -reconfigure
(**) Исправлены provisioner, исправлен конфигурационный файл базы данных и приложению передаёться ссылка на базу данных.
- Установлен terraform
- Настроено использование токена сервисного аккаунта
- Создан основной файл main.tf и настроен удобный вывод ip виртуальных машин output.tf
- Чувствительные данные вынесены в файлы переменных
- В .gitignore добавлены исключения
- Создан lb.tf для балансировщика и группы распределения
- Внесены изменения в основной файл для учёта нескольких виртуальных машин и созданы новые переменные
Установлен и настроен Packer
Создан сервисный аккаунт
Созданы pkr.hcl & json конфигурационные файлы
Созданы файлы для переменных
Добавлены в .gitignore
Подготовил шаблоны для создания образов Fry и Bake
Создал образы и проверил их работу
Создал скрипт для создания VM config-scripts/create-reddit-vm.sh
Созданные образы:
> yc compute image list
+----------------------+------------------------+-------------+----------------------+--------+
| ID | NAME | FAMILY | PRODUCT IDS | STATUS |
+----------------------+------------------------+-------------+----------------------+--------+
| fd89d1psr2l0rh8rcsi1 | reddit-base-09-03-2023 | reddit-base | f2entqq6l8h6pr5irof0 | READY |
| fd8cbesgcg5s4i5co53r | reddit-full-09-03-2023 | reddit-full | f2entqq6l8h6pr5irof0 | READY |
+----------------------+------------------------+-------------+----------------------+--------+
testapp_IP = 84.252.131.182
testapp_port = 9292
- Скрипт
install_ruby.sh
содержит команды по установке Ruby; - Скрипт
install_mongodb.sh
содержит команды по установке MongoDB; - Скрипт
deploy.sh
содержит команды скачивания кода, установки зависимостей через bundler и запуск приложения; - Скрипт
reddit.sh
содержит команду для автоматического развертывания с использованием cloud-config файлаcloudconfig-metadata.yaml
.
Создан cloudconfig для автоматизации деплоя приложения Monolith Reddit при помощи Cloud-init. Пример файла cloudconfig-metadata.yaml
ниже.
#cloud-config
ssh_pwauth: false
users:
- name: yc-user
gecos: YandexCloud User
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzbZxD8hTETvFCn51PFT7VcBvUNhUR1bvwZJH/6FNDo4iyncCLWx9hSt8UfhDXv3zsWN5B8lfULsjhiEGG059c4stEQmPA/jrGJudmEWbEs+k66eo1p55QXFBVtd1IvapXW/j22z8t+FUqPxCoHn97LoJiS1q0pSQQxIk5+sCIfMzn/bxrKKnitokbwvO5Qik9tautttL0AVle9zCPFVw4kXzr47hpP1dh2f+rhnGUTIxQ7LZ2hE+Sd0ctP0PfPI7RbBWDQUcv38c+M7xucYH1wBqJSiDUgFbJTJt1RF2BB21MdFhCEc9GHKpW4Wpi0/Q9yHwbiyifwLzddZw+mMcXgXHoHtgUFnZO/cjwb+2qk0uVRZxUi1Qh9/smF8nWImtphJCwiA1G+K7kA/EAZ7pV4dk9InRvBIVNMkOr2M3igZzD8krVhnSQ7Sl/r1pRxc1hmMAs3dp6MjFEeljCcc6ux78iRrlcwdPXNtAEGaL2KaSyBWOTDrrddelM6HO9boM= root@by-otus-msqo1"
package_update: true
package_upgrade: true
packages:
- git
- build-essential
- mongodb
- ruby-full
- ruby-bundler
runcmd:
- systemctl start mongodb
- systemctl enable mongodb
- cd /home/yc-user
- 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=otus-network-ru-central1-a,nat-ip-version=ipv4 \
--metadata serial-port-enable=1 \
--metadata-from-file user-data=cloudconfig-metadata.yaml
- Запускаем агент и добавляем в него свой ключ, подключаемся к удалённой машине через бастион
ssh-add ~/.ssh/otus2023
ssh -A -J appuser@130.193.48.215 appuser@10.128.0.33
- Упрощаем работу, добавляя алиасы для хостов
### The Bastion Host
Host bastion-yandex
HostName 130.193.48.215
User appuser
IdentityFile ~/.ssh/otus2023
ForwardAgent yes
### The Remote Host
Host someinternalhost
HostName 10.128.0.33
User appuser
ProxyJump bastion-yandex
- Создали и установили Впн сервер для Yandex.Cloud
bastion_IP = 130.193.48.215 someinternalhost_IP = 10.128.0.33
- Настроен ssl сертификат для панели упраления Впн сервером.