Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lab3/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
*.tfvars
!*.tfvars.example
.terraform/
*.tfstate
*.tfstate.backup
.terraform.lock.hcl
ansible/inventory.ini
.DS_Store
5 changes: 5 additions & 0 deletions lab3/ansible/ansible.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[defaults]
roles_path = ../ansible
connect_timeout = 30
host_key_checking = False
inventory = ./inventory.ini
50 changes: 50 additions & 0 deletions lab3/ansible/docker-install/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
- name: update apt list
apt:
update_cache: yes

- name: Install basic packages
ansible.builtin.apt:
name:
- apt-transport-https
- ca-certificates
- curl
- python3
- python3-pip
state: present

- name: Add Docker GPG key
ansible.builtin.apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present

- name: Add Docker repository
ansible.builtin.apt_repository:
repo: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable'
state: present
update_cache: yes

- name: Install Docker packages
ansible.builtin.apt:
name:
- libc6
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
- docker-compose-plugin
state: present
update_cache: true

- name: Install docker python packages
ansible.builtin.pip:
name:
- docker==6.1.3
- docker-compose==1.29.2
- requests==2.28.1
- urllib3==1.26.18

- name: Enable and start Docker service
ansible.builtin.systemd:
name: docker
enabled: yes
state: started
5 changes: 5 additions & 0 deletions lab3/ansible/docker-service/defaults/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
docker_service__compose:
version: '3'
services:
app:
image: hello-world
24 changes: 24 additions & 0 deletions lab3/ansible/docker-service/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
- name: Create docker-compose dirs
file:
state: directory
path: "{{ item }}"
mode: 0755
owner: root
group: root
loop:
- /opt/service
- /opt/service/compose
- /opt/service/compose/data/

- name: Configure service compose file
template:
src: docker-compose.yml.j2
dest: /opt/service/compose/docker-compose.yml
mode: 0644
owner: root
group: root

- name: Start containers
community.docker.docker_compose_v2:
project_src: /opt/service/compose
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{ docker_service__compose | to_nice_yaml }}
15 changes: 15 additions & 0 deletions lab3/ansible/docker-service/vars/database.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
docker_service__compose:
version: "3"
services:
mysql:
image: mysql:5.7
ports:
- "3306:3306"
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
14 changes: 14 additions & 0 deletions lab3/ansible/docker-service/vars/webapp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
docker_service__compose:
version: "3"
services:
app:
image: antonaleks/101-todo-app
restart: on-failure
ports:
- "80:80"
environment:
MYSQL_HOST: "{{ private_database_ip }}"
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
2 changes: 2 additions & 0 deletions lab3/ansible/group_vars/all.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ansible_user: root
ansible_ssh_private_key_file: ~/.ssh/id_rsa
19 changes: 19 additions & 0 deletions lab3/ansible/playbook.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
- name: "Installing Docker and docker compose"
hosts: all
roles:
- docker-install

- name: "Run Docker compose service: database"
hosts: database
vars_files:
- "./docker-service/vars/database.yml"
roles:
- docker-service

- name: "Run Docker compose service: web app"
hosts: webapp
vars_files:
- "./docker-service/vars/webapp.yml"
roles:
- docker-service
133 changes: 133 additions & 0 deletions lab3/report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
# Лабораторная работа 3 - Cloud Platforms

**Студент:** Голиков Иван
**Предмет:** ПО Облачных платформ

## Задача

Развернуть инфраструктуру в облаке Selectel с помощью Terraform и настроить приложение с помощью Ansible.

Выбранная конфигурация: 2 прерываемые ВМ - `webapp` (todo app) и `database` (MySQL).

## Архитектура

```
Internet
|
| (floating IP) (floating IP)
| |
[webapp VM] <-- private net --> [database VM]
antonaleks/101-todo-app mysql:5.7
port 80 port 3306
```

ВМ находятся в одной приватной подсети `10.0.1.0/24`. Todo app подключается к MySQL по приватному IP базы данных. Обе ВМ имеют публичный Floating IP для доступа извне (webapp - для браузера, database - для SSH-отладки).

