Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Packer base #5

Merged
merged 5 commits into from
Nov 1, 2023
Merged
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
packer/variables.json
114 changes: 83 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,89 @@
# c0zak_infra
c0zak Infra repository

ДЗ 5

Результаты работы.
Общее ДЗ:
Каталог packer:
ubuntu16.json - общее дз, использует параметры из variable.json (но параметры, как просили, в .gitignore)
scripts/*.sh - общие скрипты запуска. Так как в облаке непонятные проблемы с использованием apt из пакера, пришлось добавить цикличный инсталл, пока не встанет.
Создан дополнительно каталог stubs с файлом key.json, т.к. тест требует чтобы файл по вымышленному пути - существовал. Вы там в порядке вообще?)))
Вот прям из теста:
× Command: `cd packer && packer validate -var-file=variables.json.example ubuntu16.json` stdout should eq "Template validated successfully.\n"
expected: "Template validated successfully.\n"
got: "Template validation failed. Errors are shown below.\n\nErrors validating build 'yandex'. 1 error(s) ...rvice account key file: key file 'SOME_PATH' read fail: open SOME_PATH: no such file or directory\n"

-------------------------

Дополнительное задание:
10.1*. Построение bake-образа (по10.1*. Построение bake-образа (по
желанию)желанию)
Чтобы попрактиковать подход к управлению инфраструктурой
Immutable infrastructure, о котором говорили на вебинаре,
попробуйте "запечь" (bake) в образ ВМ все зависимости
приложения и сам код приложения. Результат должен быть таким:
запускаем инстанс из созданного образа и на нем сразу же имеем
запущенное приложение.
Созданный шаблон должен называться immutable.json и
содержаться в директории packer, image_family у получившегося
образа должен быть reddit-full. Дополнительные файлы можно
положить в директорию packer/files. Для запуска приложения при
старте инстанса необходимо использовать systemd unit. Этот образ
можно строить как поверх нашего базового образа, так и поверх
стандартного образа ОС.


Решение:
В каталоге files лежат необходимые файлы, запуск через immutable.json, с использованием variable.json

-------------------------

Дополнительное задание:
Создайте скрипт create-reddit-vm.sh в директории config-
scripts, который будет создавать ВМ с помощью Yandex.Cloud CLI.
В скрипт не нужно включать инициализацию профиля в
Yandex.Cloud.

Скрипт лежит в корне репозитория/config-scripts/create-reddit-vm.sh
Использует изменённый metadata.yaml из каталога packer/files
Создаёт bake образ и запускает машину с ним. Использует переменную folder_id_var из файла variable.json при создании ВМ.

-------------------------

ДЗ 4

Дополнительное задание:
В качестве доп. задания используйте созданные ранее скрипты для создания startup
script , который будет запускаться при создании инстанса.
В результате применения данной команды CLI мы должны получать инстанс с уже
запущенным приложением. Startup скрипт необходимо закомитить, а используемую
команду CLI добавить в описание репозитория (README.md)

Решение:

В репе создан файл metadata.yaml, в котором описан процесс создания пользователя,
сам startup_script и его запуск.

CLI:

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 \
--zone ru-central1-a \
--metadata serial-port-enable=1 \
--metadata-from-file user-data=./metadata.yaml

-------------------------

testapp_IP = 158.160.40.104
testapp_port = 9292

-------------------------

ДЗ 3

Исследовать способ подключения к someinternalhost в одну команду из вашего
Expand Down Expand Up @@ -65,34 +148,3 @@ bastion_IP = 84.201.130.36
someinternalhost_IP = 10.128.0.32

-------------------------

ДЗ 4

Дополнительное задание:
В качестве доп. задания используйте созданные ранее скрипты для создания startup
script , который будет запускаться при создании инстанса.
В результате применения данной команды CLI мы должны получать инстанс с уже
запущенным приложением. Startup скрипт необходимо закомитить, а используемую
команду CLI добавить в описание репозитория (README.md)

Решение:

В репе создан файл metadata.yaml, в котором описан процесс создания пользователя,
сам startup_script и его запуск.

CLI:

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 \
--zone ru-central1-a \
--metadata serial-port-enable=1 \
--metadata-from-file user-data=./metadata.yaml

-------------------------

testapp_IP = 158.160.40.104
testapp_port = 9292
17 changes: 17 additions & 0 deletions config-scripts/create-reddit-vm.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/bin/bash

cd ../packer

folder_id_var=$(jq -r '.folder_id_var' variables.json)

packer build -var-file=variables.json immutable.json

yc compute instance create \
--name reddit-app \
--hostname reddit-app \
--memory=4 \
--create-boot-disk image-folder-id=$folder_id_var,image-family=reddit-full \
--network-interface subnet-name=default-ru-central1-a,nat-ip-version=ipv4 \
--zone ru-central1-a \
--metadata serial-port-enable=1 \
--metadata-from-file user-data=files/metadata.yaml
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
11 changes: 11 additions & 0 deletions packer/files/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash

until apt install -y git 2>&1; do
sleep 1
done

git clone -b monolith https://github.com/express42/reddit.git /opt/reddit
cd /opt/reddit
bundle install

systemctl enable reddit
7 changes: 7 additions & 0 deletions packer/files/install_mongodb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

until apt install -y mongodb 2>&1; do
sleep 1
done
sudo systemctl enable mongodb
sudo systemctl start mongodb
7 changes: 7 additions & 0 deletions packer/files/install_ruby.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

apt update

until apt install -y ruby-full ruby-bundler build-essential 2>&1; do
sleep 1
done
9 changes: 9 additions & 0 deletions packer/files/metadata.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#cloud-config

users:
- name: yc-user
groups: sudo
shell: /bin/bash
sudo: 'ALL=(ALL) NOPASSWD:ALL'
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDQIUyM2VYxTjP/kL9OdGNNmu/3oIXf45lbPORdf2Ni84NnWnuxzjzt1NI8ASvr1Yl4pfCdDarDq7xWj9mptSNtIayUlxLejB/wCqJrEXsA+Sp0DilxDWa+nzwZEbEI+/r0ZBx4rprQ/fjSbggPLAKHZpNHMAlsTZiShDDFsCW7Mk5OseRX/MDuZGRX0EPaw19OvbxoNfLBUcqHW16y2ujjvu/6iXSSz9wSB3ZgtXjaXNX1PmdutZMVNHPMxzNyrWIwpxnvsAIqh9QB6Zu7wDmYzDeTOQjMqfcNFPbUym43DowozoW67rFZ1EYJOEqb8NwSIhjU3GM/mRqnDznkIpSooWoROzoAnXTe2oZuJI4+Y09xW7zid/fPDT4b9sNxTlAVHeqwoelKG94TmSVkCO8sPA5RMZK3P3JZLXAfoQ8DoFG0S5POjVNCoiB5iGiNL7QqC51BsCBtS3X3FO0U0icBr6IhZ83vgeVLIJe/Ot+L4e2v7JejRfDmCSFCK1e7RBM= [email protected]@N0092
10 changes: 10 additions & 0 deletions packer/files/reddit.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[Unit]
Description=reddit

[Service]
WorkingDirectory=/opt/reddit
ExecStart=/usr/local/bin/puma
User=root

[Install]
WantedBy=multi-user.target
44 changes: 44 additions & 0 deletions packer/immutable.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"builders": [
{
"type": "yandex",
"service_account_key_file": "{{user `key_file_var`}}",
"folder_id": "{{user `folder_id_var`}}",
"source_image_family": "{{user `source_id_var`}}",
"image_name": "reddit-full-{{timestamp}}",
"image_family": "reddit-full",
"ssh_username": "ubuntu",
"platform_id": "standard-v1",
"subnet_id": "{{user `subnet_id_var`}}",
"use_ipv4_nat": true
}
],
"provisioners": [
{
"type": "file",
"source": "files/reddit.service",
"destination": "/tmp/reddit.service"
},
{
"type": "shell",
"inline": [
"sudo mv /tmp/reddit.service /etc/systemd/system/reddit.service"
]
},
{
"type": "shell",
"script": "files/install_ruby.sh",
"execute_command": "sudo {{.Path}}"
},
{
"type": "shell",
"script": "files/install_mongodb.sh",
"execute_command": "sudo {{.Path}}"
},
{
"type": "shell",
"script": "files/deploy.sh",
"execute_command": "sudo {{.Path}}"
}
]
}
7 changes: 7 additions & 0 deletions packer/scripts/install_mongodb.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

until apt install -y mongodb 2>&1; do
sleep 1
done
sudo systemctl enable mongodb
sudo systemctl start mongodb
7 changes: 7 additions & 0 deletions packer/scripts/install_ruby.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/bash

apt update

until apt install -y ruby-full ruby-bundler build-essential 2>&1; do
sleep 1
done
8 changes: 8 additions & 0 deletions packer/stubs/key.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"id": "1234",
"service_account_id": "1234",
"created_at": "2023-10-30T11:55:30.232010086Z",
"key_algorithm": "RSA_2048",
"public_key": "-----BEGIN PUBLIC KEY-----\nDSNENDCTDRHFQT<FYEKBCM&\n-----END PUBLIC KEY-----\n",
"private_key": "PLEASE DO NOT REMOVE THIS LINE! Yandex.Cloud SA Key ID \u003cajenko\u003e\n-----BEGIN PRIVATE KEY-----\nYERFRVJ:YJNFRKF:FNMNJ&\n-----END PRIVATE KEY-----\n"
}
28 changes: 28 additions & 0 deletions packer/ubuntu16.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"builders": [
{
"type": "yandex",
"service_account_key_file": "{{user `key_file_var`}}",
"folder_id": "{{user `folder_id_var`}}",
"source_image_family": "{{user `source_id_var`}}",
"image_name": "reddit-base-{{timestamp}}",
"image_family": "reddit-base",
"ssh_username": "ubuntu",
"platform_id": "standard-v1",
"subnet_id": "{{user `subnet_id_var`}}",
"use_ipv4_nat": true
}
],
"provisioners": [
{
"type": "shell",
"script": "scripts/install_ruby.sh",
"execute_command": "sudo {{.Path}}"
},
{
"type": "shell",
"script": "scripts/install_mongodb.sh",
"execute_command": "sudo {{.Path}}"
}
]
}
6 changes: 6 additions & 0 deletions packer/variables.json.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"folder_id_var": "1111",
"source_id_var": "1111",
"key_file_var": "stubs/key.json",
"subnet_id_var": "1111"
}
Loading