Terraform шаблоны для создания инстанса в облаке

Эти шаблоны можно использовать для создания инстанса с помощью Terraform.

Инструкция по установке Terraform и его базовым операциям доступна по ссылке.

В официальной документации Terraform можно найти более подробную информацию.

CentOS 7 (настройка инстанса с серой и белой сетью)

#### Configure the OpenStack Provider ####
provider "openstack" {
  user_name   = ""
  tenant_name = ""
  password    = ""
  auth_url    = "https://auth.pscloud.io/v3/"
  region      = "kz-ala-1"
}
#### End config block ####
#### Vars ####
variable "centos_7_image" {
  default = "22e935a1-dffe-43d5-939f-98b5a2c92771"
}
variable "os_tenant_network" {
  default = ""
}
#### End vars block####
#### Create network and subnet ####
resource "openstack_networking_network_v2" "network_name" {
  name           = "network_name"
  admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_name" {
  name       = "subnet_name"
  network_id = openstack_networking_network_v2.network_name.id
  cidr       = "192.168.0.0/24"
  ip_version = 4
  dns_nameservers = ["195.210.46.132", "195.210.46.195"]
  depends_on = [openstack_networking_network_v2.network_name]
}
#### End Create network and subnet block ####
#### Security ####
resource "openstack_compute_keypair_v2" "keypair_name" {
  name       = "keypair_name"
  public_key = ""
}
resource "openstack_compute_secgroup_v2" "sg_name" {
  name = "sg_name"
  description = "security group for name"
  rule {
    from_port   = 22
    to_port     = 22
    ip_protocol = "tcp"
    cidr        = "0.0.0.0/0"
  }
  rule {
    from_port   = -1
    to_port     = -1
    ip_protocol = "icmp"
    cidr        = "0.0.0.0/0"
  }
}
#### End security block ####
#### create instance ####
resource "openstack_blockstorage_volume_v3" "volume_name_with_os" {
  name        = "volume_name_with_os"
  description = ""
  size        = 30
  volume_type = "ceph-ssd"
  image_id = var.centos_7_image
  enable_online_resize = true
}
resource "openstack_blockstorage_volume_v3" "additional_volume_name" {
  name        = "additional_volume_name"
  description = ""
  size        = 100
  volume_type = "ceph-ssd"
  enable_online_resize = true
}
resource "openstack_compute_instance_v2" "instance_name" {
  name = "instance_name"
  flavor_name     = "d1.ram4cpu1"
  key_pair        = "keypair_name"
  security_groups = ["sg_name"]
  config_drive = true
  user_data = <<-EOF
                #cloud-config
                password: your password here
                chpasswd: { expire: False }
                ssh_pwauth: True                
              EOF
  block_device {
    uuid                  = openstack_blockstorage_volume_v3.volume_name_with_os.id
    source_type           = "volume"
    boot_index            = 0
    destination_type      = "volume"
    delete_on_termination = false
  }
  network {
    uuid = openstack_networking_network_v2.network_name.id
  }
  network {
    uuid = var.os_tenant_network
    fixed_ip_v4 = "10.0.0.155"
  }
  depends_on = [openstack_compute_secgroup_v2.sg_name, openstack_blockstorage_volume_v3.volume_name_with_os, openstack_networking_subnet_v2.subnet_name]
}
resource "openstack_compute_volume_attach_v2" "additional_volume_name" {
  instance_id = openstack_compute_instance_v2.instance_name.id
  volume_id   = openstack_blockstorage_volume_v3.additional_volume_name.id  
  depends_on = [openstack_blockstorage_volume_v3.additional_volume_name]
}
#### End create instance block ####

Блок Configure the OpenStack Provide

Описывает конфигурацию подключения к openstack. Необходимо указать:

  • user_name - имя пользователя openstack
  • tenant_name - имя проекта в openstack
  • password - пароль пользователя openstack
  • region - регион, в котором необходимо создать ресурсы

Блок Vars

Описывает переменные, которые используются в шаблоне:

  • centos_7_image содержит id образа CentOS 7
  • os_tenant_network содержит id прокинутой в проект выделенной сети, следует указать

Блок Create network and subnet

Описывает создание серой сети и подсети в проекте. Вместо network_name и subnet_name указать имя сети и подсети соответственно, во всем шаблоне..

Блок Security

Описывает создание групп безопасности и ключевой пары. Вместо sg_name указать имя группы безопасности, вместо keypair_name указать имя ключевой пары. В поле public_key указать публичный ключ, который необходимо прокинуть в инстанс.В данном примере настроены 2 правила:

  • разрешенн входящий трафик на 22/tcp
  • разрешен весь входящий трафик icmp

Блок create instance

Описывает создание инстанса. Необходимо убедиться, что измененные ранее имена сети, подсети, группы безопасности и ключевой пары также изменены в этом блоке.Вместо volume_name_with_os указать имя диска на котором будет установлена ОС. Также в этом ресурсе указать:

  • size - размер диска
  • volume_type - тип диска, ceph-ssd и ceph-hdd для SSD и HDD соответственно

