ืกืคืงื™ืช Terraform Selectel

ืกืคืงื™ืช Terraform Selectel

ื”ืฉืงื ื• ืกืคืง ืจืฉืžื™ ืฉืœ Terraform ืœืขื‘ื•ื“ื” ืขื Selectel. ืžื•ืฆืจ ื–ื” ืžืืคืฉืจ ืœืžืฉืชืžืฉื™ื ืœื™ื™ืฉื ื‘ืื•ืคืŸ ืžืœื ืืช ื ื™ื”ื•ืœ ื”ืžืฉืื‘ื™ื ื‘ืืžืฆืขื•ืช ืžืชื•ื“ื•ืœื•ื’ื™ื™ืช Infrastructure-as-code.

ื”ืกืคืง ืชื•ืžืš ื›ื™ื•ื ื‘ื ื™ื”ื•ืœ ืžืฉืื‘ื™ ืฉื™ืจื•ืช "ืขื ืŸ ืคืจื˜ื™ ื•ื™ืจื˜ื•ืืœื™" (ืœื”ืœืŸ VPC). ื‘ืขืชื™ื“, ืื ื• ืžืชื›ื ื ื™ื ืœื”ื•ืกื™ืฃ ื ื™ื”ื•ืœ ืžืฉืื‘ื™ื ืขื‘ื•ืจ ืฉื™ืจื•ืชื™ื ืื—ืจื™ื ื”ืžืกื•ืคืงื™ื ืขืœ ื™ื“ื™ Selectel.

ื›ืคื™ ืฉืืชื” ื›ื‘ืจ ื™ื•ื“ืข, ืฉื™ืจื•ืช VPC ื‘ื ื•ื™ ืขืœ OpenStack. ืขื ื–ืืช, ื‘ืฉืœ ื”ืขื•ื‘ื“ื” ืฉ-OpenStack ืื™ื ื• ืžืกืคืง ื›ืœื™ื ืžืงื•ืจื™ื™ื ืœืฉืจืช ืืช ื”ืขื ืŸ ื”ืฆื™ื‘ื•ืจื™, ื”ื˜ืžืขื ื• ืืช ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื—ืกืจื” ื‘ืกื˜ ืฉืœ APIs ื ื•ืกืคื™ื ื”ืžืคืฉื˜ื™ื ืืช ื”ื ื™ื”ื•ืœ ืฉืœ ืื•ื‘ื™ื™ืงื˜ื™ื ืžื•ืจื›ื‘ื™ื ืžื•ืจื›ื‘ื™ื ื•ื”ื•ืคื›ื™ื ืืช ื”ืขื‘ื•ื“ื” ืœื ื•ื—ื” ื™ื•ืชืจ. ื—ืœืง ืžื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื–ืžื™ื ื” ื‘-OpenStack ืกื’ื•ืจื” ืžืฉื™ืžื•ืฉ ื™ืฉื™ืจ, ืืš ื”ื™ื ื–ืžื™ื ื” ื“ืจืš ื”-API ืฉืœื ื•.

ื”ืกืคืง ืฉืœ Selectel Terraform ื›ื•ืœืœ ื›ืขืช ืืช ื”ื™ื›ื•ืœืช ืœื ื”ืœ ืืช ืžืฉืื‘ื™ ื”-VPC ื”ื‘ืื™ื:

  • ืคืจื•ื™ืงื˜ื™ื ื•ืžื›ืกื•ืชื™ื”ื;
  • ืžืฉืชืžืฉื™ื, ืชืคืงื™ื“ื™ื”ื ื•ืืกื™ืžื•ื ื™ื;
  • ืจืฉืชื•ืช ืžืฉื ื” ืฆื™ื‘ื•ืจื™ื•ืช, ื›ื•ืœืœ ื—ื•ืฆื” ืื–ื•ืจื™ืช ื•-VRRP;
  • ืจื™ืฉื™ื•ื ื•ืช ืชื•ื›ื ื”.

ื”ืกืคืง ืžืฉืชืžืฉ ื‘ืกืคืจื™ื™ืช ื”-Go ื”ืฆื™ื‘ื•ืจื™ืช ืฉืœื ื• ื›ื“ื™ ืœืขื‘ื•ื“ ืขื ื”-API ืฉืœ VPC. ื’ื ื”ืกืคืจื™ื™ื” ื•ื’ื ื”ืกืคืง ืขืฆืžื• ื”ื ื‘ืงื•ื“ ืคืชื•ื—, ื”ืคื™ืชื•ื— ืฉืœื”ื ืžืชื‘ืฆืข ื‘-Github:

ื›ื“ื™ ืœื ื”ืœ ืžืฉืื‘ื™ ืขื ืŸ ืื—ืจื™ื, ื›ื’ื•ืŸ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช, ื“ื™ืกืงื™ื, ืืฉื›ื•ืœื•ืช Kubernetes, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืกืคืง OpenStack Terraform. ื”ืชื™ืขื•ื“ ื”ืจืฉืžื™ ืฉืœ ืฉื ื™ ื”ืกืคืงื™ื ื–ืžื™ืŸ ื‘ืงื™ืฉื•ืจื™ื ื”ื‘ืื™ื:

