Задание:

 b) Создайте все необходимые виртуальные сети:

Основные моменты на что стоит обратить внимание перед написанием скрипта с использованием Terraform:

Разбираемся с сетями 'network.tf'. Общий принцип:

Необходимо создавать следующие ресурсы:

  • Создать какую-то сеть;
  • Создать какую-то подсеть в сети созданной на этапе выше;
    • В создаваемой подсети уже задаются основные параметры: CIDR, DNS, DHCP и др.;
  • Если из создаваемой подсети необходим доступ в сеть Интернет:
    • то её необходимо добавить в существующий маршрутизатор (на котором уже есть SNAT);
  • Создать порты для каждого инстанса в рамках соответствующих сетей и подсетей;
    • поскольку потребуется указать статические IP-адреса, ассоциировав их с портами;
    • в дальнейшем при создании инстансов будут указываться эти порты;

Пример в контексте текущего задания:

Необходимо создать следующие ресурсы:

  • Чтобы создать сеть (подсеть) с именем External-Net и указать адрес сети 172.16.1.0/29:
    • Необходимо создать сеть, например с именем External-Net в соответствие с топологией;
      • Поскольку именно имя сети будет отображаться в веб-интерфейсе Кибер Инфраструктуры, а не имя подсети

    • Необходимо создать подсеть, с именем External-SubNet в сети созданной на шаге 1;
      • В контексте создания подсети уже указывается: CIDR, GATEWAY, DNS, DHCP и иные параметры;
      • Имя подсети External-SubNet в веб-интерфейсе Кибер Инфраструктуры нигде фигурировать не будет, но необходимо для создания сети средствами Terraform;

      • Но используя функционал OpenStack CLI имя подсети увидеть можно:

    • Необходимо добавить созданную подсеть External-SubNet в существующий маршрутизатор Cloud-RTR, т.к. на нём уже есть SNAT
    • Необходимо создать нужное количество портов для каждого инстанса в соответствие с топологией L-3 для сети External-Net - 172.16.1.0/29
      • Пример: к сети External-Net, должны быть подключены устройства Cloud-LBCloud-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