Терраформим Селектел
Научился терраформить Селетел я далеко не сразу, пришлось даже немного его подебажить и
openstack-утилиты. Кстати будете дебажить терраформ, сначала попробуйте запустить его с
TF_LOG=1
, может быть
поможет, так как компилируется он довольно долго, хоть и написан на Го.
Вообще, терраформ - это волшебная утилита для первичного создания серверов, настройки DNS, всевозможных штук в Амазоне и прочих вещей. Это такой ансибл для инфраструктуры, с отличной идеологией. Вы пишите в скрипте: "хочу: чтобы у меня были два таких бокса, соответсвующие днс-записи и бакет на амозоне", терраформ смотрит что у вас есть сейчас и добавляет необходимо, либо удаляет избыточное. Там конечно немного нужно приноровится, но штука совершенно космическая.
Так вот заводите аккаунт в селектеле, добавляете туда проект и вперед:
provider "dnsimple" {
email = "${var.DNSIMPLE_EMAIL}"
token = "${var.DNSIMPLE_TOKEN}"
}
provider "openstack" {
auth_url = "https://api.selvpc.ru/identity/v3"
domain_name = "${var.DOMAIN_NAME}"
tenant_name = "${var.PROJECT_ID}"
tenant_id = "${var.PROJECT_ID}"
user_name = "${var.USER}"
password = "${var.PASSWORD}"
}
variable "external_gateway" {
default = "ab2264dd-bde8-4a97-b0da-5fea63191019" # hardcoded gw for selectel
}
resource "openstack_networking_network_v2" "network" {
name = "network"
admin_state_up = "true"
region = "${var.REGION}"
}
resource "openstack_networking_subnet_v2" "subnet" {
name = "subnet"
network_id = "${openstack_networking_network_v2.network.id}"
cidr = "10.0.0.0/24"
ip_version = 4
region = "${var.REGION}"
}
resource "openstack_networking_router_v2" "router" {
name = "router"
admin_state_up = "true"
region = "${var.REGION}"
external_gateway = "${var.external_gateway}"
}
resource "openstack_networking_router_interface_v2" "router" {
router_id = "${openstack_networking_router_v2.router.id}"
subnet_id = "${openstack_networking_subnet_v2.subnet.id}"
region = "${var.REGION}"
}
resource "openstack_compute_keypair_v2" "vakhov" {
region = "${var.REGION}"
name = "vakhov"
public_key = "..."
}
resource "openstack_blockstorage_volume_v1" "box01" {
name = "disk-for-box01"
region = "${var.REGION}"
size = 150
image_id = "${var.IMAGE_ID}"
volume_type = "basic.${var.REGION}a"
}
resource "openstack_compute_instance_v2" "box01" {
name = "box01"
flavor_name = "${var.FLAVOR}"
region = "${var.REGION}"
key_pair = "vakhov"
network {
uuid = "${openstack_networking_network_v2.network.id}"
floating_ip = "${var.BOX_01_FLOATING_IP}"
}
metadata = {
"x_sel_server_default_addr"="{\"ipv4\":\"\"}"
}
block_device {
boot_index = 0
uuid = "${openstack_blockstorage_volume_v1.box01.id}"
source_type = "volume"
destination_type = "volume"
}
}
resource "dnsimple_record" "box" {
domain = "${var.DOMAIN}"
name = "mega-box"
value = "${openstack_compute_instance_v2.box01.network.0.floating_ip}"
type = "A"
ttl = 600
}
Сорри, что без ката, но по-моему это божественно. Если вы натыкали хотя бы 10 проектов ручками, то
оцените . Конфигурировать таким образом инфраструктуру не только быстрее, но и гораздо
надежнее.
В Селектеле есть несколько хитростей, которые его отличают от стандатного опенстека, описанного в документации:
- авторизоваться нужно именно так, как в моем примере;
- флеворы в Селектеле создаются под каждый бокс отдельно (можно использовать один флевор для нескольких серверов) и они бездисковые, их можно создать заблаговременно с помощью
nova flavor-create
как описано здесь; - айдишники образов можно взять с помощью
glance image-list
или из панели; - и самое главное, добавьте в мета-информацию сервера поле
x_sel_server_default_addr = {"ipv4":""}
, не спрашивайте зачем, так надо, иначе не будет работать сеть.
Вуаля. Теперь вы можете легко терраформить Селектел как вам нравится. А как вы создаете свою инфраструктуру?
Tweet