Эти шаблоны можно использовать для создания инстанса с помощью Terraform.
Инструкция по установке Terraform и его базовым операциям доступна по ссылке.
В официальной документации Terraform можно найти более подробную информацию.
#### 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
- имя пользователя openstacktenant_name
- имя проекта в openstackpassword
- пароль пользователя openstackregion
- регион, в котором необходимо создать ресурсыVars
Описывает переменные, которые используются в шаблоне:
centos_7_image
содержит id образа CentOS 7os_tenant_network
содержит id прокинутой в проект выделенной сети, следует указатьCreate network and subnet
Описывает создание серой сети и подсети в проекте. Вместо
network_name
и subnet_name
указать имя сети и подсети соответственно, во всем шаблоне.
Security
Описывает создание групп безопасности и ключевой пары. Вместо
sg_name
указать имя группы безопасности, вместо keypair_name
указать имя ключевой пары. В поле public_key
указать публичный ключ, который необходимо прокинуть в инстанс.
В данном примере настроены 2 правила:
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
на имя инстанса и имя дополнительного диска соответственно.
В этом случае шаблон будет отличаться лишь тем, что в нем не будет блока
Create network and subnet
, а также есть изменения в блоке create instance
:
network { uuid = openstack_networking_network_v2.network_name.id }
до
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 ####
Данный шаблон отличается тем что в нем есть блоки работы с "плавающим" 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 адресом.