Терраформим Селектел

October 13, 2016

Научился терраформить Селетел я далеко не сразу, пришлось даже немного его подебажить и 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 проектов ручками, то оцените :heart_eyes_cat:. Конфигурировать таким образом инфраструктуру не только быстрее, но и гораздо надежнее.

В Селектеле есть несколько хитростей, которые его отличают от стандатного опенстека, описанного в документации:

  1. авторизоваться нужно именно так, как в моем примере;
  2. флеворы в Селектеле создаются под каждый бокс отдельно (можно использовать один флевор для нескольких серверов) и они бездисковые, их можно создать заблаговременно с помощью nova flavor-create как описано здесь;
  3. айдишники образов можно взять с помощью glance image-list или из панели;
  4. и самое главное, добавьте в мета-информацию сервера поле x_sel_server_default_addr = {"ipv4":""}, не спрашивайте зачем, так надо, иначе не будет работать сеть.

Вуаля. Теперь вы можете легко терраформить Селектел как вам нравится. А как вы создаете свою инфраструктуру?

comments powered by Disqus