ืชื—ื™ืœืช ื”ืขื‘ื•ื“ื”

ื›ื“ื™ ืœื”ืชื—ื™ืœ, ืขืœื™ืš ืœื”ืชืงื™ืŸ ืืช Terraform (ื ื™ืชืŸ ืœืžืฆื•ื ื”ื•ืจืื•ืช ื•ืงื™ืฉื•ืจื™ื ืœื—ื‘ื™ืœื•ืช ื”ืชืงื ื” ื‘ื›ืชื•ื‘ืช ื”ืืชืจ ื”ืจืฉืžื™).

ื›ื“ื™ ืœืคืขื•ืœ, ื”ืกืคืง ื“ื•ืจืฉ ืžืคืชื— API ืฉืœ Selectel, ืืฉืจ ื ื•ืฆืจ ื‘ ืœื•ื—ื•ืช ื‘ืงืจืช ื—ืฉื‘ื•ืŸ.

ืžื ื™ืคืกื˜ื™ื ืœืขื‘ื•ื“ื” ืขื Selectel ื ื•ืฆืจื™ื ื‘ืืžืฆืขื•ืช Terraform ืื• ื‘ืืžืฆืขื•ืช ืกื˜ ืฉืœ ื“ื•ื’ืžืื•ืช ืžื•ื›ื ื•ืช ื”ื–ืžื™ื ื•ืช ื‘ืžืื’ืจ Github ืฉืœื ื•: terraform-ื“ื•ื’ืžืื•ืช.

ื”ืžืื’ืจ ืขื ื“ื•ื’ืžืื•ืช ืžื—ื•ืœืง ืœืฉืชื™ ืกืคืจื™ื•ืช:

  • ืžื•ื“ื•ืœื™ื, ื”ืžื›ื™ืœื™ื ืžื•ื“ื•ืœื™ื ืงื˜ื ื™ื ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ ืฉืœื•ืงื—ื™ื ืกื˜ ืคืจืžื˜ืจื™ื ื›ืงืœื˜ ื•ืžื ื”ืœื™ื ืกื˜ ืงื˜ืŸ ืฉืœ ืžืฉืื‘ื™ื;
  • ื“ื•ื’ืžืื•ืช, ื”ืžื›ื™ืœ ื“ื•ื’ืžืื•ืช ืฉืœ ืกื˜ ืฉืœื ืฉืœ ืžื•ื“ื•ืœื™ื ืžื—ื•ื‘ืจื™ื.

ืœืื—ืจ ื”ืชืงื ืช Terraform, ื™ืฆื™ืจืช ืžืคืชื— API ืฉืœ Selectel ื•ื”ื™ื›ืจื•ืช ืขื ื”ื“ื•ื’ืžืื•ืช, ื ืขื‘ื•ืจ ืœื“ื•ื’ืžืื•ืช ืžืขืฉื™ื•ืช.

ื“ื•ื’ืžื” ืœื™ืฆื™ืจืช ืฉืจืช ืขื ื“ื™ืกืง ืžืงื•ืžื™

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžื” ืœื™ืฆื™ืจืช ืคืจื•ื™ืงื˜, ืžืฉืชืžืฉ ืขื ืชืคืงื™ื“ ื•ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ืขื ื“ื™ืกืง ืžืงื•ืžื™: terraform-examples/examples/vpc/server_local_root_disk.

ื‘ืงื•ื‘ืฅ vars.tf ื›ืœ ื”ืคืจืžื˜ืจื™ื ืฉื™ืฉืžืฉื• ื‘ืขืช ืงืจื™ืืช ืžื•ื“ื•ืœื™ื ืžืชื•ืืจื™ื. ืœื—ืœืงื ื™ืฉ ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ, ืœืžืฉืœ, ื”ืฉืจืช ื™ื•ื•ืฆืจ ื‘ืื–ื•ืจ ru-3a ืขื ื”ืชืฆื•ืจื” ื”ื‘ืื”:

variable "server_vcpus" {
default = 4
}

variable "server_ram_mb" {
default = 8192
}

variable "server_root_disk_gb" {
default = 8
}

variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}

ื‘ืงื•ื‘ืฅ main.tf ืกืคืง ื”-Selectel ืžืื•ืชื—ืœ:

provider "selectel" {
token    = "${var.sel_token}"
}

ืงื•ื‘ืฅ ื–ื” ืžื›ื™ืœ ื’ื ืืช ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ ืžืคืชื— SSH ืฉื™ื•ืชืงืŸ ื‘ืฉืจืช:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

ื‘ืžื™ื“ืช ื”ืฆื•ืจืš, ืชื•ื›ืœ ืœืฆื™ื™ืŸ ืžืคืชื— ืฆื™ื‘ื•ืจื™ ืื—ืจ. ืื™ืŸ ืฆื•ืจืš ืœืฆื™ื™ืŸ ืืช ื”ืžืคืชื— ื›ื ืชื™ื‘ ืœืงื•ื‘ืฅ; ื ื™ืชืŸ ื’ื ืœื”ื•ืกื™ืฃ ืืช ื”ืขืจืš ื›ืžื—ืจื•ื–ืช.