Ресурс additional_volume_name нужен лишь в том случае, если к инстансу необходимо присоеденить дополнительный диск. В случае необходимости указать имя дополнительного диска, размер и тип по аналогии с основным диском.

Ресурс instance_name отвечает за создание самого инстанса на основе ранее созданного диска с именем volume_name_with_os. Вместо instance_name указать имя инстанса, помимо этого нужно указать:

  • flavor_name - имя флейвора, по аналогии с примером
  • key_pair - имя ключевой пары, указанной ранее
  • security_groups - имя группы безопасности, указанной ранее
  • user_data - в этом поле, указывается ряд команд, которые необходимо выполнить внутри инстанса. Так например, часть

password: "your password here" chpasswd: { expire: False } ssh_pwauth: True

отвечает за сброс пароля для пользователей centos, debian, ubuntu в соответствии с дистрибутивом. Вместо your password here, указать свой пароль в кавычках.

Часть

network { uuid = var.os_tenant_network fixed_ip_v4 = "" }

отвечает за создание интерфейса внутри инстанса, который будет связан с выделенной белой сетью. Здесь необходимо указать белый ip адрес в поле fixed_ip_v4, который указали на предыдущем этапе.

Последний ресурс в этом блоке с именем additional_volume_name отвечает за аттач дополнительного диска, создание которого было рассмотрено ранее. В этом ресурсе есть нужда, только в том случае, если было создание диска. Здесь необходимо изменить instance_name и additional_volume_name на имя инстанса и имя дополнительного диска соответственно.

CentOS 7 (настройка инстанса только с белой сетью)

В этом случае шаблон будет отличаться лишь тем, что в нем не будет блока Create network and subnet, а также есть изменения в блоке create instance:

  • не будет создания интерфейса соединенного с серой сетью, т.е. следующую часть нужно удалить

network { uuid = openstack_networking_network_v2.network_name.id }

  • в строке depends_on нужно убрать зависимость от подсети

до

depends_on = [openstack_compute_secgroup_v2.sg_name, openstack_blockstorage_volume_v3.volume_name_with_os]\r\n

после

depends_on = [openstack_compute_secgroup_v2.sg_name, openstack_blockstorage_volume_v3.volume_name_with_os, openstack_networking_subnet_v2.subnet_name]

Конечный вид шаблона для создания инстанса только с белой сетью

Configure the OpenStack Provider

# OpenStack Provider Configuration
provider "openstack" {
  user_name   = ""
  tenant_name = ""
  password    = ""
  auth_url    = "https://auth.pscloud.io/v3/"
  region      = "kz-ala-1"
}

# Variables
variable "centos_7_image" {
  default = "22e935a1-dffe-43d5-939f-98b5a2c92771"
}

variable "os_tenant_network" {
  default = ""
}

# Security Group Configuration
resource "openstack_compute_keypair_v2" "keypair_name" {
  name        = "keypair_name"
  public_key  = ""
}

resource "openstack_compute_secgroup_v2" "sg_name" {
  name        = "sg_name"
  description = "Security group for name"

  rule {
    from_port   = 22
    to_port     = 22
    ip_protocol = "tcp"
    cidr        = "0.0.0.0/0"
  }

  rule {
    from_port   = -1
    to_port     = -1
    ip_protocol = "icmp"
    cidr        = "0.0.0.0/0"
  }
}

# Block Storage Volumes
resource "openstack_blockstorage_volume_v3" "volume_name_with_os" {
  name                  = "volume_name_with_os"
  description           = ""
  size                  = 30
  volume_type           = "ceph-ssd"
  image_id              = var.centos_7_image
  enable_online_resize  = true
}

resource "openstack_blockstorage_volume_v3" "additional_volume_name" {
  name                  = "additional_volume_name"
  description           = ""
  size                  = 100
  volume_type           = "ceph-ssd"
  enable_online_resize  = true
}

# Compute Instance
resource "openstack_compute_instance_v2" "instance_name" {
  name             = "instance_name"
  flavor_name      = "d1.ram4cpu1"
  key_pair         = openstack_compute_keypair_v2.keypair_name.name
  security_groups  = [openstack_compute_secgroup_v2.sg_name.name]
  config_drive     = true
  user_data        = <<-EOF
    #cloud-config
    password: your_password_here
    chpasswd:
      expire: false
    ssh_pwauth: true
  EOF

  block_device {
    uuid              = openstack_blockstorage_volume_v3.volume_name_with_os.id
    source_type       = "volume"
    boot_index        = 0
    destination_type  = "volume"
    delete_on_termination = false
  }

  network {
    uuid          = var.os_tenant_network
    fixed_ip_v4   = "10.0.0.155"
  }

  depends_on = [
    openstack_compute_secgroup_v2.sg_name,
    openstack_blockstorage_volume_v3.volume_name_with_os
  ]
}

