Эти шаблоны можно использовать для создания инстанса с помощью 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 ####
Описывает конфигурацию подключения к 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]
после
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 ####
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####
#### 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 = 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]
}
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 адресом, а так же создания маршрутизатора.
#### Configure the OpenStack Provider ####
provider "openstack" {
user_name = ""
tenant_name = ""
password = ""
auth_url = "https://auth.pscloud.io/v3/"
region = "kz-ala-"
}
#### End config block ####
#### Vars ####
variable "image_id" {
default = "22e935a1-dffe-43d5-939f-98b5a2c92771"
}
#### End vars block####
#### Import SSH key ####
resource "openstack_compute_keypair_v2" "ssh" {
name = "keypair_name"
public_key = ""
}
#### End Import block ####
#### Create Network ####
resource "openstack_networking_network_v2" "private_network" {
name = "network_name"
admin_state_up = "true"
}
#### End Network block ####
#### Сreate 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]
}
#### End subnet block ####
#### Create Router ####
resource "openstack_networking_router_v2" "router" {
name = "router_name"
external_network_id = "83554642-6df5-4c7a-bf55-21bc74496109" #UUID of the floating ip network
admin_state_up = "true"
depends_on = [openstack_networking_network_v2.private_network]
}
#### End router block ####
#### Adding interface to the 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]
}
#### End interface block ####
#### Allocate ip to the project ####
resource "openstack_networking_floatingip_v2" "instance_fip" {
pool = "FloatingIP Net"
}
#### End Allocate IP block ####
#### Create security group #####
resource "openstack_compute_secgroup_v2" "security_group" {
name = "sg_name"
description = "open all 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"
} }
#### End security group block ####
#### Create Disk ####
resource "openstack_blockstorage_volume_v3" "disk" {
name = "volume_name"
volume_type = "ceph-ssd" #type: ceph-backup, ceph-ssd, ceph-hdd
size = "25"
image_id = var.image_id
enable_online_resize = "true"
}
#### End Create disk block ####
#### Create Instanse ####
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]
depends_on = [
openstack_networking_network_v2.private_network,
openstack_blockstorage_volume_v3.disk
]
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
}
}
#### End Create Instans block ####
#### Assign 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
}
#### End Assign floadting IP block ####
Блок Create router
Описывает создание маршрутизатора, с внешней сетью "FloatingIP Net".
Блок Adding interface to the router
Добавляет интерфейс к роутеру.
Блок Allocate ip to the project
Запрашивает "плавающий" IP адрес, для дальнейшего его назначения.
Блок Assign floating IP
Сопоставляет IP адрес инстанса, с "плавающим" IP адресом.