ื‘ื”ืžืฉืš ืงื•ื‘ืฅ ื–ื” ืžื•ืคืขืœื™ื ื”ืžื•ื“ื•ืœื™ื ืคืจื•ื™ืงื˜_ืขื_ืžืฉืชืžืฉ ะธ server_local_root_disk, ื”ืžื ื”ืœื™ื ืืช ื”ืžืฉืื‘ื™ื ื”ื“ืจื•ืฉื™ื.

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื”ืžื•ื“ื•ืœื™ื ื”ืœืœื• ื‘ื™ืชืจ ืคื™ืจื•ื˜.

ื™ืฆื™ืจืช ืคืจื•ื™ืงื˜ ื•ืžืฉืชืžืฉ ื‘ืขืœ ืชืคืงื™ื“

ื”ืžื•ื“ื•ืœ ื”ืจืืฉื•ืŸ ื™ื•ืฆืจ ืคืจื•ื™ืงื˜ ื•ืžืฉืชืžืฉ ืขื ืชืคืงื™ื“ ื‘ืื•ืชื• ืคืจื•ื™ืงื˜: terraform-examples/modules/vpc/project_with_user.

ื”ืžืฉืชืžืฉ ืฉื ื•ืฆืจ ื™ื•ื›ืœ ืœื”ื™ื›ื ืก ืœ-OpenStack ื•ืœื ื”ืœ ืืช ื”ืžืฉืื‘ื™ื ืฉืœื•. ื”ืžื•ื“ื•ืœ ืคืฉื•ื˜ ื•ืžื ื”ืœ ืจืง ืฉืœื•ืฉ ื™ืฉื•ื™ื•ืช:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

ื™ืฆื™ืจืช ืฉืจืช ื•ื™ืจื˜ื•ืืœื™ ืขื ื“ื™ืกืง ืžืงื•ืžื™

ื”ืžื•ื“ื•ืœ ื”ืฉื ื™ ืขื•ืกืง ื‘ื ื™ื”ื•ืœ ืื•ื‘ื™ื™ืงื˜ื™ OpenStack, ื”ื ื—ื•ืฆื™ื ืœื™ืฆื™ืจืช ืฉืจืช ืขื ื“ื™ืกืง ืžืงื•ืžื™.

ื›ื“ืื™ ืœืฉื™ื ืœื‘ ืœื›ืžื” ืžื”ื˜ื™ืขื•ื ื™ื ื”ืžืฆื•ื™ื ื™ื ื‘ืžื•ื“ื•ืœ ื–ื” ืขื‘ื•ืจ ื”ืžืฉืื‘ openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

ื˜ื™ืขื•ืŸ ืœื”ืชืขืœื_ืžืฉื™ื ื•ื™ื™ื ืžืืคืฉืจ ืœืš ืœื”ืชืขืœื ืžืฉื™ื ื•ื™ื™ื ื‘ืชื›ื•ื ื•ืช id ืขื‘ื•ืจ ื”ืชืžื•ื ื” ื”ืžืฉืžืฉืช ืœื™ืฆื™ืจืช ื”ืžื›ื•ื ื” ื”ื•ื™ืจื˜ื•ืืœื™ืช. ื‘ืฉื™ืจื•ืช VPC, ืจื•ื‘ ื”ืชืžื•ื ื•ืช ื”ืฆื™ื‘ื•ืจื™ื•ืช ืžืชืขื“ื›ื ื•ืช ืื•ื˜ื•ืžื˜ื™ืช ืคืขื ื‘ืฉื‘ื•ืข ื•ื‘ืžืงื‘ื™ืœ ืฉืœื”ืŸ id ื’ื ืžืฉืชื ื”. ื–ื” ื ื•ื‘ืข ืžื”ืžื•ื–ืจื•ื™ื•ืช ืฉืœ ืจื›ื™ื‘ OpenStack - Glance, ืฉื‘ื• ืชืžื•ื ื•ืช ื ื—ืฉื‘ื•ืช ืœื™ืฉื•ื™ื•ืช ื‘ืœืชื™ ื ื™ืชื ื•ืช ืœืฉื™ื ื•ื™.

ืื ืืชื” ื™ื•ืฆืจ ืื• ืžืฉื ื” ืฉืจืช ืื• ื“ื™ืกืง ืงื™ื™ื ืฉื™ืฉ ืœื• ื›ืืจื’ื•ืžื ื˜ image_id ืžืฉืžืฉ id ืชืžื•ื ื” ืฆื™ื‘ื•ืจื™ืช, ื•ืœืื—ืจ ืžื›ืŸ ืœืื—ืจ ืขื“ื›ื•ืŸ ื”ืชืžื•ื ื”, ื”ืคืขืœืช ื”ืžื ื™ืคืกื˜ ืฉืœ Terraform ืฉื•ื‘ ืชื™ืฆื•ืจ ืžื—ื“ืฉ ืืช ื”ืฉืจืช ืื• ื”ื“ื™ืกืง. ืฉื™ืžื•ืฉ ื‘ื˜ื™ืขื•ืŸ ืœื”ืชืขืœื_ืžืฉื™ื ื•ื™ื™ื ืžืืคืฉืจ ืœืš ืœื”ื™ืžื ืข ืžืžืฆื‘ ื›ื–ื”.