# Attach Additional Volume to Instance
resource "openstack_compute_volume_attach_v2" "additional_volume_name" {
  instance_id = openstack_compute_instance_v2.instance_name.id
  volume_id   = openstack_blockstorage_volume_v3.additional_volume_name.id

  depends_on = [
    openstack_blockstorage_volume_v3.additional_volume_name
  ]
}


End create instance block

CentOS 7 (настройка инстанса с серой сетью и плавающим IP адресом)

Данный шаблон отличается тем что в нем есть блоки работы с "плавающим" IP адресом, а так же создания маршрутизатора.

##############################
# OpenStack Provider
##############################
provider "openstack" {
  user_name   = ""
  tenant_name = ""
  password    = ""
  auth_url    = "https://auth.pscloud.io/v3/"
  region      = "kz-ala-1"
}

##############################
# Variables
##############################
variable "image_id" {
  default = "22e935a1-dffe-43d5-939f-98b5a2c92771"
}

##############################
# SSH Keypair Import
##############################
resource "openstack_compute_keypair_v2" "ssh" {
  name       = "keypair_name"
  public_key = ""
}

##############################
# Create Private Network
##############################
resource "openstack_networking_network_v2" "private_network" {
  name           = "network_name"
  admin_state_up = true
}

##############################
# Create Subnet
##############################
resource "openstack_networking_subnet_v2" "private_subnet" {
  name             = "subnet_name"
  network_id       = openstack_networking_network_v2.private_network.id
  cidr             = "192.168.0.0/24"
  dns_nameservers  = ["195.210.46.195", "195.210.46.132"]
  ip_version       = 4
  enable_dhcp      = true

  depends_on = [
    openstack_networking_network_v2.private_network
  ]
}

##############################
# Create Router
##############################
resource "openstack_networking_router_v2" "router" {
  name                = "router_name"
  external_network_id = "83554642-6df5-4c7a-bf55-21bc74496109" # Floating IP network UUID
  admin_state_up      = true

  depends_on = [
    openstack_networking_network_v2.private_network
  ]
}

##############################
# Add Interface to Router
##############################
resource "openstack_networking_router_interface_v2" "router_interface" {
  router_id = openstack_networking_router_v2.router.id
  subnet_id = openstack_networking_subnet_v2.private_subnet.id

  depends_on = [
    openstack_networking_router_v2.router
  ]
}

##############################
# Allocate Floating IP
##############################
resource "openstack_networking_floatingip_v2" "instance_fip" {
  pool = "FloatingIP Net"
}

##############################
# Security Group
##############################
resource "openstack_compute_secgroup_v2" "security_group" {
  name        = "sg_name"
  description = "Allow ICMP and SSH"

  rule {
    from_port   = 22
    to_port     = 22
    ip_protocol = "tcp"
    cidr        = "0.0.0.0/0"
  }

  rule {
    from_port   = -1
    to_port     = -1
    ip_protocol = "icmp"
    cidr        = "0.0.0.0/0"
  }
}

##############################
# Create Boot Volume
##############################
resource "openstack_blockstorage_volume_v3" "disk" {
  name                 = "volume_name"
  volume_type          = "ceph-ssd" # Available: ceph-ssd, ceph-hdd, ceph-backup
  size                 = 25
  image_id             = var.image_id
  enable_online_resize = true
}

##############################
# Create Compute Instance
##############################
resource "openstack_compute_instance_v2" "instance" {
  name              = "instance_name"
  flavor_name       = "d1.ram2cpu1"
  key_pair          = openstack_compute_keypair_v2.ssh.name
  security_groups   = [openstack_compute_secgroup_v2.security_group.name]

  network {
    uuid = openstack_networking_network_v2.private_network.id
  }

  block_device {
    uuid                  = openstack_blockstorage_volume_v3.disk.id
    boot_index            = 0
    source_type           = "volume"
    destination_type      = "volume"
    delete_on_termination = false
  }

  depends_on = [
    openstack_networking_network_v2.private_network,
    openstack_blockstorage_volume_v3.disk
  ]
}

##############################
# Associate Floating IP
##############################
resource "openstack_compute_floatingip_associate_v2" "instance_fip_association" {
  floating_ip = openstack_networking_floatingip_v2.instance_fip.address
  instance_id = openstack_compute_instance_v2.instance.id
  fixed_ip    = openstack_compute_instance_v2.instance.access_ip_v4
}

Блок Create router Описывает создание маршрутизатора, с внешней сетью "FloatingIP Net".

Блок Adding interface to the router Добавляет интерфейс к роутеру.

Блок Allocate ip to the project Запрашивает "плавающий" IP адрес, для дальнейшего его назначения.

Блок Assign floating IP Сопоставляет IP адрес инстанса, с "плавающим" IP адресом.

question
Не нашли подходящего ответа?
Напишите запрос в службу поддержки
Написать сейчас