From c06af7c0c35642b7639fb1e3b7cedee58dbe49ff Mon Sep 17 00:00:00 2001 From: Palllladium Date: Tue, 27 May 2025 20:22:25 +0300 Subject: [PATCH 1/2] Task is completed --- README.md | 2 +- ansible/docker-install/tasks/main.yml | 71 ++++++++----- ansible/docker-service/tasks/main.yml | 2 +- assets/net1.png | Bin 0 -> 24774 bytes assets/ping.png | Bin 0 -> 13901 bytes assets/todo_app.png | Bin 0 -> 17498 bytes forVM/inventory.ini | 13 +++ forVM/playbook.yml | 9 ++ forVM/roles/mysql/tasks/main.yml | 28 +++++ forVM/roles/todo/tasks/main.yml | 36 +++++++ preemptible_server/vars.tf | 2 +- report.md | 142 ++++++++++++++++++++++++++ 12 files changed, 279 insertions(+), 26 deletions(-) create mode 100644 assets/net1.png create mode 100644 assets/ping.png create mode 100644 assets/todo_app.png create mode 100644 forVM/inventory.ini create mode 100644 forVM/playbook.yml create mode 100644 forVM/roles/mysql/tasks/main.yml create mode 100644 forVM/roles/todo/tasks/main.yml create mode 100644 report.md diff --git a/README.md b/README.md index c2300ca..e85aa11 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ 2. Необходимо развернуть n количество ВМ с атрибутом прерываемый 2. Развернуть необходимые подсети 3. Создать публичный ssh ключ и приатачить к ВМ -4. Создать загружаемый диск с ubuntu 20.04 +4. Создать загружаемый диск с ubuntu 22.04 5. Создать flavor 1CPU 2 gb RAM, Диск объем 10гб на каждую вм (базовый hdd) 6. Для каждой ВМ зафиксировать публичный ip адрес 7. В output зафиксировать вывод ip адрес и команду ssh для полключения diff --git a/ansible/docker-install/tasks/main.yml b/ansible/docker-install/tasks/main.yml index 8d58b38..95128f1 100644 --- a/ansible/docker-install/tasks/main.yml +++ b/ansible/docker-install/tasks/main.yml @@ -1,42 +1,67 @@ ---- -# tasks file for docker-install -- name: Install aptitude - ansible.builtin.apt: - name: aptitude - state: latest - update_cache: true +#======================= BASIC PACKAGES ============================ +- name: update apt list + apt: + update_cache: yes -- name: Install required system packages +- name: Install basic packages ansible.builtin.apt: - pkg: + name: - apt-transport-https - ca-certificates - curl - - software-properties-common + - python3 - python3-pip - - virtualenv - - python3-setuptools - state: latest - update_cache: true + state: present + +#======================= GPG KEYS ============================ + -- name: Add Docker GPG apt Key +- name: Add Docker GPG key ansible.builtin.apt_key: url: https://download.docker.com/linux/ubuntu/gpg state: present -- name: Add Docker Repository +#======================= ADD REPOS ============================ + +- name: Add Docker repository ansible.builtin.apt_repository: - repo: deb https://download.docker.com/linux/ubuntu jammy stable + repo: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu jammy stable' state: present + update_cache: yes + +#======================= INSTALL ADDITIONAL PACKAGES ============================ -- name: Update apt and install docker-io +- name: Install additional packages ansible.builtin.apt: - name: docker.io - state: latest + name: + - libc6 + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + state: present update_cache: true -- name: Install Docker Compose +#- name: Install Docker Compose +# ansible.builtin.get_url: +# url: "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-{{ ansible_system | lower }}-{{ ansible_architecture }}" +# dest: /usr/local/bin/docker-compose +# mode: '0755' +# +- name: Install docker python packages ansible.builtin.pip: name: - - urllib3 - - docker-compose \ No newline at end of file + - docker==6.1.3. + - docker-compose==1.29.2 + - requests==2.28.1 + - urllib3==1.26.18 +# +##======================= DOCKER ============================ + + +- name: Enable and start Docker service + ansible.builtin.systemd: + name: docker + enabled: yes + state: started diff --git a/ansible/docker-service/tasks/main.yml b/ansible/docker-service/tasks/main.yml index cd01e22..78695d8 100644 --- a/ansible/docker-service/tasks/main.yml +++ b/ansible/docker-service/tasks/main.yml @@ -22,5 +22,5 @@ group: root - name: Start containers - docker_compose: + community.docker.docker_compose: project_src: /opt/service/compose diff --git a/assets/net1.png b/assets/net1.png new file mode 100644 index 0000000000000000000000000000000000000000..46761a19cb34fdcd70fdef8085713e63e4dfc346 GIT binary patch literal 24774 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 Oq;uEcPL+o3tN#TL`56iT literal 0 HcmV?d00001 diff --git a/forVM/inventory.ini b/forVM/inventory.ini new file mode 100644 index 0000000..2719e60 --- /dev/null +++ b/forVM/inventory.ini @@ -0,0 +1,13 @@ +[db] +server ansible_host=192.168.56.11 ansible_user=me2 + +[app] +client ansible_host=192.168.56.12 ansible_user=me3 + +[db:vars] +ansible_ssh_private_key_file=/home/me1/.ssh/id_ed25519 +ansible_become=true + +[app:vars] +ansible_ssh_private_key_file=/home/me1/.ssh/id_ed25519 +ansible_become=true \ No newline at end of file diff --git a/forVM/playbook.yml b/forVM/playbook.yml new file mode 100644 index 0000000..aa67136 --- /dev/null +++ b/forVM/playbook.yml @@ -0,0 +1,9 @@ +- hosts: db + become: yes + roles: + - mysql + +- hosts: app + become: yes + roles: + - todo \ No newline at end of file diff --git a/forVM/roles/mysql/tasks/main.yml b/forVM/roles/mysql/tasks/main.yml new file mode 100644 index 0000000..fede621 --- /dev/null +++ b/forVM/roles/mysql/tasks/main.yml @@ -0,0 +1,28 @@ +- name: Install pip for Python3 + apt: + name: python3-pip + state: present + update_cache: true + +- name: Install Docker Python module + pip: + name: docker + executable: pip3 + +- name: Install Docker + apt: + name: docker.io + state: present + update_cache: true + +- name: Start MySQL container + docker_container: + name: mysql + image: mysql:5.7 + state: started + restart_policy: always + ports: + - "3306:3306" + env: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: todos \ No newline at end of file diff --git a/forVM/roles/todo/tasks/main.yml b/forVM/roles/todo/tasks/main.yml new file mode 100644 index 0000000..fc174c5 --- /dev/null +++ b/forVM/roles/todo/tasks/main.yml @@ -0,0 +1,36 @@ +- name: Install pip for Python3 + apt: + name: python3-pip + state: present + update_cache: true + +- name: Install Docker Python module + pip: + name: docker + executable: pip3 + +- name: Install Docker + apt: + name: docker.io + state: present + update_cache: true + +- name: Download Docker-image of todo-app + docker_image: + name: antonaleks/101-todo-app + tag: latest + source: pull + +- name: Start todo-app container + docker_container: + name: todo + image: antonaleks/101-todo-app:latest + state: started + restart_policy: always + ports: + - "3000:80" + env: + DB_HOST: 192.168.56.11 + DB_USER: root + DB_PASSWORD: password + DB_NAME: todos \ No newline at end of file diff --git a/preemptible_server/vars.tf b/preemptible_server/vars.tf index 54f4975..16840e5 100644 --- a/preemptible_server/vars.tf +++ b/preemptible_server/vars.tf @@ -31,7 +31,7 @@ variable "server_volume_type" { } variable "server_image_name" { - default = "Ubuntu 20.04 LTS 64-bit" + default = "Ubuntu 22.04 LTS 64-bit" } variable "server_preemptible_tag" { diff --git a/report.md b/report.md new file mode 100644 index 0000000..208d284 --- /dev/null +++ b/report.md @@ -0,0 +1,142 @@ +# Отчёт по работе №3: Практика Ansible + +## Подготовка ВМ +1. Как и в прошлых работах создаём 3 ВМ для работы. +2. Как и в прошлых работах меняем на них hostname и user для удобства. +3. Меняем настройки сетевых адаптеров: +- на каждой машине оставляем **NAT** для выхода в сеть +- на каждой машине добавляем **Host-Only** адаптер +4. Через `netplan` задаём новые статические IP-адреса с одной подсетью для **Host-Only** адаптеров. По итогу имеем: +- Машина A: `me1@192.168.56.10` - хост с **Ansible** +- Машина B: `me2@192.168.56.11` - сервер для **MySQL** +- Машина C: `me3@192.168.56.12` - клиент с **ToDo** +Пример настроенной сети с машины A: + +![netA](assets/net1.png) + +5. После настройки сети устанавливаем между машинами **SSH-соединение**: +```shell +ssh-keygen -t ed25519 -C "ansible" +ssh-copy-id -i ~/.ssh/id_ed25519.pub me2@192.168.56.11 +ssh-copy-id -i ~/.ssh/id_ed25519.pub me3@192.168.56.12 +``` +6. Проверяем **SSH-соединение** c хоста. Теперь можно установить ansible: +```shell +sudo apt update +sudo apt install ansible -y +``` + +## Настройка Ansible +1. Возьмём стандартную и рекомендуемую Ansible-структуру. В корневой папке проекта будет `ini` файл вместе с плейбуком и папка с ролями. Плейбук в свою очередь вызывает роли. В каждой роли (**todo** и **mysql**) будет свой `yml` файл с задачами (в папке **tasks**). Для удобства создаём все необходимые файлы локально, а затем копируем их через `scp` на хост с **Ansible**. *Папка проекта находится в репозитории под названием /forVM*.