ื”ืขืจื”: ื˜ื™ืขื•ืŸ ืœื”ืชืขืœื_ืžืฉื™ื ื•ื™ื™ื ื”ื•ืคื™ืข ื‘- Terraform ื“ื™ ืžื–ืžืŸ: pull#2525.

ื˜ื™ืขื•ืŸ ignore_resize_confirmation ื ื“ืจืฉ ื›ื“ื™ ืœืฉื ื•ืช ื‘ื”ืฆืœื—ื” ืืช ื’ื•ื“ืœ ื”ื“ื™ืกืง ื”ืžืงื•ืžื™, ื”ืœื™ื‘ื•ืช ืื• ื–ื™ื›ืจื•ืŸ ื”ืฉืจืช. ืฉื™ื ื•ื™ื™ื ื›ืืœื” ืžื‘ื•ืฆืขื™ื ื‘ืืžืฆืขื•ืช ืจื›ื™ื‘ OpenStack Nova ื‘ืืžืฆืขื•ืช ื‘ืงืฉื” ืœืฉื ื•ืช ืืช ื”ื’ื•ื“ืœ. ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ Nova ืœืื—ืจ ื‘ืงืฉื” ืœืฉื ื•ืช ืืช ื”ื’ื•ื“ืœ ืžื›ื ื™ืก ืืช ื”ืฉืจืช ืœืžืฆื‘ verify_resize ื•ืžื—ื›ื” ืœืื™ืฉื•ืจ ื ื•ืกืฃ ืžื”ืžืฉืชืžืฉ. ืขื ื–ืืช, ื ื™ืชืŸ ืœืฉื ื•ืช ื”ืชื ื”ื’ื•ืช ื–ื• ื›ืš ืฉื ื•ื‘ื” ืœื ืชื—ื›ื” ืœืคืขื•ืœื•ืช ื ื•ืกืคื•ืช ืžื”ืžืฉืชืžืฉ.

ื”ืืจื’ื•ืžื ื˜ ืฉืฆื•ื™ืŸ ืžืืคืฉืจ ืœ- Terraform ืœื ืœื—ื›ื•ืช ืœืกื˜ื˜ื•ืก verify_resize ืœืฉืจืช ื•ืœื”ื™ื•ืช ืžื•ื›ื ื™ื ืœื›ืš ืฉื”ืฉืจืช ื™ื”ื™ื” ื‘ืžืฆื‘ ืคืขื™ืœ ืœืื—ืจ ืฉื™ื ื•ื™ ื”ืคืจืžื˜ืจื™ื ืฉืœื•. ื”ืืจื’ื•ืžื ื˜ ื–ืžื™ืŸ ืžื’ืจืกื” 1.10.0 ืฉืœ ืกืคืง OpenStack Terraform: pull#422.

ื™ืฆื™ืจืช ืžืฉืื‘ื™ื

ืœืคื ื™ ื”ืคืขืœืช ื”ืžื ื™ืคืกื˜ื™ื, ืฉื™ืžื• ืœื‘ ืฉื‘ื“ื•ื’ืžื” ืฉืœื ื• ืžื•ืคืขืœื™ื ืฉื ื™ ืกืคืงื™ื ืฉื•ื ื™ื, ื•ืกืคืง ื”-OpenStack ืชืœื•ื™ ื‘ืžืฉืื‘ื™ื ืฉืœ ืกืคืง ื”-Selectel, ืฉื›ืŸ ืœืœื ื™ืฆื™ืจืช ืžืฉืชืžืฉ ื‘ืคืจื•ื™ืงื˜, ืื™ ืืคืฉืจ ืœื ื”ืœ ืืช ื”ืื•ื‘ื™ื™ืงื˜ื™ื ื”ืฉื™ื™ื›ื™ื ืœื•. . ืœืžืจื‘ื” ื”ืฆืขืจ, ืžืื•ืชื” ืกื™ื‘ื” ืื ื—ื ื• ืœื ื™ื›ื•ืœื™ื ืคืฉื•ื˜ ืœื”ืจื™ืฅ ืืช ื”ืคืงื•ื“ื” ืœื”ื—ื™ืœ terraform ื‘ืชื•ืš ื”ื“ื•ื’ืžื” ืฉืœื ื•. ืงื•ื“ื ื›ืœ ืื ื—ื ื• ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ืœื”ื’ื™ืฉ ืžื•ืขืžื“ื•ืช ืขื‘ื•ืจ ืžื•ื“ื•ืœ ืคืจื•ื™ืงื˜_ืขื_ืžืฉืชืžืฉ ื•ืื—ืจื™ ื–ื” ืœื›ืœ ื”ืฉืืจ.

ื”ืขืจื”: ื‘ืขื™ื” ื–ื• ืขื“ื™ื™ืŸ ืœื ื ืคืชืจื” ื‘- Terraform, ืืชื” ื™ื›ื•ืœ ืœืขืงื•ื‘ ืื—ืจ ื”ื“ื™ื•ืŸ ื‘- Github ื‘ื›ืชื•ื‘ืช ืกื•ื’ื™ื” ืžืก' 2430 ะธ ืกื•ื’ื™ื” ืžืก' 4149.

