티스토리 뷰

Cloud/Private Cloud

Terraform OpenStack Provider

jacobbaek Jacob_baek 2020. 11. 4. 19:12

Terraform OpenStack Provider를 활용한 resource(instance 부터 network, volume 등)을 코드 기반으로 생성하고 삭제하는 방법에 대하여 알아보도록 하겠습니다.

terraform을 써보신 분이라면 쉽게 이해하실수 있는 구조로 생성이 되어집니다.

  1. provider 정의
  2. VM 생성을 위한 resource 들 생성 혹은 가져오기
  3. 가져온 ID 혹은 name을 통해 VM 생성 작업 수행
  4. 부가적으로 VM에 연결할 추가 resource 연결

OpenStack Provider는 terraform 작성시 두가지 방식을 사용할수 있다.
(다른 provider도 동일한 형태이기는 하다.)

  • resources
  • datasources

간단하게 분류하면 resources는 신규로 생성하여 해당 resource를 사용하는 방식이고 datasources는 이미 생성되어 있는 resource를 가져와 사용하는 것이다.

OpenStack provider의 경우 API Version에 따른 사용이 차이를 두고 있다.
하여 구성된 OpenStack에서 지원하는 API 버전을 OpenStack Horizon에 접근하여 사전에 확인해 놓는것을 추천한다.
아래와 같이 접근하여 구성된 버전에서 제공하고 있는 API version을 확인할 수 있다.

참고로 최신의 OpenStack에서 현재 지원되고 있는 api version list를 확인할 수 있다.

만약 각 component들의 api url에 접근이 안되는 환경이라면 접근이 가능하도록 domain lookup
아래는 kubernetes 기반의 openstack 이 구성된 환경에서 ingress로 접근가능한 주소이며 이를 host에 추가하여 연결 할수 있도록 하였다.

192.168.0.1   keystone.openstack.svc.cluster.local
192.168.0.1   nova.openstack.svc.cluster.local
192.168.0.1   neutron.openstack.svc.cluster.local
192.168.0.1   cinder.openstack.svc.cluster.local
192.168.0.1   glance.openstack.svc.cluster.local
192.168.0.1   placement.openstack.svc.cluster.local

OpenStack Prpvider를 이용한 OpenStack Resource 생성 및 삭제

provider 설정

provider는 기본정보를 직접 입력하여 사용할수 있다.
아래는 직접 입력한 provider 정보이다.

jacob@jacob-laptop:~/workspace/tf-jacob/tf-openstack$ cat 0-proivder.tf 
provider "openstack" {
  tenant   = ""
  username = "admin"
  password = "password"
  auth_url = "http://keystone.openstack.svc.cluster.local:80/v3"
  region   = "default"
}

혹은 horizon을 통해 다운로드 가능한 openstack.rc 파일을 다운로드 받아 해당 파일을 그대로 load 하도록 할 수 있다.

provider "openstack" { cloud = "openstack-cloud" }

이후 terraform init을 수행해보면 다음과 같은 plugin이 다운로드 되었음을 확인할 수 있다.

jacob@jacob-laptop:~/workspace/tf-jacob/tf-openstack$ ls -al .terraform/plugins/linux_amd64/
total 29040
drwxr-xr-x 2 jacob jacob     4096 11월  2 13:23 .
drwxr-xr-x 3 jacob jacob     4096 11월  2 13:23 ..
-rw-r--r-- 1 jacob jacob    75751 11월  2 13:23 CHANGELOG.md
-rw-r--r-- 1 jacob jacob    16725 11월  2 13:23 LICENSE
-rwxrwxr-x 1 jacob jacob       85 11월  2 13:23 lock.json
-rw-r--r-- 1 jacob jacob     3101 11월  2 13:23 README.md
-rwxr-xr-x 1 jacob jacob 29622272 11월  2 13:23 terraform-provider-openstack_v1.32.0

Network 및 기타 자원 생성 및 사용

Network 생성 혹은 가져오기

resource "openstack_networking_network_v2" "network_1" {
  name           = "jacob-network"
  admin_state_up = "true"
}

resource "openstack_networking_subnet_v2" "subnet_1" {
  name       = "jacob-subnet"
  network_id = openstack_networking_network_v2.network_1.id
  cidr       = "10.90.90.0/24"
  ip_version = 4
}

# 혹은 아래처럼 가져오기

data "openstack_networking_network_v2" "network_2" {
  name       = var.nat_network
}

floating IP 생성

지정된 pool로부터 생성

resource "openstack_networking_floatingip_v2" "fip_1" {
  pool = var.public_network
}

security group 생성