+ +Структура проекта имеет вид: +```shell +forVM/ +├── inventory.ini # инвентори-файл с IP/хостами +├── playbook.yml # основной плейбук, вызывает роли +└── roles/ + ├── mysql/ + │ └── tasks/ + │ └── main.yml # задачи для установки и запуска MySQL + └── todo/ + └── tasks/ + └── main.yml # задачи для todo-приложения +``` +

+ +2. Определяем в плейбуке роли (**todo** и **mysql**) и создаём **tasks** для каждой из них.
+Задачи включают в себя установку необходимых зависимостей и запуск образов с выставленными env-переменными:

+ +- **MySQL**: +```shell +- name: Install pip for Python3 + apt: + name: python3-pip + state: present + update_cache: true + +- name: Install Docker Python module + pip: + name: docker + executable: pip3 + +- name: Install Docker + apt: + name: docker.io + state: present + update_cache: true + +- name: Start MySQL container + docker_container: + name: mysql + image: mysql:5.7 + state: started + restart_policy: always + ports: + - "3306:3306" + env: + MYSQL_ROOT_PASSWORD: password + MYSQL_DATABASE: todos +``` + +

+ +- **ToDo**: +```shell +- name: Install pip for Python3 + apt: + name: python3-pip + state: present + update_cache: true + +- name: Install Docker Python module + pip: + name: docker + executable: pip3 + +- name: Install Docker + apt: + name: docker.io + state: present + update_cache: true + +- name: Download Docker-image of todo-app + docker_image: + name: antonaleks/101-todo-app + tag: latest + source: pull + +- name: Start todo-app container + docker_container: + name: todo + image: antonaleks/101-todo-app:latest + state: started + restart_policy: always + ports: + - "3000:80" + env: + DB_HOST: 192.168.56.11 + DB_USER: root + DB_PASSWORD: password + DB_NAME: todos +``` + +