ื›ื“ื™ ืœื™ืฆื•ืจ ืžืฉืื‘ื™ื, ืขื‘ื•ืจ ืืœ ื”ืกืคืจื™ื™ื” terraform-examples/examples/vpc/server_local_root_disk, ื”ืชื•ื›ืŸ ืฉืœื• ืฆืจื™ืš ืœื”ื™ื•ืช ื›ืš:

$ ls
README.md	   main.tf		vars.tf

ืื ื• ืžืืชื—ืœื™ื ืืช ื”ืžื•ื“ื•ืœื™ื ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื”:

$ terraform init

ื”ืคืœื˜ ืžืจืื” ืฉ- Terraform ืžื•ืจื™ื“ ืืช ื”ื’ืจืกืื•ืช ื”ืขื“ื›ื ื™ื•ืช ื‘ื™ื•ืชืจ ืฉืœ ื”ืกืคืงื™ื ืฉื‘ื”ื ื”ื•ื ืžืฉืชืžืฉ ื•ื‘ื•ื“ืง ืืช ื›ืœ ื”ืžื•ื“ื•ืœื™ื ื”ืžืชื•ืืจื™ื ื‘ื“ื•ื’ืžื”.

ืจืืฉื™ืช ื‘ื•ืื• ื ื™ื™ืฉื ืืช ื”ืžื•ื“ื•ืœ ืคืจื•ื™ืงื˜_ืขื_ืžืฉืชืžืฉ. ื–ื” ื“ื•ืจืฉ ื”ืขื‘ืจืช ืขืจื›ื™ื ื™ื“ื ื™ืช ืขื‘ื•ืจ ืžืฉืชื ื™ื ืฉืœื ื”ื•ื’ื“ืจื•:

  • sel_account ืขื ืžืกืคืจ ื—ืฉื‘ื•ืŸ Selectel ืฉืœืš;
  • sel_token ืขื ื”ืžืคืชื— ืฉืœืš ืขื‘ื•ืจ Selectel API;
  • ืกื™ืกืžืช ืžืฉืชืžืฉ ืขื ืกื™ืกืžื” ืขื‘ื•ืจ ืžืฉืชืžืฉ OpenStack.

ื™ืฉ ืœืงื—ืช ืืช ื”ืขืจื›ื™ื ืขื‘ื•ืจ ืฉื ื™ ื”ืžืฉืชื ื™ื ื”ืจืืฉื•ื ื™ื ืœื•ื—ื•ืช ื‘ืงืจื”.

ืขื‘ื•ืจ ื”ืžืฉืชื ื” ื”ืื—ืจื•ืŸ, ืืชื” ื™ื›ื•ืœ ืœื”ืžืฆื™ื ื›ืœ ืกื™ืกืžื”.

ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืžื•ื“ื•ืœ ืขืœื™ืš ืœื”ื—ืœื™ืฃ ืืช ื”ืขืจื›ื™ื SEL_ACCOUNT, SEL_TOKEN ะธ ืกื™ืกืžืช ืžืฉืชืžืฉ ื”ืคืขืœืช ื”ืคืงื•ื“ื”:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

ืœืื—ืจ ื”ืคืขืœืช ื”ืคืงื•ื“ื”, Terraform ื™ืจืื” ืื™ืœื• ืžืฉืื‘ื™ื ื”ื™ื ืจื•ืฆื” ืœื™ืฆื•ืจ ื•ื™ื‘ืงืฉ ืื™ืฉื•ืจ:

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

ืœืื—ืจ ื™ืฆื™ืจืช ื”ืคืจื•ื™ืงื˜, ื”ืžืฉืชืžืฉ ื•ื”ืชืคืงื™ื“, ืชื•ื›ืœ ืœื”ืชื—ื™ืœ ืœื™ืฆื•ืจ ืืช ื”ืžืฉืื‘ื™ื ื”ื ื•ืชืจื™ื:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

ื‘ืขืช ื™ืฆื™ืจืช ืžืฉืื‘ื™ื, ืฉื™ืžื• ืœื‘ ืœืคืœื˜ Terraform ืขื ื›ืชื•ื‘ืช ื”-IP ื”ื—ื™ืฆื•ื ื™ืช ืฉื‘ื” ื”ืฉืจืช ืฉื ื•ืฆืจ ื™ื”ื™ื” ื ื’ื™ืฉ:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

ืืชื” ื™ื›ื•ืœ ืœืขื‘ื•ื“ ืขื ื”ืžื—ืฉื‘ ื”ื•ื™ืจื˜ื•ืืœื™ ืฉื ื•ืฆืจ ื‘ืืžืฆืขื•ืช SSH ื‘ืืžืฆืขื•ืช ื”-IP ืฉืฆื•ื™ืŸ.

ืขืจื™ื›ืช ืžืฉืื‘ื™ื

ื‘ื ื•ืกืฃ ืœื™ืฆื™ืจืช ืžืฉืื‘ื™ื ื‘ืืžืฆืขื•ืช Terraform, ื ื™ืชืŸ ื’ื ืœืฉื ื•ืช ืื•ืชื.

