Оглавление
Ссылки
Некоторые ссылки требует VPN
Ресурсы
Вчера мы остановились на инициализации terraform. Сегодня мы поднимем одну машину в дефолтной сети с дефолтными настройками. И Яндекс и aws изначально создают вам одну VPC и подсети в ней.
Напомню, что в terraform мы описываем сущности почти как в JSON:
resource "<НАЗВАНИЕ_РЕСУРСА>" "<ИМЯ>" { <ПАРАМЕТР> = <ЗНАЧЕНИЕ> <ДРУГОЙ_ПАРАМЕТР> = { <ПАРАМЕТР> = <ЗНАЧЕНИЕ> } ... }
Сегодня нам потребуется:
-
Получить id подсети в которой мы хотим поднять сервер
-
Выбрать операционную систему (у каждого облачного сервиса свой список доступных ОС, но ubuntu, как правило, есть везде). Крупные сервисы предоставляют возможность создать свои собственные образы, на основе существующих; например, с предустановленными программами и настройками. Мы возьмем ubuntu 22.04 из списка доступных. Как правило, версии ОС обновляются регулярно: от еженедельных обновлений до ежедневных (речь о внутренних версия сервиса, у aws и Яндекса они свои собственные)
-
Создать ресурс (сервер) соответсвующий нашим требования.
Параметры у aws и yandex примерно одинаковые.
Яндекс
С прошлого раза у нас есть id облака и папки в облаке. Сейчас нам понадобится:
-
id одной из подсетей (уже существующих). Выбираем любую.
-
Так же нам понадобится id загрузочного образа (image_id) ubuntu 22.04 из списка доступных.
-
Добавить новый ресурс — “yandex_compute_instance” с некоторым обязательным и не очень параметрами:
-
name — имя, отображаемое в веб консоле
-
resources — мощности нашего сервера
-
boot_disk — образ для загрузки (операционная система)
-
network_interface — настройки подсети, в которой будет наш сервер
-
yc vpc subnet list +----------------------+-----------------------+----------------------+----------------+---------------+-----------------+ | ID | NAME | NETWORK ID | ROUTE TABLE ID | ZONE | RANGE | +----------------------+-----------------------+----------------------+----------------+---------------+-----------------+ | b0cqcohb42om4kvtpb9m | default-ru-central1-c | enpk6fkud1ei8pbp0rp0 | | ru-central1-c | [10.130.0.0/24] | | e2lrmvnkpav8j1qtd1lb | default-ru-central1-b | enpk6fkud1ei8pbp0rp0 | | ru-central1-b | [10.129.0.0/24] | | e9bdgo95ucmut6r7pioq | default-ru-central1-a | enpk6fkud1ei8pbp0rp0 | | ru-central1-a | [10.128.0.0/24] | +----------------------+-----------------------+----------------------+----------------+---------------+-----------------+
Возможно у вас, в будущем, уже вышла другая версия ubuntu. Это не принципиально.--folder-id standard-images
означает, что мы ищем образы в папке со стандартными образами; точно так же можно искать пользовательские образы у себя в папке.
yc compute image get-latest-from-family ubuntu-2204-lts \ --folder-id standard-images id: fd8v0s6adqu3ui3rsuap folder_id: standard-images created_at: "2022-08-22T10:46:23Z" name: ubuntu-22-04-lts-v20220822 description: ubuntu 22.04 lts family: ubuntu-2204-lts storage_size: "5326766080" min_disk_size: "5368709120" product_ids: - f2e7rond1c6brcfkq1po status: READY os: type: LINUX pooled: true
yandex/main.tf
terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } provider "yandex" { token = "AQA...C0A" # *OAuth-токен яндекса* # не обязательный параметр (берется облако по умолчанию), # хотя в документации написано иначе cloud_id = "b1gos1rh49bip4rnmrmg" folder_id = "b1gjju43i1pr11i5c4ic" zone = "ru-central1-a" } # ресурс "yandex_compute_instance" т.е. сервер # Terraform будет знаеть его по имени "yandex_compute_instance.default" resource "yandex_compute_instance" "default" { name = "test-instance" platform_id = "standard-v1" # тип процессора (Intel Broadwell) resources { core_fraction = 5 # Гарантированная доля vCPU cores = 2 # vCPU memory = 1 # RAM } boot_disk { initialize_params { image_id = "fd8v0s6adqu3ui3rsuap" # ОС (Ubuntu, 22.04 LTS) } } network_interface { subnet_id = "e9bdgo95ucmut6r7pioq" # одна из дефолтных подсетей nat = true # автоматически установить динамический ip } }
aws
C aws дело обстоит похожим образом. Но, надо понимать, что в aws могут быть другие параметры по умолчанию. На данном этапе мы многое оставляем на усмотрение провайдеру, но нам все равно понадобится:
-
id одной из подсетей
-
ami — id загрузочного образа с ubuntu
-
-
ami — образ ОС
-
subnet_id — id подсети в дефолтной VPS
-
tags:Name — имя для веб консоли
-
instance_type — тип сервера с уже указанными ресурсами CPU и RAM (у aws много типов, есть и конфигурируемые и с уже установленными значениями CPU и RAM)
-
aws ec2 describe-subnets \\ --query "Subnets[*].SubnetId" \\ --region eu-north-1 [ "subnet-3155417b", "subnet-4dd73d36", "subnet-82b67deb" ]
Важно: в aws в каждом регионе свои образы (они одинаковые, но id разный), поэтому --region
необходимо указывать.
aws ec2 describe-images \\ --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64*" \\ --region eu-north-1 \\ --query 'Images[*].[ImageId,CreationDate,OwnerId,ImageOwnerAlias]' \\ --output text | sort -k2 -r
Нас интересует последняя версия НЕ из aws-marketplace — ami-0a2b8744b4fe77f92
. 099720109477 — это id владельца образа (если вы создадите свой образ, там будет ваш id)
ami-0ba17020efe0c6d632022-08-10T20:12:59.000Z679593333241aws-marketplace ami-0a2b8744b4fe77f922022-08-10T13:30:28.000Z099720109477None ami-0936df414c3c7102d2022-07-12T21:19:05.000Z679593333241aws-marketplace ami-0852b274a4f8122592022-07-12T20:33:43.000Z099720109477None ami-0cf0e44936aed3a6f2022-07-08T07:46:22.000Z679593333241aws-marketplace ami-0407a4995711db7772022-07-08T07:00:05.000Z099720109477None ...
aws/main.tf
provider "aws" { access_key = "AK..." secret_key = "2X..." region = "eu-north-1" } # ресурс "aws_instance" т.е. сервер # terraform будет знаеть его по имени "aws_instance.default" resource "aws_instance" "default" { ami = "ami-0a2b8744b4fe77f92" # ОС (Ubuntu, 22.04 LTS) instance_type = "t3.micro" # тип процессора и ресурс машины (CPU и RAM) subnet_id = "subnet-3155417b" # одна из дефолтных подсетей associate_public_ip_address = true # автоматически установить динамический ip tags = { Name = "test-instance" } }
Запуск
В директории aws или yandex по очереди запускаем команды
terraform init terraform plan terraform apply
В терминале после команды plan
и apply
мы видим примерно одно и тоже — описание того, что terraform собирается делать. Не поленитесь и ознакомьтесь с содержимым. И сравните вывод с атрибутами из документации к провайдеру terraform.
Я считаю, это должно войти в привычку: перепроверять себя с командой plan
. Terraform указывает, какие ресурсы он сможет изменить без пересоздания, а какие нет; какой именно параметр требует пересоздания ресурса. Также указаны те параметры, что неизвестны вовремя создания, и будут доступны после. Пока ограничимся просто запущенной машиной.
Если все в порядке, после apply
вводим yes
и наблюдаем… Должно получится что-то похожее:
yc compute instance list +----------------------+---------------+---------------+---------+---------------+-------------+ | ID | NAME | ZONE ID | STATUS | EXTERNAL IP | INTERNAL IP | +----------------------+---------------+---------------+---------+---------------+-------------+ | fhm5706an0ae4hl6jk9l | test-instance | ru-central1-a | RUNNING | 51.250.83.254 | 10.128.0.27 | +----------------------+---------------+---------------+---------+---------------+-------------+
aws ec2 describe-instances \\ --region eu-north-1 \\ --query "Reservations[*].Instances[*].{Instance:InstanceId,Name:Tags[?Key=='Name']|[0].Value}" \\ --output table --------------------------------------------------------- | DescribeInstances | +-------------+-----------------------+-----------------+ | AZ | Instance | Name | +-------------+-----------------------+-----------------+ | eu-north-1c| i-083f3610e0930b98a | test-instance | +-------------+-----------------------+-----------------+
Что бы удалить все, что мы создали:
terraform destroy
Заключение
Пока что не ясно, в чем польза от использования terraform, но будем двигаться постепенно, и со временем увидим всю мощь IaC.
Любые вопросы пишите на почту v.valentinvolkov@gmail.com. Буду рад помочь!
ссылка на оригинал статьи https://habr.com/ru/post/685062/
Добавить комментарий