resource "openstack_networking_secgroup_v2" "secgroup_1" {
  name        = "secgroup_1"
  description = "My neutron security group"
}

resource "openstack_networking_secgroup_rule_v2" "secgroup_rule_1" {
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 22
  port_range_max    = 22
  remote_ip_prefix  = "0.0.0.0/0"
  security_group_id = openstack_networking_secgroup_v2.secgroup_1.id
}

image 가져오기

data "openstack_images_image_v2" "image" {
  name        = "centos8"
  most_recent = true
}

flavor 생성 혹은 가져오기

resource "openstack_compute_flavor_v2" "flavor_1" {
  name  = "m1.middle_jacob"
  ram   = "4096"
  vcpus = "2"
  disk  = "30"
}
# 혹은 아래처럼 가져오기
data "openstack_compute_flavor_v2" "flavor" {
  name = "m1.small"
}

public ssh key 생성

data "local_file" "pubkey" {
    filename = "${path.module}/pubkey"
}

resource "openstack_compute_keypair_v2" "jacob-test-cloud-key_1" {
  name       = "jacob-test-key"
  public_key = data.local_file.pubkey.content
}

instance 생성 및 각종 연결

instance 생성

앞서 생성한 혹은 가져온 resource 들을 기반으로 instance를 생성한다.

resource "openstack_compute_instance_v2" "testvm" {
  name            = "test-vm"
  image_name      = data.openstack_images_image_v2.image.name
  flavor_name     = data.openstack_compute_flavor_v2.flavor.name
  key_pair        = openstack_compute_keypair_v2.jacob-test-cloud-key_1.name
  security_groups = ["default", openstack_networking_secgroup_v2.secgroup_1.name]

  network {
    name = data.openstack_networking_network_v2.network_2.name
  }

  network {
    name = openstack_networking_network_v2.network_1.name
  }

  depends_on = [ openstack_networking_subnet_v2.subnet_1, ]
}

위와 같이 다수의 network를 추가할수도 있다.

물론 고정IP를 가질수 있도록 설정할 수도 있다.
고정 IP를 사용하고자 할 경우 다음과 같은 방식으로 port를 사전에 생성하고

# ===== Fixed IP =====
resource "openstack_networking_port_v2" "port-sub1" {
  name           = "port_1"
  network_id     = openstack_networking_network_v2.jacobbaek-network.id
  admin_state_up = "true"

  fixed_ip {
    subnet_id = openstack_networking_subnet_v2.subnet_1.id
    ip_address = "11.11.11.50"
  }
}

생성한 port를 instance 생성하는 과정에서 추가하면 된다.

resource "openstack_compute_instance_v2" "testvm" {
  name            = "jacobbaek-testvm"
  ...
  network {
    name = openstack_networking_network_v2.jacobbaek-network.name
    port = openstack_networking_port_v2.port-sub1.id
  }

또한 아래와 같이 interface를 추가할수도 있다.
(아래의 방법은 사전에 port생성없이 지정된 network에서 fixedIP를 추가한다.)

resource "openstack_compute_interface_attach_v2" "interface_1" {
  instance_id = openstack_compute_instance_v2.testvm.id
  network_id  = openstack_networking_network_v2.jacobbaek-network.id
  fixed_ip    = "22.22.22.50"
}

참고로
depends_on의 경우 subnet 생성이 안되었는데 instance가 생성을 요청하면서 꼬이는 경우가 발생되었어서 방지차원에서 넣어두었다.

floating IP 연결

resource "openstack_compute_floatingip_associate_v2" "extip" {
  floating_ip = openstack_networking_floatingip_v2.fip_1.address
  instance_id = openstack_compute_instance_v2.testvm.id
  fixed_ip    = openstack_compute_instance_v2.testvm.network.0.fixed_ip_v4
}

여기서 fixed_ip는 provider network(external_network)을 통해 외부로 연결 가능한 네트워크이다.
즉, vrouter에 등록된 network이라 보면 된다.

Octavia 사용

Octavia 환경은 아직 구성을 하지 못해 테스트가 이루어지지는 않았다.

관련 terraform script는 아래 github 주소에 있으니 참고바란다.

참고사이트

'Cloud > Private Cloud' 카테고리의 다른 글

prometheus alertmanager workflow  (0) 2020.12.28
Jenkins pipeline for Terraform OpenStack  (0) 2020.11.04
Terraform OpenStack Provider  (0) 2020.11.04
access another Openstack VM using cirros image  (0) 2020.09.23
openstack cli  (0) 2020.09.23
How to use clouds.yaml at OpenStack  (0) 2020.09.10
댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
53,893
Today
15
Yesterday
85
링크
«   2021/01   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
글 보관함