ืœื“ื•ื’ืžื”, ื‘ื•ืื• ื ื’ื“ื™ืœ ืืช ืžืกืคืจ ื”ืœื™ื‘ื•ืช ื•ื”ื–ื™ื›ืจื•ืŸ ืขื‘ื•ืจ ื”ืฉืจืช ืฉืœื ื• ืขืœ ื™ื“ื™ ืฉื™ื ื•ื™ ื”ืขืจื›ื™ื ืฉืœ ื”ืคืจืžื˜ืจื™ื server_vcpus ะธ server_ram_mb ื‘ืงื•ื‘ืฅ examples/vpc/server_local_root_disk/main.tf:

-  server_vcpus        = "${var.server_vcpus}"
-  server_ram_mb       = "${var.server_ram_mb}"
+  server_vcpus        = 8
+  server_ram_mb       = 10240

ืœืื—ืจ ืžื›ืŸ, ืื ื• ื‘ื•ื“ืงื™ื ืœืื™ืœื• ืฉื™ื ื•ื™ื™ื ื–ื” ื™ื•ื‘ื™ืœ ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” ื”ื‘ืื”:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform plan

ื›ืชื•ืฆืื” ืžื›ืš, Terraform ื‘ื™ืฆืขื” ืฉื™ื ื•ื™ ืžืฉืื‘ openstack_compute_instance_v2 ะธ openstack_compute_flavor_v2.

ืฉื™ื ืœื‘ ืฉื–ื” ื™ื—ื™ื™ื‘ ืืชื—ื•ืœ ืžื—ื“ืฉ ืฉืœ ื”ืžื—ืฉื‘ ื”ื•ื™ืจื˜ื•ืืœื™ ืฉื ื•ืฆืจ.

ื›ื“ื™ ืœื”ื—ื™ืœ ืืช ืชืฆื•ืจืช ื”ืžื—ืฉื‘ ื”ื•ื•ื™ืจื˜ื•ืืœื™ ื”ื—ื“ืฉื”, ื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” ืœื”ื—ื™ืœ terraform, ืฉื›ื‘ืจ ื”ืฉืงื ื• ืงื•ื“ื ืœื›ืŸ.

ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ืฉื ื•ืฆืจื• ื™ื•ืฆื’ื• ื‘ ืœื•ื—ื•ืช ื‘ืงืจื” ืฉืœ VPC:

ืกืคืงื™ืช Terraform Selectel

ืฉืœื ื• ืžืื’ืจื™ื ืœื“ื•ื’ืžื” ืืชื” ื™ื›ื•ืœ ื’ื ืœืจืื•ืช ืžื ื™ืคืกื˜ื™ื ืœื™ืฆื™ืจืช ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ืขื ื›ื•ื ื ื™ ืจืฉืช.

ื“ื•ื’ืžื” ืœื™ืฆื™ืจืช ืืฉื›ื•ืœ Kubernetes

ืœืคื ื™ ืฉื ืขื‘ื•ืจ ืœื“ื•ื’ืžื ื”ื‘ืื”, ื ื ืงื” ืืช ื”ืžืฉืื‘ื™ื ืฉื™ืฆืจื ื• ืงื•ื“ื ืœื›ืŸ. ืœืขืฉื•ืช ื–ืืช ื‘ืฉื•ืจืฉ ื”ืคืจื•ื™ืงื˜ terraform-examples/examples/vpc/server_local_root_disk ื‘ื•ืื• ื ืจื™ืฅ ืืช ื”ืคืงื•ื“ื” ืœืžื—ื™ืงืช ืื•ื‘ื™ื™ืงื˜ื™ OpenStack:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.server_local_root_disk

ืœืื—ืจ ืžื›ืŸ ื”ืคืขืœ ืืช ื”ืคืงื•ื“ื” ื›ื“ื™ ืœื ืงื•ืช ืื•ื‘ื™ื™ืงื˜ื™ื ืฉืœ Selectel VPC API:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.project_with_user

ื‘ืฉื ื™ ื”ืžืงืจื™ื, ื™ื”ื™ื” ืขืœื™ืš ืœืืฉืจ ืืช ื”ืžื—ื™ืงื” ืฉืœ ื›ืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื:

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

ื”ื“ื•ื’ืžื” ื”ื‘ืื” ื ืžืฆืืช ื‘ืกืคืจื™ื™ื” terraform-examples/examples/vpc/kubernetes_cluster.

ื“ื•ื’ืžื” ื–ื• ื™ื•ืฆืจืช ืคืจื•ื™ืงื˜, ืžืฉืชืžืฉ ื‘ืขืœ ืชืคืงื™ื“ ื‘ืคืจื•ื™ืงื˜, ื•ืžืขืœื” ืืฉื›ื•ืœ Kubernetes ืื—ื“. ื‘ืงื•ื‘ืฅ vars.tf ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ, ื›ื’ื•ืŸ ืžืกืคืจ ื”ืฆืžืชื™ื, ื”ืžืืคื™ื™ื ื™ื ืฉืœื”ื, ื’ืจืกืช Kubernetes ื•ื›ื•'.

