Baykanurov Infra repository
bastion_IP = 158.160.107.73 someinternalhost_IP = 10.128.0.16
- Создадим файл
~/.ssh/config
touch ~/.ssh/config && chmod 600 ~/.ssh/config
- Запишем в него конфигурацию подключения к bastion и someinternalhost
Host bastion
HostName 158.160.107.73
User baykanurov
Host someinternalhost
HostName 10.128.0.16
ProxyJump bastion
User baykanurov
- Проверим подключение
ssh someinternalhost
P.S. Конфигурация в файле ~/.ssh/config
также позволяет нам подключаться к bastion
ssh bastion
Скрипт setupvpn.sh
устанавливает VPN-cервер pritunl
sudo bash setupvpn.sh
После установки открываем в браузере https://158.160.107.73/setup и следуем инструкциям Чтобы получить логин и пароль для входа нужно ввести команду:
sudo pritunl default-password
После добавления конфигурационного файла cloud-bastion.ovpn в клиент OpenVPN, можно проверить успешность подключения командой:
ssh -i ~/.ssh/id_rsa [email protected]
testapp_IP = 51.250.74.93 testapp_port = 9292
Startup Script находится в файле startup.sh
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=default-ru-central1-a,nat-ip-version=ipv4 \
--metadata serial-port-enable=1 \
--metadata-from-file user-data=./startup.sh \
--ssh-key ~/.ssh/id_ed25519.pub
Данная команда триггерит после создания нового инстанса ВМ скрипт startup.sh который проводит полную установку и развертование приложения, в том числе с установкой и разверткой дополнительных компонентов.
- Установлен Packer версии 1.8.7.
- Создан сервисный аккаунт для Packer в Yandex.Cloud.
- Создан файл ubuntu16.json для создания reddit-base образа.
- Создана вм
packer-base-dz
на основе reddit-base образа на ней развернуто приложение reddit. Доступность можно проверить по адресуhttp://51.250.90.203:9292/
- Также был параметризован ubuntu16.json.
Команда запуска
packer build -var-file ./variables.json ./ubuntu16.json
- Были созданы следующие файлы:
- immutable.json - для создания reddit-full образа.
- files/deploy.sh - установка reddit и запуск сервиса.
- files/puma.service - копируется в образ для настройки работы reddit как сервиса.
Команда запуска:
packer build -var-file ./variables.json ./immutable.json
- Был создан скрипт config-scripts/create-reddit-vm.sh который создаёт ВМ из образа reddit-full.
Версия Terraform: 0.12.8 Версия provider.yandex: 0.56.0
- main.tf - содержит интсрукции по созданию инстанса ВМ с Reddit из базового образа (reddit-base)
- variables.tf - описание переменных
- terraform.tvars - значения переменных (пример в terraform.tvars.example)
- outputs.tf - выходные переменные
- Файл lb.tf содержит инструкции по созданию балансировщика нагрузки и группы для него;
- Для использования только одного файла для создания нескольких инстансов reddit-app была использована опция Count
- Конфигурация инфраструктуры разделена на 2 модуля app и db
- Настроено переиспользование модулей (stage и prod)
- Настроил Хранилище S3 для сохранения terraform.tfstate
- Настроил provisioner для модулей app и db
- Установлен ansible версии 2.10.8
- Развёрнута инфраструктура stage с помощью terraform из ДЗ terraform-2
- Изучены основные команды ansible
- Написан playbook clone.yml
[0:48:59] baykanurov:ansible git:(ansible-1*) $ ansible-playbook clone.yml
PLAY [Clone] ***************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [appserver]
TASK [Clone repo] **********************************************************************************************************************************
ok: [appserver]
PLAY RECAP *****************************************************************************************************************************************
appserver : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[0:49:12] baykanurov:ansible git:(ansible-1*) $ ansible app -m command -a 'rm -rf ~/reddit'
[WARNING]: Consider using the file module with state=absent rather than running 'rm'. If you need to use command because file is insufficient you
can add 'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
appserver | CHANGED | rc=0 >>
[0:49:25] baykanurov:ansible git:(ansible-1*) $ ansible-playbook clone.yml
PLAY [Clone] ***************************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [appserver]
TASK [Clone repo] **********************************************************************************************************************************
changed: [appserver]
PLAY RECAP *****************************************************************************************************************************************
appserver : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Почему так произошло? Ответ: Сначала репозиторий ~/reddit уже был на ВМ, поэтому ничего не изменилось, а когда мы удалили его и запустили заново playbook, у нас произошли изменения (т.е. склонировался репозиторий и создался новый каталог)
- Создан файл inventory.json в формате описанном в методичке
- Создан простой скрипт inventory.py на python 3.10 который просто выводит в json-формате необходимую нам конфигурацию inventory
- Поменена конфигурация ansible.cfg с учетом скрипта
- Результат успешный:
[1:34:00] baykanurov:ansible git:(ansible-1*) $ ansible all -m ping
reddit-db | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
reddit-app | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
- Различия схем JSON для динамического и статического инвентори:
- Для статического инвентори, схема JSON является простой структурой, представляющей список хостов и их атрибуты
- В случае динамического инвентори в Ansible, схема JSON содержит информацию о хостах, группах хостов и других динамических параметрах, которые могут быть определены программно.
- Использовал плейбуки, хендлеры и шаблоны для конфигурации окружения и деплоя тестового приложения. Подход один плейбук, один сценарий (play)
- Аналогично один плейбук, но много сценариев
- И много плейбуков
- Изменил провижн образов Packer на Ansible-плейбуки
- Перенес созданные плейбуки в раздельные роли
- Описал два окружения stage и prod
- Использовал коммьюнити роль nginx
- Использовал Ansible Vault для окружений
- Установил Virtual Box и Vagrant
- Создал ВМ с помощью Vagrantfile
vagrant up
- Доработал роли db и app для провижининга в Vagrant'е
- Добавил установку Python
- Разнес tasks по разным файлам
- Переопределил переменные
- Создал виртуальное окружение Python
- Установил molecule и зависимости
- Протестировал роль db с помощью molecule