+ +3. Пересылаем папку на машину А: +```shell +scp -r "/c/Users/user/Documents/Education/Clouds/CloudPractice/forVM" me1@192.168.56.10:/home/me1/ +``` +4. Пробуем пропинговать машины B и C. Получаем в ответ `pong`, значит все настроено верно: + +![pong](assets/ping.png) + +## Тестирование и результаты + +1. Запускаем **playbook** на машине A. Во время установки всех файлов не должно быть ошибок. +2. Перейдем к проверке **ToDo** приложения, перейдя по адресу: http://192.168.56.12:3000/ + +![pong](assets/todo_app.png) + +Представленные скриншоты подтверждают работоспособность системы. +Все необходимые файлы приложены в репозитории. \ No newline at end of file From 515c752314086f3a9d7a4c23a11389f9e53a78b1 Mon Sep 17 00:00:00 2001 From: Daniil <86617103+Palllladium@users.noreply.github.com> Date: Tue, 27 May 2025 20:24:07 +0300 Subject: [PATCH 2/2] Update report.md --- report.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/report.md b/report.md index 208d284..b36e135 100644 --- a/report.md +++ b/report.md @@ -27,7 +27,7 @@ sudo apt install ansible -y ``` ## Настройка Ansible -1. Возьмём стандартную и рекомендуемую Ansible-структуру. В корневой папке проекта будет `ini` файл вместе с плейбуком и папка с ролями. Плейбук в свою очередь вызывает роли. В каждой роли (**todo** и **mysql**) будет свой `yml` файл с задачами (в папке **tasks**). Для удобства создаём все необходимые файлы локально, а затем копируем их через `scp` на хост с **Ansible**. *Папка проекта находится в репозитории под названием /forVM*.

+1. Возьмём стандартную и рекомендуемую Ansible-структуру. В корневой папке проекта будет `ini` файл вместе с плейбуком и папка с ролями. Плейбук в свою очередь вызывает роли. В каждой роли (**todo** и **mysql**) будет свой `yml` файл с задачами (в папке **tasks**). Для удобства создаём все необходимые файлы локально, а затем копируем их через `scp` на хост с **Ansible**. *Папка проекта находится в репозитории под названием /forVM*.
Структура проекта имеет вид: ```shell @@ -42,10 +42,9 @@ forVM/ └── tasks/ └── main.yml # задачи для todo-приложения ``` -

2. Определяем в плейбуке роли (**todo** и **mysql**) и создаём **tasks** для каждой из них.
-Задачи включают в себя установку необходимых зависимостей и запуск образов с выставленными env-переменными:

+Задачи включают в себя установку необходимых зависимостей и запуск образов с выставленными env-переменными: - **MySQL**: ```shell @@ -79,8 +78,6 @@ forVM/ MYSQL_DATABASE: todos ``` -

- - **ToDo**: ```shell - name: Install pip for Python3 @@ -121,8 +118,6 @@ forVM/ DB_NAME: todos ``` -

- 3. Пересылаем папку на машину А: ```shell scp -r "/c/Users/user/Documents/Education/Clouds/CloudPractice/forVM" me1@192.168.56.10:/home/me1/ @@ -139,4 +134,4 @@ scp -r "/c/Users/user/Documents/Education/Clouds/CloudPractice/forVM" me1@192.16 ![pong](assets/todo_app.png) Представленные скриншоты подтверждают работоспособность системы. -Все необходимые файлы приложены в репозитории. \ No newline at end of file +Все необходимые файлы приложены в репозитории.