ื›ื“ื™ ืœื™ืฆื•ืจ ืžืฉืื‘ื™ื ื“ื•ืžื™ื ืœื“ื•ื’ืžื ื”ืจืืฉื•ื ื”, ืงื•ื“ื ื›ืœ ื ืชื—ื™ืœ ืœืืชื—ืœ ืžื•ื“ื•ืœื™ื ื•ืœื™ืฆื•ืจ ืžืฉืื‘ื™ ืžื•ื“ื•ืœ ืคืจื•ื™ืงื˜_ืขื_ืžืฉืชืžืฉื•ืื– ืœื™ืฆื•ืจ ืืช ื›ืœ ื”ืฉืืจ:

$ terraform init

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

ื ืขื‘ื™ืจ ืืช ื”ื™ืฆื™ืจื” ื•ื”ื ื™ื”ื•ืœ ืฉืœ ืืฉื›ื•ืœื•ืช Kubernetes ื“ืจืš ืจื›ื™ื‘ OpenStack Magnum. ืืชื” ื™ื›ื•ืœ ืœื’ืœื•ืช ืขื•ื“ ืขืœ ืื™ืš ืœืขื‘ื•ื“ ืขื ืืฉื›ื•ืœ ื‘ืื—ื“ ืฉืœื ื• ืžืืžืจื™ื ืงื•ื“ืžื™ื, ื›ืžื• ื’ื ื‘ ื‘ืกื™ืก ื™ื“ืข.

ื‘ืขืช ื”ื›ื ืช ื”ืืฉื›ื•ืœ, ื™ื•ื•ืฆืจื• ื“ื™ืกืงื™ื ื•ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื•ื›ืœ ื”ืจื›ื™ื‘ื™ื ื”ื“ืจื•ืฉื™ื ื™ื•ืชืงื ื•. ื”ื”ื›ื ื” ืื•ืจื›ืช ื›-4 ื“ืงื•ืช, ื•ื‘ืžื”ืœื›ืŸ Terraform ื™ืฆื™ื’ ื”ื•ื“ืขื•ืช ื›ืžื•:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

ืœืื—ืจ ื”ืฉืœืžืช ื”ื”ืชืงื ื”, Terraform ื™ืฆื™ื™ืŸ ืฉื”ืืฉื›ื•ืœ ืžื•ื›ืŸ ื•ื™ืฆื™ื’ ืืช ื”ืžื–ื”ื” ืฉืœื•:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

ื›ื“ื™ ืœื ื”ืœ ืืช ืืฉื›ื•ืœ Kubernetes ืฉื ื•ืฆืจ ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช ืงื•ื‘ืงื˜ืœ ืืชื” ืฆืจื™ืš ืœื”ืฉื™ื’ ืืช ืงื•ื‘ืฅ ื”ื’ื™ืฉื” ืœืืฉื›ื•ืœ. ืœืฉื ื›ืš, ืขื‘ื•ืจ ืืœ ื”ืคืจื•ื™ืงื˜ ืฉื ื•ืฆืจ ื‘ืืžืฆืขื•ืช Terraform ื‘ืจืฉื™ืžืช ื”ืคืจื•ื™ืงื˜ื™ื ื‘ื—ืฉื‘ื•ื ืš:

ืกืคืงื™ืช Terraform Selectel

ืœืื—ืจ ืžื›ืŸ, ืขืงื•ื‘ ืื—ืจ ื”ืงื™ืฉื•ืจ ื›ืžื• xxxxxx.selvpc.ruื”ืžื•ืคื™ืข ืžืชื—ืช ืœืฉื ื”ืคืจื•ื™ืงื˜:

ืกืคืงื™ืช Terraform Selectel

ืœืคืจื˜ื™ ื”ืชื—ื‘ืจื•ืช, ื”ืฉืชืžืฉ ื‘ืฉื ื”ืžืฉืชืžืฉ ื•ื”ืกื™ืกืžื” ืฉื™ืฆืจืช ื“ืจืš Terraform. ืื ืœื ื‘ื’ื“ืชื vars.tf ืื• main.tf ืขื‘ื•ืจ ื”ื“ื•ื’ืžื” ืฉืœื ื•, ืœืžืฉืชืžืฉ ื™ื”ื™ื” ื”ืฉื tf_user. ืขืœื™ืš ืœื”ืฉืชืžืฉ ื‘ืขืจืš ื”ืžืฉืชื ื” ื›ืกื™ืกืžื” TF_VAR_user_password, ืืฉืจ ืฆื•ื™ืŸ ื‘ืขืช โ€‹โ€‹ื”ื”ืคืขืœื” ืœื”ื—ื™ืœ terraform ืงื•ื“ื ืœื›ืŸ.

ื‘ืชื•ืš ื”ืคืจื•ื™ืงื˜ ืืชื” ืฆืจื™ืš ืœืขื‘ื•ืจ ืœืœืฉื•ื ื™ืช ืงื•ื‘ืจื ื˜:

ืกืคืงื™ืช Terraform Selectel