## Terraform

### Ресурсы

| Ресурс | Описание |
|--------|----------|
| `openstack_compute_keypair_v2` | SSH-ключ для доступа к ВМ |
| `openstack_networking_network_v2` | Приватная сеть `lab3-network` |
| `openstack_networking_subnet_v2` | Подсеть `10.0.1.0/24` |
| `openstack_networking_router_v2` | Роутер с выходом в интернет |
| `openstack_compute_flavor_v2` | Flavor: 1 vCPU, 2 GB RAM |
| `openstack_blockstorage_volume_v3` x2 | Загружаемые диски 10 GB HDD (basic.ru-7a) |
| `openstack_compute_instance_v2` x2 | Прерываемые ВМ (тег `preemptible`) |
| `openstack_networking_floatingip_v2` x2 | Публичные IP-адреса |
| `local_file` | Генерация `ansible/inventory.ini` |

### Параметры ВМ

- Образ: Ubuntu 22.04 LTS 64-bit
- Зона: `ru-7a` (единственная зона для прерываемых ВМ)
- Диск: 10 GB, тип `basic.ru-7a`
- Flavor: 1 CPU, 2 GB RAM

### Безопасность

Чувствительные данные (логин, пароль, tenant_id, domain_name) хранятся только в `terraform.tfvars`, который исключен из репозитория через `.gitignore`. В репозитории присутствует только шаблон `terraform.tfvars.example`.

### Запуск

```bash
cd terraform

# Скопировать шаблон и заполнить реальными данными
cp terraform.tfvars.example terraform.tfvars
# Отредактировать terraform.tfvars

terraform init
terraform plan
terraform apply
```

После `terraform apply` автоматически генерируется файл `ansible/inventory.ini`.

## Ansible

### Структура

```
ansible/
ansible.cfg - конфиг (host_key_checking=False)
playbook.yml - основной плейбук
inventory.ini - генерируется Terraform (gitignored)
group_vars/
all.yml - общие переменные (ansible_user, ssh key)
docker-install/ - роль: установка Docker
docker-service/ - роль: запуск docker-compose сервиса
vars/
database.yml - конфиг MySQL контейнера
webapp.yml - конфиг todo app контейнера
templates/
docker-compose.yml.j2
```

### Плейбук

Плейбук состоит из трех play:
1. Установка Docker на все хосты (`docker-install`)
2. Запуск MySQL на хосте `database` (`docker-service` + `database.yml`)
3. Запуск todo app на хосте `webapp` (`docker-service` + `webapp.yml`)

Приватный IP базы данных передается из inventory как host-переменная `private_database_ip` и подставляется в конфиг todo app через Jinja2-шаблон.

### Запуск

```bash
cd ansible
ansible-playbook playbook.yml
```

## Скриншоты

### 1. Вывод terraform apply

![terraform apply](screenshots/01_terraform_apply.png)

Вывод команды `terraform apply` - создание 2 ВМ, сети, роутера, floating IP и генерация inventory.ini.

### 2. ВМ в консоли Selectel

![Selectel VMs](screenshots/02_selectel_vms.png)

Список виртуальных машин в консоли Selectel с публичными IP-адресами.

### 3. Вывод ansible-playbook

![ansible-playbook](screenshots/03_ansible_playbook.png)

Вывод команды `ansible-playbook playbook.yml` - установка Docker и запуск контейнеров.

### 4. Todo приложение в браузере

![Todo app](screenshots/04_todo_app.png)

Todo app доступен по публичному IP webapp ВМ на порту 80.

## Вывод

С помощью Terraform была автоматически развернута инфраструктура из 2 прерываемых ВМ в облаке Selectel (OpenStack). Ansible обеспечил установку Docker и запуск todo app + MySQL через docker-compose. Все чувствительные данные исключены из репозитория.
Binary file added lab3/screenshots/01_terraform_apply.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added lab3/screenshots/02_selectel_vms.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added lab3/screenshots/03_ansible_playbook.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added lab3/screenshots/04_todo_app.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading