Требуемые условия завершения
Задание:
b) Создайте все необходимые виртуальные сети:
Основные моменты на что стоит обратить внимание перед написанием скрипта с использованием Terraform:
Разбираемся с сетями 'network.tf'. Общий принцип:
Необходимо создавать следующие ресурсы:
- Создать какую-то сеть;
- Создать какую-то подсеть в сети созданной на этапе выше;
- В создаваемой подсети уже задаются основные параметры: CIDR, DNS, DHCP и др.;
- Если из создаваемой подсети необходим доступ в сеть Интернет:
- то её необходимо добавить в существующий маршрутизатор (на котором уже есть SNAT);
- Создать порты для каждого инстанса в рамках соответствующих сетей и подсетей;
- поскольку потребуется указать статические IP-адреса, ассоциировав их с портами;
- в дальнейшем при создании инстансов будут указываться эти порты;
Пример в контексте текущего задания:
Необходимо создать следующие ресурсы:
- Чтобы создать сеть (подсеть) с именем External-Net и указать адрес сети 172.16.1.0/29:
- Необходимо создать сеть, например с именем External-Net в соответствие с топологией;
- Поскольку именно имя сети будет отображаться в веб-интерфейсе Кибер Инфраструктуры, а не имя подсети
- Необходимо создать сеть, например с именем External-Net в соответствие с топологией;
-
- Необходимо создать подсеть, с именем External-SubNet в сети созданной на шаге 1;
- В контексте создания подсети уже указывается: CIDR, GATEWAY, DNS, DHCP и иные параметры;
- Имя подсети External-SubNet в веб-интерфейсе Кибер Инфраструктуры нигде фигурировать не будет, но необходимо для создания сети средствами Terraform;
- Необходимо создать подсеть, с именем External-SubNet в сети созданной на шаге 1;
-
-
- Но используя функционал OpenStack CLI имя подсети увидеть можно:
-
-
- Необходимо добавить созданную подсеть External-SubNet в существующий маршрутизатор Cloud-RTR, т.к. на нём уже есть SNAT
- Необходимо создать нужное количество портов для каждого инстанса в соответствие с топологией L-3 для сети External-Net - 172.16.1.0/29
- Пример: к сети External-Net, должны быть подключены устройства Cloud-LB, Cloud-HA01 и Cloud-HA02;
- Необходимо создать 3 порта в контекстве подсети External-SubNet;
- Присвоить портам фиксированные IP-адреса в соответствие с L-3 топологией;
- Чтобы создать сеть (подсеть) с именем Internal-Net и указать адрес сети 192.168.10.0/26, необходимо повторить алгоритм действий аналогичный созданию сети External-Net
- Сеть - подсеть:
-
- Добавление сети в маршрутизатор:
-
- Создать необходимое кол-во портов для соответствующих инстансов (должно быть создано 6 портов, согласно L3-топологии);
- Важно! незабыть про то, что все создаваемые инстансы должны быть подключены не только к создаваемым сетям, но уже и к существующей сети Management-Net
- Для этого необходимо создать ещё несколько портов, а именно 6 в сети Management-Net
Особенности:
-
Open Stack - резервирует для своих целей несколько "портов/IP-адресов" в каждой сети;
-
Если DHCP диапазон не задан, то Open Stack пойдёт резервировать "порты/IP-адреса" по порядку (с первых свободных) из соответствующей подсети, а по задания адресация расписана в Топологии L3;
-
Если при создании подсети - отключить DHCP, а на порт потом присваивать статический IP-адрес, а к создаваемому инстансу подключать порт, то инстанс всеравно не сможет получить IP-адрес (DHCP - надо включать);
Вариант реализации:
Cloud-ADM:
- Вся дальнейшая работа реализуется в контексте директории /home/altlinux/bin/terraform:
cd /home/altlinux/bin/terraform
- Создадим файл 'network.tf', в котором последовательно будем описывать всё что касается сети в контексте данного задания:
vim network.tf
-
- Добавляем следующее содержимое:
- см. комментарии в коде;
- Добавляем следующее содержимое:
# Обращаемся к источнику данных, чтобы узнать ID существующего маршрутизатора
# с именем, определённым в переменной 'router_name' в файле './variables.tf'
# используется для добавления создаваемых сетей (подсетей) в уже существующий маршрутизатор
data "openstack_networking_router_v2" "router" {
name = var.router_name
}
# Создание сети 'External-Net'
resource "openstack_networking_network_v2" "external_net" {
name = "External-Net"
admin_state_up = true
}
# Создание подсети 'External-SubNet' в сети 'External-Net' для указания CIDR '172.16.1.0/29'
resource "openstack_networking_subnet_v2" "external_subnet" {
name = "External-SubNet"
network_id = openstack_networking_network_v2.external_net.id
cidr = "172.16.1.0/28"
ip_version = 4
gateway_ip = "172.16.1.14"
dns_nameservers = [ "77.88.8.8" ]
enable_dhcp = true
allocation_pool {
start = "172.16.1.4"
end = "172.16.1.13"
}
}
# Добавляем подсеть 'External-SubNet', созданную в сети 'External-Net' в существующий маршрутизатор
resource "openstack_networking_router_interface_v2" "router_externalnet" {
router_id = data.openstack_networking_router_v2.router.id
subnet_id = openstack_networking_subnet_v2.external_subnet.id
}
# Создание порта 'port_externalnet_lb' в сети 'External-Net' для присваения ему статического адреса '172.16.1.1'
# из подсети 'External-SubNet' для последующего использования для инстанса 'Cloud-LB'
resource "openstack_networking_port_v2" "port_externalnet_lb" {
name = "port_externalnet_lb"
network_id = openstack_networking_network_v2.external_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.external_subnet.id
ip_address = "172.16.1.1"
}
}
# Создание порта 'port_externalnet_ha01' в сети 'External-Net' для присваения ему статического адреса '172.16.1.2'
# из подсети 'External-SubNet' для последующего использования для инстанса 'Cloud-HA01'
resource "openstack_networking_port_v2" "port_externalnet_ha01" {
name = "port_externalnet_ha01"
network_id = openstack_networking_network_v2.external_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.external_subnet.id
ip_address = "172.16.1.2"
}
}
# Создание порта 'port_externalnet_ha02' в сети 'External-Net' для присваения ему статического адреса '172.16.1.3'
# из подсети 'External-SubNet' для последующего использования для инстанса 'Cloud-HA02'
resource "openstack_networking_port_v2" "port_externalnet_ha02" {
name = "port_externalnet_ha02"
network_id = openstack_networking_network_v2.external_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.external_subnet.id
ip_address = "172.16.1.3"
}
}
- Выполняем проверку синтаксиса и структуры файлов конфигурации Terraform
terraform validate
-
- Результат:
- Видим что переменная router_name не была объявлена, поэтому открываем файл variables.tf:
vim variables.tf
-
- Добавляем следующее содержимое, тем самым объявляя переменную router_name и присваивая ей в качестве значения имя существующего маршрутизатора Cloud-RTR:
# Имя существующего маршрутизатора
variable "router_name" {
type = string
default = "Cloud-RTR"
}
- После чего, при повторной проверки синтаксиса - ошибок быть не должно:
- Запускаем развёртывание данных ресурсов:
terraform apply
-
- Подтверждаем развёртывание введя yes:
-
- Результат:
- Проверяем наличие созданных ресурсов средствами openstack-cli:
- Сеть с подсетью и порты:
-
- Также проверим что сеть External-Net добавлена в маршрутизатор Cloud-RTR:
- Проверяем наличие созданных ресурсов средствами веб-интерфейса:
- Сеть с подсетью:
-
- Подсеть добавленная в существующий маршрутизатор (для доступа в сеть Интернет из данной подсети):
- Аналогичным образом необходимо создать все необходимые ресурсы для сети Internal-Net:
vim network.tf
-
- Добавив следующий блок кода:
- см. комментарии в коде;
- Добавив следующий блок кода:
# Создание сети 'Internal-Net'
resource "openstack_networking_network_v2" "internal_net" {
name = "Internal-Net"
admin_state_up = true
}
# Создание подсети 'Internal-SubNet' в сети 'Internal-Net' для указания CIDR '192.168.10.0/26'
resource "openstack_networking_subnet_v2" "internal_subnet" {
name = "Internal-SubNet"
network_id = openstack_networking_network_v2.internal_net.id
cidr = "192.168.10.0/26"
ip_version = 4
gateway_ip = "192.168.10.62"
dns_nameservers = [ "77.88.8.8" ]
enable_dhcp = true
allocation_pool {
start = "192.168.10.50"
end = "192.168.10.60"
}
}
# Добавляем подсеть 'Internal-SubNet', созданную в сети 'Internal-Net' в существующий маршрутизатор
resource "openstack_networking_router_interface_v2" "router_internalnet" {
router_id = data.openstack_networking_router_v2.router.id
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
}
# Создание порта 'port_internalnet_ha01' в сети 'Internal-Net' для присваения ему статического адреса '192.168.10.1'
# из подсети 'Internal-SubNet' для последующего использования для инстанса 'Cloud-HA01'
resource "openstack_networking_port_v2" "port_internalnet_ha01" {
name = "port_internalnet_ha01"
network_id = openstack_networking_network_v2.internal_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
ip_address = "192.168.10.1"
}
}
# Создание порта 'port_internalnet_ha02' в сети 'Internal-Net' для присваения ему статического адреса '192.168.10.2'
# из подсети 'Internal-SubNet' для последующего использования для инстанса 'Cloud-HA02'
resource "openstack_networking_port_v2" "port_internalnet_ha02" {
name = "port_internalnet_ha02"
network_id = openstack_networking_network_v2.internal_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
ip_address = "192.168.10.2"
}
}
# Создание порта 'port_internalnet_web01' в сети 'Internal-Net' для присваения ему статического адреса '192.168.10.3'
# из подсети 'Internal-SubNet' для последующего использования для инстанса 'Cloud-WEB01'
resource "openstack_networking_port_v2" "port_internalnet_web01" {
name = "port_internalnet_web01"
network_id = openstack_networking_network_v2.internal_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
ip_address = "192.168.10.3"
}
}
# Создание порта 'port_internalnet_web02' в сети 'Internal-Net' для присваения ему статического адреса '192.168.10.4'
# из подсети 'Internal-SubNet' для последующего использования для инстанса 'Cloud-WEB02'
resource "openstack_networking_port_v2" "port_internalnet_web02" {
name = "port_internalnet_web02"
network_id = openstack_networking_network_v2.internal_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
ip_address = "192.168.10.4"
}
}
# Создание порта 'port_internalnet_db01' в сети 'Internal-Net' для присваения ему статического адреса '192.168.10.5'
# из подсети 'Internal-SubNet' для последующего использования для инстанса 'Cloud-DB01'
resource "openstack_networking_port_v2" "port_internalnet_db01" {
name = "port_internalnet_db01"
network_id = openstack_networking_network_v2.internal_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
ip_address = "192.168.10.5"
}
}
# Создание порта 'port_internalnet_db02' в сети 'Internal-Net' для присваения ему статического адреса '192.168.10.6'
# из подсети 'Internal-SubNet' для последующего использования для инстанса 'Cloud-DB02'
resource "openstack_networking_port_v2" "port_internalnet_db02" {
name = "port_internalnet_db02"
network_id = openstack_networking_network_v2.internal_net.id
admin_state_up = true
fixed_ip {
subnet_id = openstack_networking_subnet_v2.internal_subnet.id
ip_address = "192.168.10.6"
}
}
- Проверяем конфигурацию и план terraform validate и terraform plan и запускаем развёртывание ресурсов:
terraform apply
-
- Подтверждаем развёртывание введя yes:
-
- Результат:
- Проверяем наличие созданных ресурсов средствами openstack-cli:
- Сеть с подсетью и порты:
-
- Также проверим что сеть Internal-Net добавлена в маршрутизатор Cloud-RTR:
- Проверяем наличие созданных ресурсов средствами веб-интерфейса:
- Сеть с подсетью:
-
- Подсеть добавленная в существующий маршрутизатор (для доступа в сеть Интернет из данной подсети):
- Важно! незабыть про то, что все создаваемые инстансы должны быть подключены не только к создаваемым сетям, но уже и к существующей сети Management-Net
- Для этого необходимо создать ещё несколько портов, а именно 6 в сети Management-Net
vim network.tf
-
- Добавив следующий блок кода:
- см. комментарии в коде;
- Добавив следующий блок кода:
# Обращаемся к источнику данных, чтобы узнать ID существующей сети управления
# с именем, определённым в переменной 'management_net' в файле './variables.tf'
# используется для создания портов в сети 'Management-Net' и ассоциации с портом статических IP-адресов в соответствие с топологией L3
data "openstack_networking_network_v2" "management_net" {
name = var.management_net
}
# Обращаемся к источнику данных, чтобы узнать ID существующей подсети управления, т.к. незнаем имя,
# по известному CIDR, определённым в переменной 'management_subnet_cidr' в файле './variables.tf'
# используется для создания портов в сети 'Management-Net' и ассоциации с портом статических IP-адресов в соответствие с топологией L3
data "openstack_networking_subnet_v2" "management_subnet" {
cidr = var.management_subnet_cidr
}
# Создание порта 'port_managementnet_ha01' в сети 'Management-Net' для присваения ему статического адреса '192.168.10.65'
# для последующего использования для инстанса 'Cloud-HA01'
resource "openstack_networking_port_v2" "port_management_ha01" {
name = "port_management_ha01"
network_id = data.openstack_networking_network_v2.management_net.id
admin_state_up = true
fixed_ip {
subnet_id = data.openstack_networking_subnet_v2.management_subnet.id
ip_address = "192.168.10.65"
}
}
# Создание порта 'port_managementnet_ha02' в сети 'Management-Net' для присваения ему статического адреса '192.168.10.66'
# для последующего использования для инстанса 'Cloud-HA02'
resource "openstack_networking_port_v2" "port_management_ha02" {
name = "port_management_ha02"
network_id = data.openstack_networking_network_v2.management_net.id
admin_state_up = true
fixed_ip {
subnet_id = data.openstack_networking_subnet_v2.management_subnet.id
ip_address = "192.168.10.66"
}
}
# Создание порта 'port_managementnet_web01' в сети 'Management-Net' для присваения ему статического адреса '192.168.10.67'
# для последующего использования для инстанса 'Cloud-WEB01'
resource "openstack_networking_port_v2" "port_management_web01" {
name = "port_management_web01"
network_id = data.openstack_networking_network_v2.management_net.id
admin_state_up = true
fixed_ip {
subnet_id = data.openstack_networking_subnet_v2.management_subnet.id
ip_address = "192.168.10.67"
}
}
# Создание порта 'port_managementnet_web02' в сети 'Management-Net' для присваения ему статического адреса '192.168.10.68'
# для последующего использования для инстанса 'Cloud-WEB02'
resource "openstack_networking_port_v2" "port_management_web02" {
name = "port_management_web02"
network_id = data.openstack_networking_network_v2.management_net.id
admin_state_up = true
fixed_ip {
subnet_id = data.openstack_networking_subnet_v2.management_subnet.id
ip_address = "192.168.10.68"
}
}
# Создание порта 'port_managementnet_db01' в сети 'Management-Net' для присваения ему статического адреса '192.168.10.69'
# для последующего использования для инстанса 'Cloud-DB01'
resource "openstack_networking_port_v2" "port_management_db01" {
name = "port_management_db01"
network_id = data.openstack_networking_network_v2.management_net.id
admin_state_up = true
fixed_ip {
subnet_id = data.openstack_networking_subnet_v2.management_subnet.id
ip_address = "192.168.10.69"
}
}
# Создание порта 'port_managementnet_db02' в сети 'Management-Net' для присваения ему статического адреса '192.168.10.70'
# для последующего использования для инстанса 'Cloud-DB02'
resource "openstack_networking_port_v2" "port_management_db02" {
name = "port_management_db02"
network_id = data.openstack_networking_network_v2.management_net.id
admin_state_up = true
fixed_ip {
subnet_id = data.openstack_networking_subnet_v2.management_subnet.id
ip_address = "192.168.10.70"
}
}
- Выполняем проверку синтаксиса и структуры файлов конфигурации Terraform
terraform validate
-
- Результат:
- Видим что переменные management_net и management_subnet_cidr не были объявлены, поэтому открываем файл variables.tf:
vim variables.tf
-
- Добавляем следующее содержимое, тем самым объявляя необходимые переменные присваивая им значения:
# Имя существующей подсети управления
variable "management_net" {
type = string
default = "Management-Net"
}
# CIDR подсети управления, для того чтобы можно было обратиться к ресурсу и получить ID подсети
variable "management_subnet_cidr" {
type = string
default = "192.168.10.64/26"
}
- После чего, при повторной проверки синтаксиса - ошибок быть не должно:
- Запускаем развёртывание данных ресурсов:
terraform apply
-
- Подтверждаем развёртывание введя yes:
-
- Результат:
- Проверяем:
Последнее изменение: вторник, 24 июня 2025, 12:54