ื–ื” ื”ืžืงื•ื ืฉื‘ื• ื ืžืฆื ื”ืืฉื›ื•ืœ ืฉื ื•ืฆืจ ื‘ืืžืฆืขื•ืช Terraform. ื”ื•ืจื“ ืงื•ื‘ืฅ ืขื‘ื•ืจ ืงื•ื‘ืงื˜ืœ ืืชื” ื™ื›ื•ืœ ื‘ื›ืจื˜ื™ืกื™ื™ื” "ื’ื™ืฉื”":

ืกืคืงื™ืช Terraform Selectel

ื”ื•ืจืื•ืช ื”ืชืงื ื” ืžืžื•ืงืžื•ืช ื‘ืื•ืชื” ื›ืจื˜ื™ืกื™ื™ื”. ืงื•ื‘ืงื˜ืœ ื•ืฉื™ืžื•ืฉ ื‘ื”ื•ืจื“ื” config.yaml.

ืœืื—ืจ ื”ื”ืฉืงื” ืงื•ื‘ืงื˜ืœ ื•ื”ื’ื“ืจืช ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” KUBECONFIG ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘-Kubernetes:

$ kubectl get pods --all-namespaces

NAMESPACE        NAME                                    READY  STATUS  RESTARTS AGE
kube-system   coredns-9578f5c87-g6bjf                      1/1   Running   0 8m
kube-system   coredns-9578f5c87-rvkgd                     1/1   Running   0 6m
kube-system   heapster-866fcbc879-b6998                 1/1   Running   0 8m
kube-system   kube-dns-autoscaler-689688988f-8cxhf             1/1   Running   0 8m
kube-system   kubernetes-dashboard-7bdb5d4cd7-jcjq9          1/1   Running   0 8m
kube-system   monitoring-grafana-84c97bb64d-tc64b               1/1   Running   0 8m
kube-system   monitoring-influxdb-7c8ccc75c6-dzk5f                1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1   Running   0 8m
kube-system   openstack-cloud-controller-manager-8vrmp        1/1   Running   3 8m
prometeus-monitoring   grafana-76bcb7ffb8-4tm7t       1/1   Running   0 8m
prometeus-monitoring   prometheus-75cdd77c5c-w29gb           1/1   Running   0 8m

ื ื™ืชืŸ ืœืฉื ื•ืช ื‘ืงืœื•ืช ืืช ืžืกืคืจ ืฆืžืชื™ ื”ืืฉื›ื•ืœ ื‘ืืžืฆืขื•ืช Terraform.
ื‘ืงื•ื‘ืฅ main.tf ื”ืขืจืš ื”ื‘ื ืžืฆื•ื™ืŸ:

cluster_node_count = "${var.cluster_node_count}"

ืขืจืš ื–ื” ืžื•ื—ืœืฃ ืž vars.tf:

variable "cluster_node_count" {
default = 2
}

ืืชื” ื™ื›ื•ืœ ืœืฉื ื•ืช ืืช ืขืจืš ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื‘ vars.tf, ืื• ืฆื™ื™ืŸ ืืช ื”ืขืจืš ื”ื ื“ืจืฉ ื™ืฉื™ืจื•ืช ื‘ main.tf:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

ื›ื“ื™ ืœื”ื—ื™ืœ ืืช ื”ืฉื™ื ื•ื™ื™ื, ื›ืžื• ื‘ืžืงืจื” ืฉืœ ื”ื“ื•ื’ืžื” ื”ืจืืฉื•ื ื”, ื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” ืœื”ื—ื™ืœ terraform:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

ื›ืืฉืจ ืžืกืคืจ ื”ืฆืžืชื™ื ืžืฉืชื ื”, ื”ืืฉื›ื•ืœ ื™ื™ืฉืืจ ื–ืžื™ืŸ. ืœืื—ืจ ื”ื•ืกืคืช ืฆื•ืžืช ื“ืจืš Terraform, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ื• ืœืœื ืชืฆื•ืจื” ื ื•ืกืคืช:

$ kubectl get nodes
NAME                               STATUS                     ROLES     AGE   VERSION
tf-cluster-rz6nggvs4va7-master-0   Ready,SchedulingDisabled   master    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-0   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-1   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-2   Ready                      <none>    3m    v1.12.4

ืžืกืงื ื”

ื‘ืžืืžืจ ื–ื” ื”ื›ืจื ื• ืืช ื”ื“ืจื›ื™ื ื”ืขื™ืงืจื™ื•ืช ืœืขื‘ื•ื“ ืื™ืชืŸ "ืขื ืŸ ืคืจื˜ื™ ื•ื™ืจื˜ื•ืืœื™" ื“ืจืš Terraform. ื ืฉืžื— ืื ืชืฉืชืžืฉ ื‘ืกืคืง ื”ืจืฉืžื™ ืฉืœ Terraform Selectel ื•ืชืกืคืง ืžืฉื•ื‘.

ื ื™ืชืŸ ืœื“ื•ื•ื— ืขืœ ื›ืœ ื‘ืื’ ืฉื ืžืฆื ื‘ืกืคืง ืฉืœ Selectel Terraform ื‘ืืžืฆืขื•ืช ื‘ืขื™ื•ืช Github.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”